WdfRequestForwardToIoQueue 函数 (wdfrequest.h)
[适用于 KMDF 和 UMDF]
WdfRequestForwardToIoQueue 方法将 I/O 请求重新排队到调用驱动程序的 I/O 队列之一。
语法
NTSTATUS WdfRequestForwardToIoQueue(
[in] WDFREQUEST Request,
[in] WDFQUEUE DestinationQueue
);
参数
[in] Request
框架请求对象的句柄。
[in] DestinationQueue
框架队列对象的句柄。
返回值
如果操作成功,WdfRequestForwardToIoQueue 将返回STATUS_SUCCESS。 否则,此方法可能会返回以下值之一:
返回代码 | 说明 |
---|---|
|
如果发生以下任一情况,则返回此值:
|
|
目标队列不接受新请求。 |
此方法还可能返回其他 NTSTATUS 值。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
注解
驱动程序必须 拥有 I/O 请求,并且必须已从其 I/O 队列之一获取请求。
源队列和目标队列不能相同。 换句话说,驱动程序无法调用 WdfRequestForwardToIoQueue 将请求返回到它来自的队列。 若要将请求重新排队到同一队列,请使用 WdfRequestRequeue。
源队列和目标队列必须属于同一设备。
请求不得取消。 如果驱动程序已调用 WdfRequestMarkCancelable 或 WdfRequestMarkCancelableEx 以使请求可取消,则必须在调用 WdfRequestForwardToIoQueue 之前调用 WdfRequestUnmarkCancelable。
在驱动程序调用 WdfRequestForwardToIoQueue 之后,在框架将请求从新队列传递到驱动程序之前,驱动程序不会拥有重新排队的请求。 当请求位于新队列中时,框架拥有该请求,并且可以取消它,而无需通知驱动程序。
在 WdfRequestForwardToIoQueue 返回之前,可能发生以下事件:
有关 WdfRequestForwardToIoQueue 的详细信息,请参阅重新排队 I/O 请求和管理 I/O 队列。示例
以下代码示例是 PCIDRV 示例驱动程序中的 EvtIoDeviceControl 回调函数。 如果收到的请求包含 IOCTL_NDISPROT_INDICATE_STATUS 的 I/O 控制代码,驱动程序会调用 WdfRequestForwardToIoQueue 将请求移到其他 I/O 队列。
VOID
PciDrvEvtIoDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
{
NTSTATUS status= STATUS_SUCCESS;
PFDO_DATA fdoData = NULL;
WDFDEVICE hDevice;
WDF_REQUEST_PARAMETERS params;
UNREFERENCED_PARAMETER(OutputBufferLength);
UNREFERENCED_PARAMETER(InputBufferLength);
hDevice = WdfIoQueueGetDevice(Queue);
fdoData = FdoGetData(hDevice);
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
switch (IoControlCode)
{
case IOCTL_NDISPROT_QUERY_OID_VALUE:
NICHandleQueryOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_SET_OID_VALUE:
NICHandleSetOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_INDICATE_STATUS:
status = WdfRequestForwardToIoQueue(
Request,
fdoData->PendingIoctlQueue
);
if(!NT_SUCCESS(status)){
WdfRequestComplete(
Request,
status
);
break;
}
break;
default:
WdfRequestComplete(
Request,
STATUS_INVALID_DEVICE_REQUEST
);
break;
}
return;
}
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfrequest.h (包括 Wdf.h) |
Library | Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
DDI 符合性规则 | DeferredRequestCompleted (kmdf) 、 DriverCreate (kmdf) 、 InvalidReqAccess (kmdf) 、 InvalidReqAccessLocal () kmdf) 、 KmdfIrql (kmdf) 、 KmdfIrql2 (kmdf) 、KmdfIrqlExplicit (kmdf) , RequestCompleted (kmdf) 、 RequestCompletedLocal (kmdf) |