I/O 要求をキューに戻す
ドライバーは、I/O キューから取得した I/O 要求を再度キューにいれることができます。 ドライバーは、同じデバイスに対してドライバーが作成した別の I/O キューに I/O 要求を再度キューにいれることができます。 さらに、バス ドライバーは、子デバイスの I/O キューから親デバイスの I/O キューに I/O 要求を再度キューにいれることができます。
デバイスの別の I/O キューへの I/O 要求の再キューイング
ドライバーの要求ハンドラーがドライバーの I/O キューから I/O 要求を受信した後、ドライバーは WdfRequestForwardToIoQueue を呼び出して、要求を別のキューへ再度いれることができます。
たとえば、ドライバーが要求を処理する前に要求にリソースを割り当てる場合、ドライバーの EvtIoDefault コールバック関数は、すべての要求を受信し、各要求のコンテキスト メモリにリソース情報を格納し、WdfRequestForwardToIoQueue を呼び出して各要求を追加のキューに再度入れることができます。
ドライバーが WdfRequestForwardToIoQueue を呼び出して、シーケンシャル ディスパッチ メソッドを使用している I/O キューから取得したドライバーの I/O 要求を再度キューにいれる場合、フレームワークは、再度キューにいれられた要求が完了するのを待たずに、順次キューから次の I/O 要求をドライバーに配信します。
ドライバーが手動ディスパッチ メソッドを使用している場合は、WdfRequestRequeue メソッドを呼び出して、ドライバーが取得した I/O キューの先頭に I/O 要求を返すことができます。 WdfRequestRequeue を呼び出した後、ドライバーが次に WdfIoQueueRetrieveNextRequest を呼び出すと、再度キューにいれられた要求が取得されます。
親デバイスの I/O キューへの I/O 要求の再キューイング
親デバイスのファンクション ドライバーは、親デバイスの子デバイスを列挙し、子デバイスの物理デバイス オブジェクト (PDO) を作成するバス ドライバーとして機能できます。 このようなドライバーは、親デバイスが処理する必要がある子デバイスの I/O 要求を受け取ることがあります。
たとえば、プロトコル バス (USB など) は、通常、接続されている各デバイスに割り当てられるハードウェア リソースを制御します。 そのため、親バスのファンクション ドライバーは通常、各子デバイスの I/O 操作を処理します。 I/O マネージャーがいずれかの子デバイスのデバイス スタックに I/O 要求を送信すると、そのドライバーが子デバイスの PDO を作成したため、バスのファンクション ドライバーは、子デバイスの I/O キューのいずれかで I/O 要求を受信します。 ドライバーは、親バス デバイスのコンテキストで I/O 要求を処理する前に、子デバイスの I/O キューから親デバイスに属している I/O キューに I/O 要求を再度いれる必要があります。
ただし、ドライバーは、子のキューから親のキューに要求を移動する WdfRequestForwardToIoQueue を呼び出すことはできません。 I/O マネージャーは、親デバイスと子デバイスの個別のデバイス スタックを作成するため、基になる WDM デバイス オブジェクトは、最初に子デバイスを表すオブジェクトから親を表す WDM デバイス オブジェクトに変更する必要があります。
KMDF のバージョン 1.9 より前では、ドライバーは、リモート I/O ターゲットを作成し、子デバイスのデバイス スタックのサイズを大きくし、適切な WDM デバイス オブジェクトを指定することによってのみ、子デバイスから親に I/O 要求を送信できました。
KMDF バージョン 1.9 以降では、ドライバーは、子デバイスを作成する前に WdfPdoInitAllowForwardingRequestToParent を呼び出してから、WdfRequestForwardToParentDeviceIoQueue を呼び出して、子の I/O キューから親キューに要求を再度いれることが可能です。 ドライバーが WdfPdoInitAllowForwardingRequestToParent と WdfRequestForwardToParentDeviceIoQueue を使用する場合、フレームワークは子のデバイス スタック サイズを増やし、正しい WDM デバイス オブジェクトを I/O 要求に割り当てます。