南邮王下邀月熊——Windows 驱动开发学习之 IRP 原理以及派遣函数基本工作流程I/O Requ est Packet (IRP)IRP 基本数据结构:IRP 是由 I/O 管理器发出的,I/O 管理器是用户态与内核态之间的桥梁,当用户态进程发出 I/O 请求时,I/O 管理器就捕获这些请求,将其转换为 IRP 请求,发送给驱动程序。I/O管理器无疑是非常重要的,具有核心地位。它负责所有 I/O 请求的调度和管理工作,根据请求的不同内容,选择相应的驱动程序对象,设备对象,并生成、发送、释放各种不同的 IRP。整个 I/O 处理流程是在它的指挥下完成的。一个 IRP 是从非分页内存中分配的可变大小的结构,它包括两部分:IRP 首部和辅助请求参数数组,如图 1 所示。这两部分都是由 I/O 管理器建立的。图 1 IRP 简单结构图IRP 首部中包含了指向 IRP 输入输出缓冲区指针、当前拥有 IRP 的驱动指针等。紧接着首部的是一个 IO_STACK_LOCATION 结构的数组。它的大小由设备栈中的设备数确定。IO_STACK_LOCATION 结构中保存了一个 I/O 请求的参数及代码、请求当前对应的设备指针、完成函数指针(IoCompletion)等。IRP 运行流程:操作系统用设备对象(device object)表示物理设备,每一个物理设备都有一个或多个设备对象与之相关联,设备对象提供了在设备上的所有操作。也有一些设备对象并不表示物理设备。一个唯软件驱动程序(software-only driver,处理 I/O 请求,但是不把这些请求传递给硬件)也必须创建表示它的操作的设备对象。设备常常由多个设备对象所表示,每一个设备对象对应一个驱动程序来管理设备的 I/O请 求 。 一 个 设 备 的 所 有 设 备 对 象 被 组 织 成 一 个 设 备 栈 ( device stack )。 而 且 ,IO_STACK_LOCATION 数组中的每个元素和设备栈中的每个设备是一一对应的,一般情况下,只允许层次结构中的每个设备对象访问它自己对应的 IO_STACK_LOCATION。无论何时,一个请求操作都在一个设备上被完成,I/O 管理器把 IRP 请求传递给设备栈中顶部设备的驱动程序(IRP 是传递给设备对象的,通过设备对象的 DriverObject 成员找到驱动程序)。驱动程序访问它对应的设备对象在 IRP 中 IO_STACK_LOCATION 数组中的元素检查参数,以决定要进行什么操作(通过检查结构中的 MajorFunction 字段,确定执行什么操作及如何南邮王下邀月熊——Windows 驱动开发学习之 IRP 原理以及派...