处理清理和关闭作业中的错误

某些驱动程序无法区分 DispatchCleanupDispatchClose 例程中所需的任务。 I/O 管理器在关闭文件对象的最后一个句柄时调用驱动程序的 DispatchCleanup 例程。 从文件对象释放最后一个引用时,将调用 DispatchClose 例程。 驱动程序不应在 DispatchCleanup 例程中尝试释放附加到文件对象上的资源,也不应释放可能被其他 DispatchXxx 例程使用的资源。

调用调度例程时,I/O 管理器保留对文件对象的引用,以便进行正常的 I/O 调用。 因此,驱动程序可以在调用 其 DispatchCleanup 例程但在调用 其 DispatchClose 例程之前接收文件对象的 I/O 请求。 例如,当 I/O 管理器正在从另一个线程进行请求时,用户模式调用方可能会关闭文件句柄。 如果在 I/O 管理器调用 DispatchClose 例程之前删除或释放了驱动程序所需的资源,则可能会出现无效的指针引用和其他问题。