I/O 要求の転送

ドライバーは、処理できない I/O 要求を受け取ると、通常、次のいずれかの処理を行います。

  • 受信した要求を別のドライバーに転送します。

  • 追加の要求を作成し、別のドライバーに送信します。

フレームワークベースのドライバーは、I/O ターゲットを使用して要求を転送します。これはシステム上の他のドライバーを表します。 ドライバーは、次のいずれかの手法を使用して、I/O ターゲットに要求を転送できます。

  • ドライバーは、WdfDeviceGetIoTarget の次に WdfRequestFormatRequestUsingCurrentType、最後に WdfRequestSend を呼び出すことによって、次の下位ドライバーに I/O 要求を転送できます。

    この手法は、ドライバーが転送前に変更する必要のない要求を受け取る場合にのみ役立ちます。

  • ドライバーは、WdfFdoInitSetFilter を呼び出して、自身をフィルター ドライバーとして登録できます。

    フィルター ドライバーが特定の種類の I/O 要求の I/O キューを提供しない場合、フレームワークは、その種類の要求を次の下位ドライバーに自動的に転送します。

  • 通常、ファンクション ドライバーは、各 I/O 要求の内容を調べます。 関数ドライバーが要求を処理できない場合は、要求を変更し、I/O ターゲットに転送する可能性があります。 または、1 つ以上の新しい要求を作成し、I/O ターゲットに送信することもできます。

    フレームワークの I/O ターゲット オブジェクトは、他のドライバーに I/O 要求を送信するためのいくつかのメソッドを定義します。 たとえば、ドライバーは WdfIoTargetFormatRequestForRead を呼び出し、その後に WdfRequestSend を呼び出して、読み取り要求を I/O ターゲットに送信できます。 I/O ターゲットの詳細については、「I/O ターゲットの使用」をご参照ください。

    まれに、ドライバー ライターは、要求を I/O ターゲットに送信する前に、要求の基になる WDM I/O スタックの場所 の内容を指定することがあります。 このような場合、ドライバーは WdfRequestSend を呼び出す前に WdfRequestWdmFormatUsingStackLocation を呼び出すことができます。

場合によっては、ドライバーが複数の I/O ターゲットに同じ要求を送信する必要があります。通常、ドライバーはすべてのデバイスに 1 つのコマンドを送信する必要があるためです。 I/O ターゲットに要求を送信する前に、ドライバーは WdfRequestChangeTarget を呼び出して、I/O ターゲットにアクセスできることを確認できます。

ドライバーは、WdfRequestSend を呼び出すときに WDF_REQUEST_SEND_OPTION_SE[ ND_AND_FORGET フラグを設定しない限り、I/O ターゲットに転送するすべての要求を最終的に完了する必要があります。

ドライバーが要求を転送するとき、フレームワークは、フレームワーク要求オブジェクトを送信ドライバーから受信ドライバーに文字どおり転送するわけではないことに注意してください。 代わりに、フレームワークは、要求を受信するドライバーに新しい要求オブジェクトを作成します。 要求の基になる I/O 要求パケット (IRP) のみが、あるドライバーから別のドライバーに転送されます。