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

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

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

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

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

  • 将 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