欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

【翻译】winddk翻译(九)--基于可重复IRPs的包驱动I/O

【翻译】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

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功