次の方法で共有


WdfRequestForwardToParentDeviceIoQueue 関数 (wdfrequest.h)

[KMDF にのみ適用]

WdfRequestForwardToParentDeviceIoQueue メソッドは、子デバイスの I/O キューから子の親デバイスの指定された I/O キューに I/O 要求を再キューします。

構文

NTSTATUS WdfRequestForwardToParentDeviceIoQueue(
  [in] WDFREQUEST                   Request,
  [in] WDFQUEUE                     ParentDeviceQueue,
  [in] PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
);

パラメーター

[in] Request

フレームワーク要求オブジェクトへのハンドル。

[in] ParentDeviceQueue

フレームワーク キュー オブジェクトへのハンドル。

[in] ForwardOptions

呼び出し元によって割り当てられた WDF_REQUEST_FORWARD_OPTIONS 構造体へのポインター。

戻り値

WdfRequestForwardToParentDeviceIoQueue は、操作が成功した場合にSTATUS_SUCCESSを返します。 それ以外の場合、このメソッドは次のいずれかの値を返す可能性があります。

リターン コード 形容
STATUS_INFO_LENGTH_MISMATCH
指定されたWDF_REQUEST_FORWARD_OPTIONS構造体のサイズが無効です。
STATUS_INVALID_PARAMETER
指定されたWDF_REQUEST_FORWARD_OPTIONS構造体のメンバーに無効な値が含まれています。
STATUS_INVALID_DEVICE_REQUEST
この値は、次のいずれかが発生した場合に返されます。
  • ドライバーが I/O キューから I/O 要求を取得しませんでした。
  • ソース I/O キューと宛先 I/O キューは同じです。
  • 指定された I/O キューが親デバイスに属していません。
  • ドライバーは、保証された前方進行状況 を有効にしており、指定された I/O 要求はメモリ不足の状況のために予約されています。
  • ドライバーが WdfPdoInitAllowForwardingRequestToParent 呼び出しませんでした。
STATUS_WDF_BUSY
指定された I/O キューが新しい要求を受け入れていません。
 

このメソッドは、他の NTSTATUS 値返す場合もあります。

ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。

備考

ドライバーが WdfRequestForwardToParentDeviceIoQueue 呼び出すには、WdfPdoInitAllowForwardingRequestToParentを呼び出す必要があります。

ドライバーは、同じ メソッドを使用して、親デバイスと子デバイスの両方のデータ バッファー (バッファー、直接、またはどちらも) にアクセスする必要があります。

ドライバーが WdfRequestForwardToParentDeviceIoQueue を呼び出して I/O 要求を再キューする場合、ドライバーは要求オブジェクトをタイマー オブジェクトや作業項目オブジェクトなどの他のフレームワーク オブジェクトの親として使用してはなりません。

ドライバーが WdfDeviceInitSetRequestAttributes を呼び出して、 デバイスの要求オブジェクトの コンテキスト空間を指定した場合、フレームワークは、ドライバーが子デバイスのキューで受け取るオブジェクトを要求するためにこのコンテキスト領域を追加しません。 ドライバーは、WdfRequestForwardToParentDeviceIoQueue を呼び出す前に、WdfObjectAllocateContext を呼び出して、要求オブジェクトコンテキスト領域を追加できます。 一方、WdfDeviceInitSetRequestAttributes というドライバーが、 デバイスの要求オブジェクトの を呼び出し、親デバイスの要求オブジェクトが子デバイスのコンテキスト空間以下のコンテキスト空間を使用する場合、ドライバーは WdfObjectAllocateContext 呼び出さずに要求オブジェクトのコンテキスト空間を使用できます。

現時点では、ドライバーは、すべての再キューされた I/O 要求に 送信および忘れるオプションを使用する必要があります。 そのため、フレームワークが再キュー化された要求オブジェクトを削除する時点までに、要求オブジェクトを最初に受信した子デバイスが既に削除されている可能性があることに注意してください。 したがって、EvtCleanupCallback または EvtDestroyCallback 関数が実行される前にリソースが削除される可能性があるため、ドライバーは、EvtCleanupCallback または evtDestroyCallback 関数を使用して子デバイス リソースにアクセスすることはできません。

WdfRequestForwardToParentDeviceIoQueueの詳細については、「I/O 要求のキューに入れ直す」を参照してください。

次のコード例では、最初に I/O 要求を受信したデバイスの親デバイスを特定し、その後、親デバイスの既定の I/O キューに I/O 要求を再キューします。

WDFDEVICE device, parentDevice;
WDF_REQUEST_FORWARD_OPTIONS forwardOptions;
NTSTATUS status;

device = WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request));
parentDevice = WdfPdoGetParent(device);

WDF_REQUEST_FORWARD_OPTIONS_INIT(&forwardOptions);
status = WdfRequestForwardToParentDeviceIoQueue(
             Request,
             WdfDeviceGetDefaultQueue(parentDevice),
             &forwardOptions
             );
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(
                       Request,
                       status
                       );
  }

必要条件

要件 価値
ターゲット プラットフォーム 万国
最小 KMDF バージョン 1.9
ヘッダー wdfrequest.h (Wdf.h を含む)
ライブラリ Wdf01000.sys (フレームワーク ライブラリのバージョン管理を参照)。
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 する DriverCreate(kmdf)

関連項目

WdfPdoInitAllowForwardingRequestToParent