【翻译】winddk翻译(九)--基于可重复IRPs的包驱动I/O
Kernel-Mode Driver Architecture: Windows DDK
基于可重复IRPs的包驱动I/O
I/O管理器,即插即用管理器,和电源管理器使用I/O请求包(IRPs)来与内核模式驱动通信,内核模式驱动之间使用这种机制来通信。
I/O管理器运行如下几个步骤:
接收I/O请求,这通常来自于用户模式的应用模式
创建IRPs来代表I/O请求
派头IRPs到相应的驱动
追踪IRPs只到其完成
返回原始I/O操作请求者状态。
每一个IRP都可以被派发到多个驱动。例如,一个打开磁盘文件的请求可能首先被派发到文件系统驱动,通过一个中间层映像驱动,最终派发到磁盘驱动或者到即插即用硬件总线驱动。这一系列的驱动被认为是驱动栈(driver stack)。
因此,每一个IRP都有一个固定部份(fixed part) ,加上每个控制设备的驱动相关的I/O堆栈位置(I/O stack loation) 。
在回定部分(或者头部),I/O管理器维持着原始请求的信息,比如调用者的线程ID及其参数,打开的文件的设备对象地址,等等。固定部分也包括I/O状态块(I/O status block),在这个块当中,驱动填写请求I/O操作的状态的信息。
在最高层驱动的I/O堆栈位置,I/O管理器,即插即用管理器,或者电源管理器驱动特别参数,比如请求操作的函数码以及决定驱动如何运行的上下文信息。然后,每个驱动为驱动栈中下一个驱动创建一个I/O堆栈位置。
当每一个驱动处理IRP时,她能够访问IRP当中她的I/O堆栈位置 ,然而在每个驱动操作的阶段重新使用该IRP 。另外,高级驱动能够创建(或者重新使用)IRPs传送请求到下一层驱动。
更多IRPs的讨论,参见处理 IRPs。
Microsoft Corporation
Send feedback on this topic
Built on Friday, February 18, 2005
