I/O キューの作成

フレームワーク キュー オブジェクトは、ドライバーが受信する I/O 要求のコンテナーである I/O キューを表します。 各ドライバーは、デバイスごとに 1 つ以上の I/O キューを作成できます。 フレームワーク キュー オブジェクトは、ドライバーが提供できるイベント コールバック関数のセットと、ドライバーが呼び出すことができるオブジェクト メソッドのセットを定義します。

フレームワークは、ドライバーのいずれかのデバイスに送信される I/O 要求を受信すると、フレームワークは、適切な I/O キューに要求を配置します。 ドライバーが 1 つ以上の要求ハンドラーを登録する場合、フレームワークは I/O 要求が使用可能になるたびにドライバーに通知できます。 または、ドライバーは、要求の 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 キューへのハンドルを取得できます。

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

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

ドライバーが特定の種類の要求に対して I/O キューを提供せず、ドライバーがファンクション ドライバーの場合、フレームワークは完了状態の値 STATUS_INVALID_DEVICE_REQUEST で、その種類の要求を完了します。 ドライバーがフィルター ドライバーであり、WdfFdoInitSetFilter を呼び出した場合、フレームワークは自動的にドライバー スタック内の次の下位ドライバーにこれらの要求を転送します。 したがって、たとえば、読み取り要求を処理しないフィルター ドライバーは、読み取り要求を受信する I/O キューを提供する必要はありません。

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