驱动开发

21
1月
2016

驱动开发一:Windows内核

Windows系统的结构就如下图所示:愈往上愈接近应用软件,愈往下愈接近硬件。


 

Categories: 驱动开发

21
1月
2016

8、IRP-MJ-DIRECTORY-CONTROL

摘要:

IRP_MJ_DIRECTORY_CONTROL标志在MicrosoftWin32中调用ReadDirectoryChangesW 或者 FindNextVolumeMountPoint 或在内核模式下调用ZwQueryDirectoryFile 函数时被标示。

关键字:IRP_MJ_DIRECTORY_CONTROL,IRP_MN_QUERY_DIRECTORY,FileBothDirectoryInformation,FileIdBothDirectoryInformation,File System Filter Drivers,文件过滤驱动。

Categories: 驱动开发

21
1月
2016

7、深入理解IRP概念、传递流程与完成函数

摘要:

    本文讲述了IRP的概念与实质,并分析了IRP的传递流程与完成函数。对常见的函数进行了详细讲解。部分片段与概念节选自公开发行物与翻译作品。

关键字:IRP概念,IRP实质,IRP传递流程,完成函数的设置,IRP堆栈IO_STACK_LOCATION,完成例程返回值等等。

Categories: 驱动开发

21
1月
2016

6、深入理解IRP的完成机制

    Windows 驱动程序模型 (WDM) 驱动程序中最常完成任务之一是从一个驱动程序发送输入/输出请求数据包 (Irp)向另一个驱动程序。驱动程序将创建其自己的 IRP 并将其发送到一个较低的驱动程序,或者驱动程序将它从上面附加另一个驱动程序接收 Irp 转发。 本文讨论所有可能的方式,驱动程序可以发送 Irp 到较低的驱动程序也可以根据驱动程序编写人员需要按照示例代码提供的模板之一进行处理。

IRP 完成例程可以返回 STATUS_MORE_PROCESSING_REQUIRED STATUS_SUCCESS。它检查状态时,I/O 管理器使用下列规则:•如果状态是 STATUS_MORE_PROCESSING_REQUIRED,停止完成 IRP,离开的堆栈位置保持不变,并返回。 •如果状态不是 STATUS_MORE_PROCESSING_REQUIRED,继续完成 IRP 向上。

Categories: 驱动开发

21
1月
2016

5、Windows的设备驱动框架-DriverEntry

假定该模块业已装入,并且I/O管理已经调用了这个模块的初始化程序DriverEntry(),我们就从这儿开始。下面的代码仍引自ReactOS。

"老式"设备没有"即插即用"的功能,所以其驱动模块一般都是在系统初始化的时候装入内核并得到初始化的,但是应用软件和系统工具也可以通过系统调用NtLoadDriver()在运行中动态装载这样的驱动模块。Windows内核装载一个驱动模块的映像以后就会调用其入口函数,其函数名默认为DriverEntry()。但也可以用别的函数名,只要在编译、连接时特别加以指定即可。

Categories: 驱动开发

21
1月
2016

4、Windows的设备驱动框架 -IRP

IRP数据结构中的许多字段和成分需要结合代码和具体实例来说明,这里只能先说个大概。

其实数据结构IRP只是"I/O请求包"IRP的头部,在IRP数据结构的后面还有一个IO_STACK_LOCATION数据结构的数组,数组的大小则取决于IRP数据结构中的StackCount,其数值来自堆叠中顶层设备对象的StackSize字段。这样,就在IRP中为目标设备对象堆叠中的每一层即每个模块都准备好了一个IO_STACK_LOCATION数据结构。而CurrentLocation,则是用于该数组的下标,说明目前是在堆叠中的哪一层,因而正在使用哪一个IO_STACK_LOCATION数据结构。这就好像是一叠"任务单",其中有的(至少一个)是已经填写好了的,其余的可以由下层模块根据具体情况填写。而下层模块的操作结果,则也是通过相应的"任务单"返回到上层。特别地,结构成分IoStatus是个IO_STATUS_BLOCK即"I/O状态块",用来返回包括状态码在内的有关信息。

Categories: 驱动开发

21
1月
2016

3、Windows的设备驱动框架

每当装载一个设备驱动模块的时候,内核的I/O管理先是调用其DriverEntry(),再调用其AddDevice函数(如果有的话),这就完成了模块的初始化与安装。

DRIVER_OBJECT数据结构及其扩充部分主要提供设备驱动模块的各种操作(函数),而设备的状态则反映在"设备对象"DEVICE_OBJECT中,而且各层设备驱动的堆叠也是通过DEVICE_OBJECT实现的:

Categories: 驱动开发

21
1月
2016

2、Windows的设备驱动框架

当上层模块要驱动(调用)下层模块,或者说要把对于设备的操作交给下一层模块去办的时候,或者I/O管理要调用一个模块(包括"老式"模块)时,就准备好一个称为"I/O请求包(I/O Request Packet)"即IRP的数据结构,并调用一个工具性的内核函数IoCallDriver()或IofCallDriver(),此时程序就根据IRP中的"操作码"转入了目标模块所提供的某个函数。其实IoCallDriver()是宏定义,就定义为IofCallDriver(),后者函数名中的'f'是"fast"的意思,

Categories: 驱动开发

21
1月
2016

1、Windows的设备驱动框架

我们所关心的主要是WDM框架,而WDM设备驱动模块一般是堆叠的,所以我们关心设备驱动模块的堆叠。一个设备驱动堆叠中的模块完成了初始化,创建了设备对象,并将设备对象累入堆叠之后,该堆叠的结构便如图9.1所示:

 

Categories: 驱动开发