DispatchCleanup 常式
驅動程式的 DispatchCleanup 常式會處理 IRP_MJ_CLEANUP I/O 函式程式碼的 IRP。
驅動程式可以使用 DispatchCleanup 常式,在檔案物件的所有控制碼關閉之後,執行所需的任何清除作業。 請注意, DispatchCleanup 是在關閉最終控制碼的進程內容中呼叫;此程式可能與最初開啟控制碼的程式不同。 (通常會發生此差異,因為另一個進程使用 DuplicateHandle 使用者模式常式來複製進程控制碼。) 必須在原始進程內容中執行清除的驅動程式可以使用 PsSetCreateProcessNotifyRoutine 常式來註冊該用途的回呼常式,但請記住,這類回呼是有限的系統資源。
一般而言, DispatchCleanup 常式必須針對目前位於裝置 (佇列中的每個 IRP 執行下列動作來處理 IRP_MJ_CLEANUP 要求,或是目標裝置物件的驅動程式內部 IRP 佇列中) ,並與檔案物件相關聯:
呼叫 IoSetCancelRoutine 以將 Cancel 常式指標設定為 Null。
如果佇列 IRP 的驅動程式 I/O 堆疊位置中指定的檔案物件符合 IRP_MJ_CLEANUP 要求之 I/O 堆疊位置中所收到的檔案物件,則取消目前在目標裝置物件的佇列中每個 IRP。
呼叫 IoCompleteRequest 以完成 IRP,並傳回STATUS_SUCCESS。
處理 IRP_MJ_CLEANUP 要求時,驅動程式可以接收其他要求,例如 IRP_MJ_READ 或 IRP_MJ_WRITE。 因此,必須解除配置資源的驅動程式也必須同步處理其 DispatchCleanup 常式與其他分派常式的執行,例如 DispatchRead 和 DispatchWrite。