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 结构的指针。
返回值
无
备注
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
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 |
标头 | wdfrequest.h (包括 Wdf.h) |
Library | Wdf01000.sys (请参阅框架库版本控制.) |
IRQL | <=DISPATCH_LEVEL |
DDI 符合性规则 | DriverCreate (kmdf) 、 InvalidReqAccess (kmdf) 、 InvalidReqAccessLocal (kmdf) 、 KmdfIrql (kmdf) 、 KmdfIrql2 (kmdf) 、KmdfIrqlExplicit (kmdf) , RequestFormattedValid (kmdf) |