Функция WdfRequestWdmFormatUsingStackLocation (wdfrequest.h)

[Применяется только к KMDF]

Метод WdfRequestWdmFormatUsingStackLocation форматирует запрос ввода-вывода, копируя содержимое указанной структуры расположения стека ввода-вывода WDM в следующее расположение стека в запросе.

Синтаксис

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

Параметры

[in] Request

Дескриптор объекта запроса платформы.

[in] Stack

Указатель на структуру IO_STACK_LOCATION , содержащую предоставленные драйвером сведения.

Возвращаемое значение

None

Remarks

Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.

Метод WdfRequestWdmFormatUsingStackLocation копирует сведения, предоставленные параметром Stack , в следующее расположение стека IRP в запросе.

WdfRequestWdmFormatUsingStackLocation форматирует запрос независимо от того, является ли целевой объект ввода-вывода запроса локальным или удаленным.

Если вы хотите задать подпрограмму завершения для запроса, драйвер должен вызвать WdfRequestSetCompletionRoutine после вызова WdfRequestWdmFormatUsingStackLocation.

Дополнительные сведения о WdfRequestWdmFormatUsingStackLocation см. в разделе Пересылка запросов ввода-вывода.

Примеры

В следующем примере кода предоставляется структура IO_STACK_LOCATION для запроса ввода-вывода, устанавливается функция обратного вызова CompletionRoutine , а затем отправляется запрос в целевой объект ввода-вывода.

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 в целевой объект ввода-вывода.

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
Верхняя часть wdfrequest.h (включая Wdf.h)
Библиотека Wdf01000.sys (см. раздел Управление версиями библиотеки платформы).
IRQL <=DISPATCH_LEVEL
Правила соответствия DDI DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf)

См. также раздел

WdfRequestSetCompletionRoutine