次の方法で共有


WdfRequestWdmFormatUsingStackLocation 関数 (wdfrequest.h)

[KMDF にのみ適用]

WdfRequestWdmFormatUsingStackLocation メソッドは、指定された WDM I/O スタックの場所構造の内容を要求内の次のスタックの場所にコピーすることで、I/O 要求の書式を設定します。

構文

void WdfRequestWdmFormatUsingStackLocation(
  [in] WDFREQUEST         Request,
  [in] PIO_STACK_LOCATION Stack
);

パラメーター

[in] Request

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

[in] Stack

ドライバーが提供する情報を含む IO_STACK_LOCATION 構造体へのポインター。

戻り値

なし

解説

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

WdfRequestWdmFormatUsingStackLocation メソッドは、Stack パラメーターによって提供される情報を、要求内の次の IRP スタックの場所にコピーします。

WdfRequestWdmFormatUsingStackLocation は、要求の I/O ターゲット オブジェクトがローカルであるかリモートであるかに関係なく、要求の書式を設定します。

要求の完了ルーチンを設定する場合、ドライバーは WdfRequestWdmFormatUsingStackLocation を呼び出した後に WdfRequestSetCompletionRoutine を呼び出す必要があります。

WdfRequestWdmFormatUsingStackLocation の詳細については、「転送 I/O 要求」を参照してください。

次のコード例では、I/O 要求 のIO_STACK_LOCATION 構造を提供し、 CompletionRoutine コールバック関数を設定してから、その要求を I/O ターゲットに送信します。

IO_STACK_LOCATION  ioStackLocation;
BOOLEAN sendStatus;
...
//
// Initialize the IO_STACK_LOCATION structure here.
//
...
//
// Assign the IO_STACK_LOCATION structure to the request.
//
WdfRequestWdmFormatUsingStackLocation(
                                      request,
                                      &ioStackLocation
                                      );
//
// Assign a CompletionRoutine callback function.
//
WdfRequestSetCompletionRoutine(
                               Request,
                               RequestTimeoutComplete,
                               NULL
                               );
//
// Send the request.
//
sendStatus = WdfRequestSend(
                            Request,
                            target,
                            NULL
                            );

次のコード例は、PNP IRP_MN_QUERY_CAPABILITIES IRP を IO ターゲットに送信する方法を示しています。

target = WdfDeviceGetIoTarget(Device);
status = WdfRequestCreate(WDF_NO_OBJECT_ATTRIBUTES,
                          target,
                          &request);

if (!NT_SUCCESS(status)) {
    // Log failure and leave
}

//
// PnP IRPs must be initialized with STATUS_NOT_SUPPORTED
//
WDF_REQUEST_REUSE_PARAMS_INIT(&reuse,
                              WDF_REQUEST_REUSE_NO_FLAGS,
                              STATUS_NOT_SUPPORTED);

WdfRequestReuse(request, &reuse);


//
// Initialize device capabilities
//
RtlZeroMemory(Capabilities, sizeof(DEVICE_CAPABILITIES));
Capabilities->Size = sizeof(DEVICE_CAPABILITIES);
Capabilities->Version  =  1;
Capabilities->Address  = (ULONG) -1;
Capabilities->UINumber = (ULONG) -1;
RtlZeroMemory(&stack, sizeof(stack));
stack.MajorFunction = IRP_MJ_PNP;
stack.MinorFunction = IRP_MN_QUERY_CAPABILITIES;
stack.Parameters.DeviceCapabilities.Capabilities = Capabilities;

WdfRequestWdmFormatUsingStackLocation(request, &stack);

WDF_REQUEST_SEND_OPTIONS_INIT(&options,
                              WDF_REQUEST_SEND_OPTION_SYNCHRONOUS);

if (WdfRequestSend(request, target, &options) == FALSE) {
    // Log failure
}

status = WdfRequestGetStatus(request);

if (!NT_SUCCESS(status)) {
    // Log failure
}

// Remember to delete the WDFREQUEST after creating it
if (request != NULL) {
    WdfObjectDelete(request);
}

要件

要件
対象プラットフォーム ユニバーサル
最小 KMDF バージョン 1.0
Header wdfrequest.h (Wdf.h を含む)
Library Wdf01000.sys (「Framework ライブラリのバージョン管理」を参照)。
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 DriverCreate(kmdf)InvalidReqAccess(kmdf)InvalidReqAccessLocal(kmdf)KmdfIrql(kmdf)KmdfIrql2(kmdf)、KmdfIrqlExplicit(kmdf)、 RequestFormattedValid(kmdf)

こちらもご覧ください

WdfRequestSetCompletionRoutine