DispatchCleanup 例程

驱动程序的 DispatchCleanup 例程处理IRP_MJ_CLEANUP I/O 函数代码 IRP。

在关闭文件对象的所有句柄后,驱动程序可以使用 DispatchCleanup 例程执行所需的任何清理操作。 请注意,在关闭最终句柄的进程的进程上下文中调用 DispatchCleanup ;此过程可能与最初打开句柄的进程不同。 (通常发生这种差异是因为另一个进程使用 DuplicateHandle 用户模式例程来复制进程 handles。) 必须在原始进程上下文中执行清理的驱动程序可以使用 PsSetCreateProcessNotifyRoutine 例程来注册回调例程以实现此目的,但请记住,此类回调是有限的系统资源。

通常, DispatchCleanup 例程必须处理 IRP_MJ_CLEANUP 请求,方法是对当前位于设备队列 (或驱动程序内部 IRP) (对于目标设备对象)中的每个 IRP 执行以下操作,并与文件对象相关联:

  • 调用 IoSetCancelRoutineCancel 例程指针设置为 NULL

  • 如果队列 IRP 的驱动程序 I/O 堆栈位置中指定的文件对象与IRP_MJ_CLEANUP请求的 I/O 堆栈位置中收到的文件对象匹配,则取消 当前位于目标 设备对象的队列中的每个 IRP。

  • 调用 IoCompleteRequest 以完成 IRP,并返回STATUS_SUCCESS。

处理 IRP_MJ_CLEANUP 请求时,驱动程序可以接收其他请求,例如 IRP_MJ_READIRP_MJ_WRITE。 因此,必须解除分配资源的驱动程序还必须将其 DispatchCleanup 例程的执行与其他调度例程(如 DispatchReadDispatchWrite)同步。