クリーンアップ操作と閉じる操作の処理エラー

一部のドライバーは、DispatchCleanup ルーチンと DispatchClose ルーチンで必要なタスクを区別できません。 I/O マネージャーは、ファイル オブジェクトへの最後の ハンドルが閉じられたときに、ドライバーの DispatchCleanup ルーチンを呼び出します。 DispatchClose ルーチンは、ファイル オブジェクトから最後の参照が解放されたときに呼び出されます。 ファイル オブジェクトにアタッチされているか、他の DispatchXxx ルーチンで使用される可能性がある DispatchCleanup ルーチン内のリソースは、解放を試みてはなりません。

ディスパッチ ルーチンを呼び出すとき、I/O マネージャーは、通常の I/O 呼び出しのファイル オブジェクトへの参照を保持します。 その結果、ドライバーは、DispatchCleanup ルーチンが呼び出された後、その DispatchClose ルーチンが呼び出される前に、ファイル オブジェクトの I/O 要求を受信できます。 たとえば、ユーザー モードの呼び出し元は、別のスレッドからの I/O マネージャー要求の進行中にファイル ハンドルを閉じる可能性があります。 I/O マネージャーが DispatchClose ルーチンを呼び出す前に、ドライバーが必要なリソースを削除または解放した場合、無効なポインター参照やその他の問題が発生する可能性があります。