驱动程序管理的 IRP 队列
除文件系统驱动程序外,I/O 管理器将设备队列对象 (关联,以便将 IRP) 与驱动程序创建的每个设备对象相关联。
大多数设备驱动程序调用 I/O 管理器的支持例程以使用关联的设备队列,每当设备对目标设备对象的 I/O 请求传入速度超过驱动程序处理它们完成的速度时,该队列都会保留 IRP。 使用此技术,IRP 将排队到驱动程序提供的 StartIo 例程。
为了获得良好的性能,大多数中间驱动程序只需将 IRP 传递给较低的驱动程序,只要它们传入,中间驱动程序几乎永远不会使用与其各自的设备对象关联的设备队列。
但是,可以通过显式设置一个或多个设备队列、互锁队列或取消安全队列来设计驱动程序来管理 IRP 的内部队列。 如果驱动程序控制与 I/O 操作重叠的设备,此方法特别有用。 对于此类设备,可能很难仅使用单个队列管理同一目标设备对象的两个或多个 IRP 的并发处理。
生成内部队列的最简单方法是使用取消安全 IRP 队列框架。 可以在驱动程序中实现所选的队列机制。 然后,可以使用 IoCsqInitialize 注册一组处理 IRP 插入和删除以及锁定和解锁队列的回调例程。 取消安全 IRP 队列框架提供 IoCsqInsertIrp、 IoCsqRemoveIrp 和 IoCsqRemoveNextIrp 例程,这些例程自动使用回调例程安全地插入和删除驱动程序队列中的 IRP。 系统还使用回调例程安全地删除取消的任何 IRP。
还可以选择在设备控制器的驱动程序中为一组异类物理设备设置 IRP 的补充队列。 例如,SCSI 端口驱动程序将设备队列对象用于内部队列。 除了与它创建的表示 HBA 的设备对象关联的设备队列外,此驱动程序还具有 StartIo 例程并将设备队列对象设置为补充队列。 SCSI 端口驱动程序使用其补充设备队列来保存 HBA 控制的 SCSI 总线上特定逻辑单元绑定的 IRP, (es) 。
系统软盘控制器驱动程序是没有 StartIo 例程并使用互锁队列的驱动程序示例。 此驱动程序设置一个双重链接的互锁队列,驱动程序及其设备专用线程从中插入和删除 IRP。
内核定义设备队列对象类型。 执行支持组件提供用于在互锁队列中插入和删除 IRP 的例程。 适用于 Windows XP 和更高版本的 Windows 的驱动程序可以使用 取消安全 IRP 队列 来处理 IRP 队列。
以下部分介绍如何使用设备队列、互锁队列和取消安全队列: