ディスパッチ ルーチン内で IRP を完了するタイミング
通常、ドライバーは、指定された要求のパラメーターが無効でない限り、またはデバイス ドライバーで、特定 IRP_MJ_XXX がデバイス I/O 操作を必要としない限り、ディスパッチ ルーチンで IRP を完了しません。
階層化されたドライバーのチェーン内のすべてのドライバーは、ドライバーのディスパッチ ルーチンによって受信した IRP ごとに、その I/O スタックの場所でパラメーターの有効性をチェックできます。 最も上位のドライバーのディスパッチ ルーチンで無効なパラメーターを持つ IRP を完了すると、ドライバーのチェーンとシステム全体の I/O スループットが向上します。
上位レベルのドライバーのディスパッチ ルーチンは、次のガイドラインに従って、IRP を完了するか、下位ドライバーによる処理のために渡す必要があります。
ディスパッチ ルーチンは、その I/O スタックの場所内のパラメーターが無効であると判断した場合は、適切なエラー状態 (STATUS_INVALID_PARAMETER など) をすぐにその IRP を完了する必要があります。
IRP に IRP_MJ_CLEANUPファンクション コードが含まれている場合、 DispatchCleanup ルーチンは、ドライバーの I/O スタックの場所で指定されたファイル オブジェクトに対して、ターゲット デバイス オブジェクトに現在キューに登録されているすべての IRP を完了し、クリーンアップ IRP を完了する必要があります。
クリーンup 要求は、アプリケーションが終了しているか、ドライバーのデバイス オブジェクトを表すファイル オブジェクトのファイル ハンドルを閉じたことを示します。 DispatchCleanup ルーチンが返されるときに、通常、ドライバーの DispatchClose ルーチンが次に呼び出されます、
それ以外の場合、上位レベルのドライバーは、次の下位ドライバーに渡すことによってのみ要求を満たすことができます。
最下位レベルのドライバーのディスパッチ ルーチンは、次のガイドラインに従って IRP を完了する必要があります。
ディスパッチ ルーチンは、その I/O スタックの場所のパラメーターが無効であると判断した場合、またはドライバーが IRP をサポートしていない場合は、適切なエラー状態ですぐにその IRP を完了する必要があります。 このような場合、ドライバーは、STATUS_SUCCESSの状態値を持つ IRP を完了する必要があります。
通常、上位レベルのドライバーでは、要求された操作のパラメーターが既にチェックされていますが、最下位レベルのデバイス ドライバーは、そのパラメーターチェックも実行する必要があります。
IRP に IRP_MJ_CLEANUPファンクション コードが含まれている場合、 DispatchCleanup ルーチンは、ドライバーの I/O スタックの場所で指定されたファイル オブジェクトに対して、ターゲット デバイス オブジェクトに現在キューに登録されているすべての IRP を完了し、クリーンアップ IRP を完了する必要があります。
クリーンup 要求は、アプリケーションが終了しているか、ドライバーのデバイス オブジェクトを表すファイル オブジェクトのファイル ハンドルを閉じたことを示します。 DispatchCleanup ルーチンが返されるときに、通常、ドライバーの DispatchClose ルーチンが次に呼び出されます、
要求にデバイス I/O 操作が必要ない場合、ディスパッチ ルーチンは要求を満たし、IRP を完了する必要があります。
たとえば、ドライバーは、特に初期化後にデバイス モードをほとんど変更しない場合に、デバイス拡張機能にデバイスの現在のモードを保存する場合があります。 その DispatchDeviceControl ルーチンは、この保存された情報を返すことによって、現在のデバイス モードを照会する要求を満たすことができます。
それ以外の場合、ディスパッチ ルーチンは IoMarkIrpPendingを呼び出し、さらに処理するために IRP を他のドライバー ルーチンにキューに入れ、STATUS_PENDING を返す必要があります。