摘要:什么时候需要取消? 如果驱动调用者(caller)向驱动程序发送Request,需要从硬件读取数据,而读取完成不是一个同步操作时,那么该Request必须是可以被取消的。比如数据传输完成以中断方式通知时。 取消流程 Request Handlers调用WdfRequestMarkCancelableor WdfRequestMarkCancelableEx注册一个取消例程,该例程将在IRQL:...
阅读全文
摘要:IO_CSQ_ACQUIRE_LOCK CsqAcquireLock; VOID CsqAcquireLock( __in PIO_CSQ Csq, __out PKIRQL Irql ) {...} The THREAD_STUCK_IN_DEVICE_DRIVER bu...
阅读全文
摘要:通常,一个设备有多路数据流。而ReadFile,WriteFile又只针对一个句柄。这就出现一个矛盾,这有几个解决方案 多个设备对象 编写总线驱动 设备对象命名空间 虽然我没有找到WDK中推荐的做法,但在WHDC上,微软给出了推荐的做法。下面简单介绍一下吧。 首先IoRegisterDeviceInterface接受一个ReferenceString,我们可以给一个字符串“ch0”。这样,设备接...
阅读全文
摘要:上一次分析了DMA两种方式,基于包的DMA方式和CommonBuffer方式。 最近看文档和资料,其实CommonBuffer是可以直接让应用程序访问的,具体的资料在 DDK文档的Using Common-Buffer System DMA这一节 实际的过程是这样的 AllocateCommonBu
阅读全文
摘要:DMA都是主控总线的,这里的总线主控DMA是指设备本身具备DMA功能,而无需使用系统DMA控制器。 总线主控DMA的设备,有两种基本的DMA方式 基于包的DMA传输 使用公共缓冲区的传输 基于包的DMA传输一般是这样的过程: IRP到达Dispacher Dispacher分配一个通道AllocateAdapterChannel,这个例程会在一个合适的时候调用它的一个回调函数 回调函数内部会根据...
阅读全文
摘要:VOID WRITE_PORT_BUFFER_ULONG( IN PULONG Port, IN PULONG Buffer, IN ULONG Count ); The WRITE_PORT_BUF...
阅读全文
摘要:WDM虽然已经不是M$最新的驱动模型了,但NT内核在当今计算机操作系统中的地位还是无法动摇的。学好WDM吧。 《Programming the Microsoft Windows Driver Model》这本书是相当经典的,必须反复读。 硬件工作原理要懂,如何控制硬件。 IRP的处理需要好好研究,最好去看2000泄露的源码,或者WRK源码。里面有IRP相关的,NtWriteFile,IoComp...
阅读全文
摘要:基于IRP方式的通知有一个重要的细节,一个设备句柄只能有一个IRP Pending,这是我实践中得出的结论,我并没有仔细深入研究,并且假设这个细节是正确的。即一旦对一个设备发出IRP,并且IRP没有完成,那么就无法再次发送IRP,调用线程将永久阻塞。这会引发一系列问题。 企图绕过阻塞的线程 无论同步操作时在IRP上阻塞,还是异步操作后在事件上阻塞,都是阻塞调用线程,线程无法再次发送IRP,那么创建...
阅读全文
摘要:KMD可以设置Win32事件有信号,当KMD内部发生了某些事情,需要Win32来做某些工作时,就可以使用这种手段步骤1.KMD内部保存KEVENT对象指针,Win32使用IOCTL方法传递Win32事件句柄2.KMD转换Win32句柄得到KEVENT对象指针3.使用KeSetEvent,和KENENT对象指针参数,使Win32事件有信号4.不需要使用该事件时,KMD要释放KEVENT对象 /*Wi...
阅读全文
摘要:IRP(IO请求包)用于win32和驱动程序通讯,NT内核有一个组件叫做IO管理器。IO管理器负责IRP的分发,驱动程序里创建好设备并且创建好符号链接后,Win32就可以加载驱动了。而要让一个驱动可以处理IRP,必需给驱动添加IRP处理例程。 添加的方法就是再DriverEntry里面对驱动对象DriverObject操作。该参数是一个指针,指向驱动对象,驱动对象内部有一个MajorFunctio...
阅读全文
摘要:一个KMD都需要创建设备和符号链接,它们分别为kernel和win32提供了名字,这样kernel和win32就可以正确地使用KMD相关例程 IoCreateDevice IoDeleteDevice IoCreateSymbolicLink IoDeleteSymbolicLink 查阅DDK文档 /*driver.c*/#include <ntddk.h>#define FILE_...
阅读全文
摘要:Windows NT内核下的驱动通常称为KMD(Kernel-Mode Driver),下载并安装好DDK后,就可以编写KMD了。编写一个KMD至少需要notepad+ddk。DDK使用C语言编写,驱动的函数有一个新的名字,例程,实际上二者没有必要刻意区分一个KMD至少需要DriverEntry例程,和C语言中的main一样,DriverEntry是驱动程序的入口点,驱动程序加载时DriverEn...
阅读全文