フレームワーク要求オブジェクトの作成

フレームワーク要求オブジェクトは、I/O マネージャーがドライバーに送信した I/O 要求を表します。 フレームワークベースのドライバーは、フレームワーク要求オブジェクト メソッドを呼び出 すことによって、各 I/O 要求を処理します。

各 I/O 要求には WDM I/O 要求パケット (IRP 構造体) が含まれていますが、フレームワークベースのドライバーは通常、IRP 構造体にアクセスする必要はありません。

ほとんどのフレームワーク要求オブジェクトはフレームワークによって作成されますが、ドライバーは要求オブジェクトを作成することもできます。

フレームワークによって作成される要求オブジェクト

フレームワークベースのドライバーが I/O マネージャーから I/O 要求パケット (IRP) を受信すると、フレームワークは IRP をインターセプトし、フレームワーク要求オブジェクトを作成します。 フレームワークは、要求オブジェクトを I/O キューに配置し、ドライバーがキューの要求ハンドラーを登録している場合は、適切なハンドラーを呼び出します。

次の図は、フレームワークが読み取り操作の要求オブジェクトを作成するときに発生する手順を示しています。

Diagram illustrating the steps to create a request object for a read operation in a framework-based driver.

次の手順は、前の図内の数字に対応しています。

  1. ユーザーモード アプリケーションは、Microsoft Win32 ReadFile 関数を呼び出してファイルを読み取ります。

  2. ReadFile 関数は、カーネル モードで実行される I/O マネージャーを呼び出します。

  3. I/O マネージャーは、IRP 構造体を割り当て、構造体に IRP_MJ_READ 関数コードを格納します。

  4. I/O マネージャーは、ドライバー xDispatchRead 標準ドライバー ルーチンを呼び出し、IRP 構造体へのポインターを渡します。 ドライバー x はフレームワーク ベースのドライバーであるため、フレームワークはドライバーの DispatchRead ルーチンを提供します。

  5. フレームワークは、IRP 構造体を表す要求オブジェクトを作成します。 フレームワークは、ドライバーのキュー オブジェクトのいずれかに要求オブジェクトを追加します。

  6. フレームワークは、ドライバーの EvtIoRead 要求ハンドラーを呼び出し、キュー オブジェクト ハンドルと要求オブジェクト ハンドルを渡します。

ドライバーによって作成される要求オブジェクト

フレームワークベースのドライバーも、要求オブジェクトを作成できます。 たとえば、ドライバーの I/O ターゲットが一度に処理できる量を超えるデータの読み取りまたは書き込み要求を受け取った場合、ドライバーは要求オブジェクトを作成できます。 このような状況では、ドライバーは、データを複数の小さな要求に分割し、追加の要求オブジェクトを使用して、これらの小さな要求を 1 つ以上の I/O ターゲットに送信できます。

要求オブジェクトを作成するには、ドライバーで WdfRequestCreate を呼び出し、その後に要求を初期化するフレームワーク オブジェクト メソッド (WdfUsbTargetPipeFormatRequestForRead など) を呼び出す必要があります。

ドライバーが WDM ディスパッチ ルーチンで WDM IRP を受信し、それをサービスまたはフレームワークを使用して転送する場合、ドライバーは WdfRequestCreateFromIrp を呼び出すことができます。