DispatchCreate ルーチンと DispatchClose ルーチンの分離
IRP_MJ_CREATE および IRP_MJ_CLOSE 要求に対するドライバーの Dispatch ルーチンは、入力 IRP を STATUS_SUCCESS で完了させる以外のことは何もしない場合があります。 詳細は IRPの完了を参照してください。
IRP_MJ_CREATE および IRP_MJ_CLOSE 要求に対する別のドライバーの Dispatch ルーチンは、基盤となるデバイスドライバー や基盤となるデバイスによっては、より多くの作業を行う場合があります。 以下のようなシナリオが考えられます。
作成要求を受け取ると、クラスドライバーは内部キューを初期化し、 IRP_MJ_INTERNAL_DEVICE_CONTROL 要求を対応するポートドライバーに送信し、デバイス構成情報またはコントローラ ポートへの排他的アクセスを要求する場合があります。
IRP_MJ_CLOSE の受信は、ターゲットデバイスオブジェクトに関連付けられているファイルオブジェクトへの最後の参照が削除されたことを示す。 これは、ファイルオブジェクトへのすべてのハンドルが閉じられ、すべての未処理のI/O要求が完了またはキャンセルされたことを意味します。
作成要求を受信すると、使用頻度の低いデバイスのドライバーは MmLockPagableCodeSection を呼び出して、他の IRP_MJ_XXX 要求を処理するドライバールーチンのいくつかを常駐させる場合があります。 相互クローズ要求の受信時に、ドライバーは MmUnlockPagableImageSection をコールして、そのようなドライバーのデバイスオブジェクトのすべてのファイルオブジェクトハンドルが閉じられたときに、pageable-imageセクションをページアウトさせてシステムメモリを節約できます。
いくつかのドライバーは、 IRP_MJ_CLOSE 要求を対称性のためだけに処理します。なぜなら、デバイスオブジェクトが保護されたサブシステムまたは上位ドライバーによってオープンされた後、下位ドライバーのデバイスオブジェクトはシステム自体がシャットダウンされるまでクローズされないからです。 例えば、キーボードとマウスのドライバーは、システムが実行されている間機能しなければならない物理デバイスを表すデバイスオブジェクトを設定するので、これらのドライバーは対称性のために最小の DispatchClose ルーチンを持っているか、 DispatchCreateClose ルーチンを組み合わせたる可能性があります。
下位のドライバーによって制御されるデバイスがシステムの実行を継続するために利用可能でなければならない場合、ドライバーの DispatchClose ルーチンは一般に呼び出されません。 例えば、いくつかのシステムディスクドライバーは DispatchClose ルーチンを持ちませんが、これらのドライバーは通常 DispatchFlushBuffers と DispatchShutdown ルーチンを持ち、システムがシャットダウンされる前に未処理のファイル I/O 操作を完了させます。
DRIVER_DISPATCH と DispatchClose ルーチンを別々に実装することもできますが、ドライバーは a single DispatchCreateClose routine ルーチンで作成と終了の両方のリクエストを処理することもあります。