随笔分类 -  Windows Kernel-Mode

Request的取消
摘要:什么时候需要取消? 如果驱动调用者(caller)向驱动程序发送Request,需要从硬件读取数据,而读取完成不是一个同步操作时,那么该Request必须是可以被取消的。比如数据传输完成以中断方式通知时。 取消流程 Request Handlers调用WdfRequestMarkCancelableor WdfRequestMarkCancelableEx注册一个取消例程,该例程将在IRQL:... 阅读全文

posted @ 2010-09-20 20:52 devcfei 阅读(838) 评论(0) 推荐(0)

今天发现CsqAcquireLock内调用KdPrint,发生Bug Check 0xEA: THREAD_STUCK_IN_DEVICE_DRIVER
摘要:IO_CSQ_ACQUIRE_LOCK CsqAcquireLock; VOID CsqAcquireLock(     __in PIO_CSQ  Csq,      __out PKIRQL  Irql )   {...} The THREAD_STUCK_IN_DEVICE_DRIVER bu... 阅读全文

posted @ 2010-05-20 20:18 devcfei 阅读(1809) 评论(0) 推荐(0)

需要编写总线驱动程序?
摘要:通常,一个设备有多路数据流。而ReadFile,WriteFile又只针对一个句柄。这就出现一个矛盾,这有几个解决方案 多个设备对象 编写总线驱动 设备对象命名空间 虽然我没有找到WDK中推荐的做法,但在WHDC上,微软给出了推荐的做法。下面简单介绍一下吧。 首先IoRegisterDeviceInterface接受一个ReferenceString,我们可以给一个字符串“ch0”。这样,设备接... 阅读全文

posted @ 2010-04-28 23:28 devcfei 阅读(366) 评论(0) 推荐(0)

总线主控DMA(续)
摘要:上一次分析了DMA两种方式,基于包的DMA方式和CommonBuffer方式。 最近看文档和资料,其实CommonBuffer是可以直接让应用程序访问的,具体的资料在 DDK文档的Using Common-Buffer System DMA这一节 实际的过程是这样的 AllocateCommonBu 阅读全文

posted @ 2009-09-14 20:37 devcfei 阅读(1021) 评论(3) 推荐(0)

总线主控DMA
摘要:DMA都是主控总线的,这里的总线主控DMA是指设备本身具备DMA功能,而无需使用系统DMA控制器。 总线主控DMA的设备,有两种基本的DMA方式 基于包的DMA传输 使用公共缓冲区的传输 基于包的DMA传输一般是这样的过程: IRP到达Dispacher Dispacher分配一个通道AllocateAdapterChannel,这个例程会在一个合适的时候调用它的一个回调函数 回调函数内部会根据... 阅读全文

posted @ 2009-08-29 17:01 devcfei 阅读(2845) 评论(0) 推荐(0)

WRITE_PORT_BUFFER_ULONG是向一个PORT写一串数
摘要:VOID  WRITE_PORT_BUFFER_ULONG(     IN PULONG  Port,     IN PULONG  Buffer,     IN ULONG  Count     ); The WRITE_PORT_BUF... 阅读全文

posted @ 2009-08-11 19:04 devcfei 阅读(364) 评论(0) 推荐(0)

WDM学习方法
摘要:WDM虽然已经不是M$最新的驱动模型了,但NT内核在当今计算机操作系统中的地位还是无法动摇的。学好WDM吧。 《Programming the Microsoft Windows Driver Model》这本书是相当经典的,必须反复读。 硬件工作原理要懂,如何控制硬件。 IRP的处理需要好好研究,最好去看2000泄露的源码,或者WRK源码。里面有IRP相关的,NtWriteFile,IoComp... 阅读全文

posted @ 2009-06-07 11:24 devcfei 阅读(456) 评论(0) 推荐(1)

IRP方式通知Win32
摘要:基于IRP方式的通知有一个重要的细节,一个设备句柄只能有一个IRP Pending,这是我实践中得出的结论,我并没有仔细深入研究,并且假设这个细节是正确的。即一旦对一个设备发出IRP,并且IRP没有完成,那么就无法再次发送IRP,调用线程将永久阻塞。这会引发一系列问题。 企图绕过阻塞的线程 无论同步操作时在IRP上阻塞,还是异步操作后在事件上阻塞,都是阻塞调用线程,线程无法再次发送IRP,那么创建... 阅读全文

posted @ 2009-05-29 19:16 devcfei 阅读(290) 评论(0) 推荐(0)

KMD使用Win32事件
摘要:KMD可以设置Win32事件有信号,当KMD内部发生了某些事情,需要Win32来做某些工作时,就可以使用这种手段步骤1.KMD内部保存KEVENT对象指针,Win32使用IOCTL方法传递Win32事件句柄2.KMD转换Win32句柄得到KEVENT对象指针3.使用KeSetEvent,和KENENT对象指针参数,使Win32事件有信号4.不需要使用该事件时,KMD要释放KEVENT对象 /*Wi... 阅读全文

posted @ 2009-05-29 19:14 devcfei 阅读(443) 评论(0) 推荐(0)

IO请求包-IRP
摘要:IRP(IO请求包)用于win32和驱动程序通讯,NT内核有一个组件叫做IO管理器。IO管理器负责IRP的分发,驱动程序里创建好设备并且创建好符号链接后,Win32就可以加载驱动了。而要让一个驱动可以处理IRP,必需给驱动添加IRP处理例程。 添加的方法就是再DriverEntry里面对驱动对象DriverObject操作。该参数是一个指针,指向驱动对象,驱动对象内部有一个MajorFunctio... 阅读全文

posted @ 2009-05-29 19:11 devcfei 阅读(4613) 评论(0) 推荐(0)

加载驱动程序
摘要:一个KMD都需要创建设备和符号链接,它们分别为kernel和win32提供了名字,这样kernel和win32就可以正确地使用KMD相关例程 IoCreateDevice IoDeleteDevice IoCreateSymbolicLink IoDeleteSymbolicLink 查阅DDK文档 /*driver.c*/#include <ntddk.h>#define FILE_... 阅读全文

posted @ 2009-05-29 19:03 devcfei 阅读(2232) 评论(0) 推荐(1)

创建一个驱动程序
摘要:Windows NT内核下的驱动通常称为KMD(Kernel-Mode Driver),下载并安装好DDK后,就可以编写KMD了。编写一个KMD至少需要notepad+ddk。DDK使用C语言编写,驱动的函数有一个新的名字,例程,实际上二者没有必要刻意区分一个KMD至少需要DriverEntry例程,和C语言中的main一样,DriverEntry是驱动程序的入口点,驱动程序加载时DriverEn... 阅读全文

posted @ 2009-05-29 18:53 devcfei 阅读(623) 评论(0) 推荐(0)