WdfRequestForwardToIoQueue 関数 (wdfrequest.h)
[KMDF と UMDF に適用]
WdfRequestForwardToIoQueue メソッドは、呼び出し元のドライバーの I/O キューのいずれかに I/O 要求を再キューします。
構文
NTSTATUS WdfRequestForwardToIoQueue(
[in] WDFREQUEST Request,
[in] WDFQUEUE DestinationQueue
);
パラメーター
[in] Request
フレームワーク要求オブジェクトへのハンドル。
[in] DestinationQueue
フレームワーク キュー オブジェクトへのハンドル。
戻り値
WdfRequestForwardToIoQueue 、操作が成功した場合にSTATUS_SUCCESSを返します。 それ以外の場合、このメソッドは次のいずれかの値を返す可能性があります。
リターン コード | 形容 |
---|---|
|
この値は、次のいずれかが発生した場合に返されます。
|
|
宛先キューが新しい要求を受け入れていません。 |
このメソッドは、他の NTSTATUS 値返す場合もあります。
ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。
備考
ドライバーは、I/O 要求 所有 必要があり、その I/O キューのいずれかから要求を取得している必要があります。
ソース キューと宛先キューを同じにすることはできません。 言い換えると、ドライバー WdfRequestForwardToIoQueue を呼び出して、元のキューに要求を返すことはできません。 同じキューに要求を再キューするには、WdfRequestRequeueを使用します。
ソース キューと宛先キューの両方が同じデバイスに属している必要があります。
要求を取り消し可能にすることはできません。 ドライバーが WdfRequestMarkCancelable 呼び出した場合、または要求を取り消し可能にするために WdfRequestMarkCancelableEx を した場合は、WdfRequestForwardToIoQueue 呼び出す前 WdfRequestUnmarkCancelable を呼び出す必要があります。
ドライバーが WdfRequestForwardToIoQueue 呼び出した後、フレームワークが新しいキューからドライバーに要求を配信するまで、ドライバーは再キューされた要求を所有しません。 要求が新しいキューにある間、フレームワークは要求を所有し、ドライバーに通知せずに取り消すことができます。
WdfRequestForwardToIoQueue 戻る前に、次のイベントが発生する可能性があります。
- 宛先キューが空の場合、フレームワークは、再キューされた I/O 要求を、宛先キューの 要求ハンドラーのいずれかに配信。
- ソース キューの ディスパッチメソッド が順次または並列である場合、フレームワークは、ソース キューの要求ハンドラーのいずれかに別の要求を配信できます。
例
次のコード例は、PCIDRV サンプル ドライバーからの evtIoDeviceControl コールバック関数 です。 受信した要求に IOCTL_NDISPROT_INDICATE_STATUS の I/O 制御コードが含まれている場合、ドライバーは WdfRequestForwardToIoQueue を呼び出して、要求を別の I/O キューに移動します。
VOID
PciDrvEvtIoDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
{
NTSTATUS status= STATUS_SUCCESS;
PFDO_DATA fdoData = NULL;
WDFDEVICE hDevice;
WDF_REQUEST_PARAMETERS params;
UNREFERENCED_PARAMETER(OutputBufferLength);
UNREFERENCED_PARAMETER(InputBufferLength);
hDevice = WdfIoQueueGetDevice(Queue);
fdoData = FdoGetData(hDevice);
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
switch (IoControlCode)
{
case IOCTL_NDISPROT_QUERY_OID_VALUE:
NICHandleQueryOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_SET_OID_VALUE:
NICHandleSetOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_INDICATE_STATUS:
status = WdfRequestForwardToIoQueue(
Request,
fdoData->PendingIoctlQueue
);
if(!NT_SUCCESS(status)){
WdfRequestComplete(
Request,
status
);
break;
}
break;
default:
WdfRequestComplete(
Request,
STATUS_INVALID_DEVICE_REQUEST
);
break;
}
return;
}
必要条件
要件 | 価値 |
---|---|
ターゲット プラットフォーム の | 万国 |
最小 KMDF バージョン | 1.0 |
UMDF の最小バージョン を する | 2.0 |
ヘッダー | wdfrequest.h (Wdf.h を含む) |
ライブラリ | Wdf01000.sys (KMDF);WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
DDI コンプライアンス規則 を する | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |
関連項目
EvtDestroyCallback の
WdfRequestMarkCancelable の
WdfRequestMarkCancelableEx の
WdfRequestUnmarkCancelable の