次の方法で共有


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を返します。 それ以外の場合、このメソッドは次のいずれかの値を返す可能性があります。

リターン コード 形容
STATUS_INVALID_DEVICE_REQUEST
この値は、次のいずれかが発生した場合に返されます。
  • ドライバーが I/O キューから要求を取得しませんでした。
  • ソース キューと宛先キューは同じです。
  • ソース キューと宛先キューが同じデバイスに属していません。
  • ドライバーは要求を所有していません。
  • 要求は取り消し可能です。
STATUS_WDF_BUSY
宛先キューが新しい要求を受け入れていません。
 

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

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

備考

ドライバーは、I/O 要求 所有 必要があり、その I/O キューのいずれかから要求を取得している必要があります。

ソース キューと宛先キューを同じにすることはできません。 言い換えると、ドライバー WdfRequestForwardToIoQueue を呼び出して、元のキューに要求を返すことはできません。 同じキューに要求を再キューするには、WdfRequestRequeueを使用します。

ソース キューと宛先キューの両方が同じデバイスに属している必要があります。

要求を取り消し可能にすることはできません。 ドライバーが WdfRequestMarkCancelable 呼び出した場合、または要求を取り消し可能にするために WdfRequestMarkCancelableEx した場合は、WdfRequestForwardToIoQueue 呼び出す前 WdfRequestUnmarkCancelable を呼び出す必要があります。

ドライバーが WdfRequestForwardToIoQueue 呼び出した後、フレームワークが新しいキューからドライバーに要求を配信するまで、ドライバーは再キューされた要求を所有しません。 要求が新しいキューにある間、フレームワークは要求を所有し、ドライバーに通知せずに取り消すことができます。

WdfRequestForwardToIoQueue 戻る前に、次のイベントが発生する可能性があります。

  • 宛先キューが空の場合、フレームワークは、再キューされた I/O 要求を、宛先キューの 要求ハンドラーのいずれかに配信
  • ソース キューの ディスパッチメソッド が順次または並列である場合、フレームワークは、ソース キューの要求ハンドラーのいずれかに別の要求を配信できます。
WdfRequestForwardToIoQueueの詳細については、「I/O 要求 の再キュー と 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(&params);
    WdfRequestGetParameters(
                            Request,
                            &params
                            );

    switch (IoControlCode)
    {
        case IOCTL_NDISPROT_QUERY_OID_VALUE:
            NICHandleQueryOidRequest(
                                     Queue,
                                     Request,
                                     &params
                                     );
            break;

        case IOCTL_NDISPROT_SET_OID_VALUE:
            NICHandleSetOidRequest(
                                   Queue,
                                   Request,
                                   &params
                                   );
            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

WdfRequestRequeue

WdfRequestUnmarkCancelable