I/O 要求の転送

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

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

  • 追加の要求を作成して他のドライバーに送信する。

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

  • 最初に 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_SEND_AND_FORGET フラグを設定した場合を除き、I/O ターゲットに転送するすべての要求を、最終的に完了させる必要があります。

ドライバーが要求を転送する場合、フレームワークは、送信元ドライバーから受信先ドライバーへフレームワーク要求オブジェクトを実際に転送するわけではありません。フレームワークは、要求を受信するドライバー内に新しい要求オブジェクトを作成します。ドライバー間で転送されるのは、要求の基になる I/O 要求パケット (IRP) だけです。