驱动程序管理的 IRP 队列

除文件系统驱动程序外,I/O 管理器将设备队列对象(用于队列 IRP)与驱动程序创建的每个设备对象相关联。

大多数设备驱动程序调用 I/O 管理器的支持例程,以便利用关联的设备队列。当目标设备对象的设备 I/O 请求到达的速度超过驱动程序处理能力时,这些队列将保存IRP。 通过此方法,IRPs 将排队到驱动程序提供的 StartIo 例程。

为了获得良好的性能,大多数中间驱动程序只是将 IRP 迅速传递给较低的驱动程序,因此中间驱动程序几乎从不使用与其各自设备对象关联的设备队列。

但是,可以通过显式设置一个或多个设备队列、联锁队列或取消安全队列来设计驱动程序以管理 IRP 的内部队列。 如果驱动程序控制的设备与 I/O 操作重叠,那么这种方法特别有用。 对于此类设备,可能很难仅使用单个队列管理同一目标设备对象的两个或多个 IRP 的并发处理。

生成内部队列的最简单方法是使用取消安全的 IRP 队列框架。 可以在驱动程序中实现所选的队列机制。 然后,可以使用 IoCsqInitialize 注册一组处理 IRP 插入和删除的回调例程,以及锁定和解锁队列。 取消安全的 IRP 队列框架提供 IoCsqInsertIrpIoCsqRemoveIrpIoCsqRemoveNextIrp 例程,这些例程自动使用回调例程安全地插入和删除驱动程序队列中的 IRP。 系统还使用您的回调例程来安全地删除已取消的任何输入/输出请求包(IRP)。

您还可以选择在设备控制器的驱动程序中为一组异构物理设备设置附加IRP队列。 例如,SCSI 端口驱动程序使用设备队列对象来管理内部队列。 此驱动程序具有 StartIo 例程,并将设备队列对象设置为补充队列,除了与它创建用于表示 HBA 的设备对象关联的设备队列之外。 SCSI 端口驱动程序使用其补充设备队列来保存绑定到由 HBA 控制的 SCSI 总线特定逻辑单元的 IRP。

系统软盘控制器驱动程序是没有 StartIo 例程并使用互锁队列的驱动程序示例。 此驱动程序设置了一个双向链锁队列,供驱动程序及其设备专用线程用于插入和移除 IRP。

内核定义设备队列对象类型。 执行支持组件提供用于在互锁队列中插入和删除 IRP 的例程。 适用于 Windows XP 及更高版本 Windows 的驱动程序可以使用 取消安全 IRP 队列 来处理 IRP 排队。

以下部分介绍如何使用设备队列、互锁队列和取消安全队列:

设置和使用设备队列

管理设备队列

设置和使用互锁队列

使用 Driver-Created 线程管理互锁队列

Cancel-Safe IRP 队列