WdfDeviceEnqueueRequest 函数 (wdfdevice.h)
[仅适用于 KMDF]
WdfDeviceEnqueueRequest 方法将指定的 I/O 请求传递给框架,以便框架随后可以将请求添加到驱动程序为指定设备创建的 I/O 队列之一。
语法
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
参数
[in] Device
框架设备对象的句柄。
[in] Request
框架请求对象的句柄。
返回值
如果操作成功,该方法将返回STATUS_SUCCESS。 其他返回值包括:
返回代码 | 说明 |
---|---|
|
可用内存量较低。 |
|
驱动程序尚未为设备创建任何 I/O 队列,并且驱动程序不是筛选器驱动程序。 |
|
设备的 I/O 队列不接受请求。 |
该方法可能会返回其他 NTSTATUS 值。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
注解
驱动程序只能从 EvtIoInCallerContext 回调函数调用 WdfDeviceEnqueueRequest。
WdfDeviceEnqueueRequest 方法将请求添加到驱动程序针对设备的特定于请求类型的 I/O 队列(如果驱动程序已创建)。 否则, 方法会将请求添加到设备的默认队列(如果驱动程序已创建一个队列)。
如果驱动程序尚未为设备创建任何 I/O 队列, 则 WdfDeviceEnqueueRequest 将执行以下操作:
- 如果驱动程序是筛选器驱动程序, 则 WdfDeviceEnqueueRequest 会将请求发送到驱动程序的 I/O 目标。
- 如果驱动程序不是筛选器驱动程序, 则 WdfDeviceEnqueueRequest 返回STATUS_INVALID_DEVICE_REQUEST。
因此,如果驱动程序在调用 WdfDeviceEnqueueRequest 后需要使用请求或其上下文,则应在调用 WdfDeviceEnqueueRequest 之前对请求进行引用。
为此,驱动程序可以在调用 WdfDeviceEnqueueRequest 之前调用 WdfObjectReference,然后在调用 WdfDeviceEnqueueRequest 之后调用 WdfObjectDereference。 在退出 EvtIoInCallerContext 之前,驱动程序必须取消引用请求。
有关 WdfDeviceEnqueueRequest 方法的详细信息,请参阅 管理 I/O 队列。
对于 1.0 和 1.5 版 KMDF,必须在 PASSIVE_LEVEL 调用 WdfDeviceEnqueueRequest 。 对于版本 1.7 及更高版本,可以在 IRQL <= DISPATCH_LEVEL 调用 WdfDeviceEnqueueRequest。
示例
下面的代码示例是一个 EvtIoInCallerContext 回调函数,该函数查找包含自定义 I/O 控件代码的请求,IOCTL_NONPNP_METHOD_NEITHER。 如果未找到 I/O 控制代码,回调函数将请求返回给框架。 如果回调函数找到 I/O 控制代码,它会预处理请求,然后将其返回到框架。 如果遇到错误,回调函数将完成请求。
VOID
MyEvtDeviceIoInCallerContext(
IN WDFDEVICE Device,
IN WDFREQUEST Request
)
{
NTSTATUS status = STATUS_SUCCESS;
WDF_REQUEST_PARAMETERS params;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
if(!(params.Type == WdfRequestTypeDeviceControl &&
params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
}
//
// Found a match for the control code. Preprocess the request, and then
// return the request to the framework.
//
//...(Preprocess the request here.)
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
End:
WdfRequestComplete(
Request,
status
);
return;
}
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
最低 KMDF 版本 | 1.0 |
标头 | wdfdevice.h (包括 Wdf.h) |
Library | Wdf01000.sys (请参阅框架库 Versioning.) |
IRQL | <= DISPATCH_LEVEL (请参阅备注部分) |
DDI 符合性规则 | DeferredRequestCompleted (kmdf) 、 DriverCreate (kmdf) 、 KmdfIrql (kmdf) 、 KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf) , RequestCompleted (kmdf) , RequestCompletedLocal (kmdf) |