DispatchCleanup ルーチン
ドライバーの DispatchCleanup ルーチンは、IRP_MJ_CLEANUP I/O 関数コードの IRP を処理します。
ファイル オブジェクトへのすべてのハンドルが閉じた後、ドライバーは DispatchCleanup ルーチンを使用して、必要なクリーンアップ操作を実行します。 DispatchCleanup は、最終ハンドルを閉じたプロセスのプロセス コンテキストで呼び出されることに注意してください。このプロセスは、最初にハンドルを開いたプロセスとは異なる場合があります (このような違いは、通常、別のプロセスが DuplicateHandle ユーザーモード ルーチンを使用して、プロセス ハンドルを複製することで生じます)。元のプロセス コンテキストでクリーンアップを実行する必要があるドライバーは、PsSetCreateProcessNotifyRoutine ルーチンを使用して、そのためのコールバック ルーチンを登録できますが、そのようなコールバックは限られたシステム リソースであることに注意してください。
一般に、DispatchCleanup ルーチンは、現在デバイス キュー (または IRP のドライバーの内部キュー内) にあり、ファイル オブジェクトに関連付けられている、ターゲット デバイス オブジェクトの IRP に対して次の操作を行って、IRP_MJ_CLEANUP 要求を処理する必要があります。
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 などの他のディスパッチ ルーチンとも同期する必要があります。