取消 IRP

IRP 可能保持无限期排队 (以便用户可以取消以前提交的 I/O 请求的驱动程序) 必须具有一个或多个 Cancel 例程才能完成用户取消的 I/O 请求。 例如,键盘、鼠标、并行、串行和声音设备驱动程序 (或分层) 和文件系统驱动程序应具有 Cancel 例程。

适用于 Microsoft Windows XP 和更高版本的操作系统的驱动程序可以使用 取消安全的 IRP 队列, 而不是实现自己的 Cancel 例程。

“取消 IRP”意味着在保持系统完整性的同时尽快完成 IRP。 有关 IRP 完成的一般讨论,请参阅 完成 IRP

取消过程在系统或驱动程序调用 IoCancelIrp 时开始。 对于与尚未完全完成的线程关联的每个 IRP,都会调用此例程。 如果启动 I/O 请求的线程退出,系统将取消未处理的 IRP。 驱动程序只能取消已创建的 IRP, (请参阅 为 Lower-Level Drivers 创建 IRP。)

如果取消的 IRP 未在 5 分钟内完成,I/O 管理器将认为 IRP 超时。此类 IRP 与线程取消关联,并且会为当前拥有 IRP 的设备记录错误。 应确保驱动程序中可能需要很长时间才能完成的任何请求都是可取消的。 若要确保潜在的长请求可取消,可以使用 取消安全的 IRP 队列内核模式驱动程序框架,从驱动程序开发人员那里抽象化取消。

本部分提供以下主题:

Cancel 例程简介

注册 Cancel 例程

同步 IRP 取消

实现 Cancel 例程

取消 IRP 时要考虑的要点