I/O 要求のディスパッチ方法

ドライバーは、WdfIoQueueCreate を呼び出して I/O キューを作成する際、キューのディスパッチ メソッドを指定します。 フレームワークには、順次並列手動の 3 つのディスパッチ メソッドが用意されています。 ドライバーは、デバイスの既定の I/O キューを含め、任意の I/O キューに対してこれらのディスパッチ メソッドのいずれかを指定できます。

ドライバーは、キューの WDF_IO_QUEUE_CONFIG 構造体で WDF_IO_QUEUE_DISPATCH_TYPE 型指定された値を指定することによって、キューのディスパッチ メソッドを設定します。

各ディスパッチ方法の使用例については、「I/O キューの使用例」を参照してください。

順次ディスパッチ

ドライバーまたはデバイスがキューからの I/O 要求を一度に 1 つだけしか処理できない場合は、同期ディスパッチとも呼ばれる順次ディスパッチを使用するようにデバイスの I/O キューを設定する必要があります。 この種類のディスパッチでは、フレームワークは一度に 1 つずつドライバーに要求を配信します。 フレームワークは、ドライバーが前の要求を完了キャンセル、または再度キューに入れるまで、次の要求を配信しません。

フレームワークがドライバーの要求ハンドラーのいずれかに要求を配信した後、ドライバーは要求を処理します。 ドライバーは、一般的な I/O ターゲットに要求を転送する場合、通常 I/O ターゲット オブジェクトの同期メソッドのいずれかを呼び出します。 これらのメソッドの詳細については、「I/O 要求を同期的に送信する」を参照してください。 ドライバーはI/O キューから受信するすべての要求を、最終的に完了するか取り消す必要があります。

順次ディスパッチ用に I/O キューを設定したドライバーは、WdfIoQueueRetrieveNextRequest または WdfIoQueueRetrieveRequestByFileObject を呼び出して、最後に受信した要求が完了または取り消しされる前にキューから別の要求を取得できます。 ドライバーの EvtInterruptDpc コールバック関数がまだ前のハードウェア操作からのデータを処理している間に、ドライバーが次のハードウェア操作を開始できるように、ファンクション ドライバーでこれを行う場合があります。

複数の I/O キューを作成し、それらをすべて順次ディスパッチ用に設定すると、フレームワークは各キューからの要求を順番にディスパッチしますが、キューは並列で実行されます。 ドライバーまたはデバイスが任意の種類の要求を一度に 1 つしか処理できない場合は、EvtIoDefault コールバック関数で 1 つの I/O キューを使用する必要があります。

並列ディスパッチ

ドライバーとデバイスが複数の I/O 要求を同時に処理できる場合は、ドライバーが非同期的に要求を処理できるように、並列ディスパッチを使用するようにデバイスの I/O キューを設定できます。 このディスパッチ メソッドは、非同期ディスパッチとも呼ばれます。

ドライバーが並列ディスパッチを使用するように I/O キューを設定した場合、フレームワークは、I/O 要求がキューで使用可能になるとすぐにドライバーに配信します。 その結果、ドライバーが一度に複数の要求を処理する必要がある場合があります。

ドライバーのいずれかの要求ハンドラーが要求を受信するたびに、ドライバーは要求を処理し、要求を完了する必要があります。 ドライバーは、一般的な I/O ターゲットに要求を転送する場合、通常 I/O ターゲット オブジェクトの非同期メソッドのいずれかを呼び出します。 これらのメソッドの詳細については、「I/O 要求を非同期的に送信する」を参照してください。 ドライバーはI/O キューから受信するすべての要求を、最終的に完了するか取り消す必要があります。

並列ディスパッチを使用するドライバーは、WdfIoQueueStop または WdfIoQueueStopSynchronousously を呼び出してキューを一時的に停止してから、WdfIoQueueStart を呼び出してキューを再開できます。

手動ディスパッチ

ドライバーが I/O 要求の配信を完全に制御できるようにする場合は、手動ディスパッチを使用するようにデバイスの I/O キューを設定できます。つまり、ドライバーが明示的に要求しない限り、フレームワークはドライバーに要求を配信しません。

手動キューから要求を取得するために、ドライバーは、キューをポーリングするループで WdfIoQueueRetrieveNextRequest または WdfIoQueueRetrieveRequestByFileObject を呼び出すことができます。 または、ドライバーは WdfIoQueueReadyNotify を呼び出して、キューで 1 つ以上の要求が使用可能になったときにフレームワークが呼び出すコールバック関数を登録できます。 フレームワークがコールバック関数を呼び出した後、ドライバーは WdfIoQueueRetrieveNextRequest または WdfIoQueueRetrieveRequestByFileObject を要求を取得するループ内で呼び出しできます。

ドライバーは、キューから要求を取得した後、要求を処理する必要があります。 ドライバーは各要求を、最終的に完了するかキャンセルする必要があります。