I/O キューの作成

ほとんどのドライバーは、EvtDriverDeviceAdd コールバック関数で I/O キューを作成します。デバイスの I/O キューを作成するために、ドライバーはフレームワーク キュー オブジェクトの WdfIoQueueCreate メソッド (フレームワーク キュー オブジェクトを作成) を呼び出します。ドライバーは、WDF_IO_QUEUE_CONFIG 構造体をこのメソッドに渡します。この構造体には、キューのディスパッチ方法、キュー内の要求を入手できるときにフレームワークが呼び出す要求ハンドラーへのポインターなどの、キューに関する構成情報が含まれます。構造体は、キューが電源管理されるかどうかや、ドライバーがキューの I/O 要求で長さ 0 のバッファーをサポートするかどうかも示します。

ドライバーが WDF_IO_QUEUE_CONFIG 構造体の DefaultQueue メンバーを TRUE に設定している場合、そのキューがデバイスの既定の I/O キューになります。ドライバーが既定の I/O キューを作成する場合、一部の要求を受け取る追加のキューを作成しない限り、フレームワークはデバイスのすべての I/O 要求をこのキューに追加します。ドライバーは、WdfDeviceGetDefaultQueue メソッドを呼び出して、デバイスの既定の I/O キューへのハンドルを取得できます。

1 つのデバイスに対して複数の I/O キューを使用する場合、ドライバーは WdfIoQueueCreate を呼び出して、必要な数のキュー オブジェクトを作成できます。ドライバーは、複数のキューを作成する場合、WdfDeviceConfigureRequestDispatching を呼び出して、異なる種類の要求を異なるキューに渡すようにフレームワークに指示できます。たとえば、すべての読み取り要求を 1 つのキューに送信し、すべての書き込み要求を別のキューに送信するように指定できます。

ドライバーが一連の I/O キューを作成し、WdfDeviceConfigureRequestDispatching を呼び出して、ドライバーが受信できる各種の要求を特定のキューに送信する場合、既定のキューは必要ありません。

ドライバーに特定の種類の要求の I/O キューが用意されていない場合、かつドライバーが関数ドライバーである場合、フレームワークは STATUS_INVALID_DEVICE_REQUEST の完了状態の値を使用してその種類の要求を完了させます。ドライバーがフィルター ドライバーである場合、かつ WdfFdoInitSetFilter を呼び出した場合、フレームワークは、これらの要求をドライバー スタックの次の下位ドライバーに自動的に転送します。そのため、たとえば、読み取り要求を処理しないフィルター ドライバーは、読み取り要求を受け取る I/O キューを用意する必要はありません。

ドライバーが I/O キューを使用する方法の例については、「I/O キューの使用例」を参照してください。