数据包驱动的 I/O 与可重用 IRP

I/O 管理器、即插即用管理器和电源管理器使用 I/O 请求数据包 (IRP) 与内核模式驱动程序通信,并允许驱动程序相互通信。

I/O 管理器执行以下步骤:

  • 接受通常源自用户模式应用程序的 I/O 请求。

  • 创建表示 I/O 请求的 IRP。

  • 将 IRP 路由到相应的驱动程序。

  • 跟踪 IRP,直到它们完成。

  • 将状态返回给每个 I/O 操作的原始请求者。

IRP 可能会路由到多个驱动程序。 例如,打开磁盘上的文件的请求可能首先通过中间镜像驱动程序转到文件系统驱动程序,并最终转到磁盘驱动程序,并可能转到 PnP 硬件总线驱动程序。 这组驱动程序称为 驱动程序堆栈

因此,对于控制设备的每个驱动程序,每个 IRP 都有一个 固定部件,外加一个特定于驱动程序的 I/O 堆栈位置

  • 在固定部分 (或 标头) 中,I/O 管理器维护有关原始请求的信息,例如调用方线程 ID 和参数、打开文件的设备对象的地址等。 固定部分还包含 I/O 状态块,驱动程序在其中设置有关所请求 I/O 操作的状态的信息。

  • 在最高级别驱动程序的 I/O 堆栈位置中,I/O 管理器、即插即用管理器或电源管理器设置特定于驱动程序的参数,例如所请求操作的函数代码以及相应驱动程序用于确定其应执行的操作的上下文。 反过来,每个驱动程序设置驱动程序堆栈中下一个较低版本的驱动程序的 I/O 堆栈位置。

当每个驱动程序处理 IRP 时,它可以访问 IRP 中的 I/O 堆栈位置,从而在驱动程序操作的每个阶段重用 IRP。 此外,较高级别的驱动程序可以创建 (或重复使用) IRP,以将请求向下发送到更低级别的驱动程序。

有关 IRP 的详细讨论,请参阅 处理 IRP