DispatchCleanup 例程

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

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

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

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

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

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

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