Функция WdfRequestWdmFormatUsingStackLocation (wdfrequest.h)
[Применимо только к KMDF]
Метод WdfRequestWdmFormatUsingStackLocation форматирует запрос ввода-вывода путем копирования содержимого указанного расположения стека ввода-вывода ввода-вывода структуры в следующее расположение стека в запросе.
Синтаксис
void WdfRequestWdmFormatUsingStackLocation(
[in] WDFREQUEST Request,
[in] PIO_STACK_LOCATION Stack
);
Параметры
[in] Request
Дескриптор объекта запроса платформы.
[in] Stack
Указатель на IO_STACK_LOCATION структуру, содержащую предоставленные драйвером сведения.
Возвращаемое значение
Никакой
Замечания
Ошибка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Метод 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) |