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を返します。 それ以外の場合、このメソッドは次のいずれかの値を返す可能性があります。
リターン コード | 説明 |
---|---|
|
指定されたWDF_REQUEST_FORWARD_OPTIONS構造体のサイズが無効です。 |
|
指定されたWDF_REQUEST_FORWARD_OPTIONS構造体のメンバーに無効な値が含まれています。 |
|
この値は、次のいずれかが発生した場合に返されます。
|
|
指定された I/O キューが新しい要求を受け入れていません。 |
このメソッドは、他の NTSTATUS 値も返す場合があります。
ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。
注釈
ドライバーは 、WdfRequestForwardToParentDeviceIoQueue を呼び出す前に、 WdfPdoInitAllowForwardingRequestToParent を呼び出す必要があります。
ドライバーは、親デバイスと子デバイスの両方のデータ バッファー (バッファー、直接、またはどちらも) に アクセスするために 、同じメソッドを使用する必要があります。
ドライバーが WdfRequestForwardToParentDeviceIoQueue を呼び出して I/O 要求を再キューする場合、ドライバーは要求オブジェクトをタイマー オブジェクトや作業項目オブジェクトなどの他のフレームワーク オブジェクトの親として使用することはできません。
ドライバーが WdfDeviceInitSetRequestAttributes を呼び出して親デバイスの要求オブジェクトのコンテキスト空間を指定した場合、フレームワークは、ドライバーが子デバイスのキューで受け取るオブジェクトを要求するためにこのコンテキスト領域を追加しません。 ドライバーは WdfObjectAllocateContext を呼び出して、ドライバーが WdfRequestForwardToParentDeviceIoQueue を呼び出す前に、要求オブジェクトにコンテキスト空間を追加できます。 一方、ドライバーが子デバイスの要求オブジェクトに対して 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 |
Header | wdfrequest.h (Wdf.h を含む) |
Library | Wdf01000.sys (「Framework ライブラリのバージョン管理」を参照)。 |
IRQL | <=DISPATCH_LEVEL |
DDI コンプライアンス規則 | DriverCreate(kmdf) |