WdfUsbTargetPipeFormatRequestForUrb 函数 (wdfusb.h)
[仅适用于 KMDF]
WdfUsbTargetPipeFormatRequestForUrb 方法使用指定的 URB 描述的请求参数生成 USB 请求,但不会发送请求。
语法
NTSTATUS WdfUsbTargetPipeFormatRequestForUrb(
WDFUSBPIPE PIPE,
[in] WDFREQUEST Request,
[in] WDFMEMORY UrbMemory,
[in, optional] PWDFMEMORY_OFFSET UrbMemoryOffset
);
参数
PIPE
通过调用 WdfUsbInterfaceGetConfiguredPipe获取的框架管道对象的句柄。
[in] Request
框架请求对象的句柄。 有关详细信息,请参阅以下“备注”部分。
[in] UrbMemory
包含 URB 结构的框架内存对象的句柄。
如果驱动程序之前调用 WdfUsbTargetDeviceCreateWithParameters 来创建 UsbDevice,驱动程序必须使用 WdfUsbTargetDeviceCreateUrb 或 WdfUsbTargetDeviceCreateIsochUrb 来创建此内存对象中包含的 URB。
[in, optional] UrbMemoryOffset
指向调用方分配的 WDFMEMORY_OFFSET 结构的指针,该结构提供可选的字节偏移量和长度值。 框架使用这些值来确定 UrbMemory 指定的内存中 URB 的起始地址。 如果此指针 NULL,则 URB 位于 UrbMemory 内存的开头。
返回值
WdfUsbTargetPipeFormatRequestForUrb 如果作成功,则返回 I/O 目标的完成状态值。 否则,此方法可以返回以下值之一:
返回代码 | 描述 |
---|---|
|
检测到无效参数。 |
|
内存不足。 |
|
指定的 UsbMemoryOffset 参数的偏移量无效。 |
|
Request 参数表示的 I/O 请求数据包(IRP),不提供足够的 IO_STACK_LOCATION 结构,使驱动程序能够转发请求。 |
此方法还可以 返回其他NTSTATUS 值。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
言论
使用 WdfUsbTargetPipeFormatRequestForUrb(后跟 WdfRequestSend)同步或异步发送 USB 请求。 或者,使用 WdfUsbTargetPipeSendUrbSynchronously 方法同步发送请求。
框架不检查 USB 请求。 如果请求更改 USB 管道的状态,框架将不知道更改。
可以转发驱动程序在 I/O 队列中收到的 I/O 请求,也可以创建并发送新请求。
若要转发驱动程序在 I/O 队列中收到的 I/O 请求,请为 WdfUsbTargetPipeFormatRequestForUrb 方法的 Request 参数指定收到的请求的句柄。
若要创建新的 I/O 请求,请调用 WdfRequestCreate 来预分配请求对象。 提供 WdfUsbTargetPipeFormatRequestForUrb 方法的 Request 参数的请求句柄。 可以通过调用 WdfRequestReuse来重用请求对象,因此驱动程序的 EvtDriverDeviceAdd 回调函数可以预分配设备的请求对象。
调用 WdfUsbTargetPipeFormatRequestForUrb 格式化 I/O 请求后,驱动程序必须调用 WdfRequestSend 以同步或异步方式将请求(同步或异步)发送到 I/O 目标。
对 WdfUsbTargetPipeFormatRequestForUrb 的多次调用(使用同一请求)不会导致额外的资源分配。 因此,为了减少 WdfRequestCreate 将返回STATUS_INSUFFICIENT_RESOURCES的可能性,驱动程序的 EvtDriverDeviceAdd 回调函数可以调用 WdfRequestCreate 来预分配设备的一个或多个请求对象。 驱动程序随后可以重复使用(调用 WdfRequestReuse)、重新格式化(调用 WdfUsbTargetPipeFormatRequestForUrb),并重新发送(调用 WdfRequestSend)每个请求对象,而不会危及以后调用 WdfRequestCreate的STATUS_INSUFFICIENT_RESOURCES返回值。 如果参数值不更改,则对 WdfUsbTargetPipeFormatRequestForUrb 的所有后续调用都将返回STATUS_SUCCESS。 (如果驱动程序每次不调用相同的请求格式方法,可能会分配其他资源。
有关在 I/O 请求完成后获取状态信息的信息,请参阅 获取完成信息。
有关 WdfUsbTargetPipeFormatRequestForUrb 方法和 USB I/O 目标的详细信息,请参阅 USB I/O 目标。
例子
下面的代码示例创建一个表示 URB 的内存对象。 然后,该示例初始化 URB,格式化包含 URB 的 USB 请求,注册 CompletionRoutine 回调函数,并发送请求。
URB urb;
PURB pUrb = NULL;
WDFMEMORY urbMemory
NTSTATUS status;
status = WdfMemoryCreate(
WDF_NO_OBJECT_ATTRIBUTES,
NonPagedPool,
0,
sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER),
&urbMemory,
NULL
);
if (!NT_SUCCESS(status)){
return status;
}
pUrb = WdfMemoryGetBuffer(
urbMemory,
NULL
);
pUrb->UrbHeader.Length = (USHORT) sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER);
pUrb->UrbHeader.Function = URB_FUNCTION_GET_CURRENT_FRAME_NUMBER;
pUrb->UrbGetCurrentFrameNumber.FrameNumber = 0;
status = WdfUsbTargetPipeFormatRequestForUrb(
pipe,
Request,
urbMemory,
NULL
);
if (!NT_SUCCESS(status)) {
goto Exit;
}
WdfRequestSetCompletionRoutine(
Request,
UrbCompletionRoutine,
pipe
);
if (WdfRequestSend(
Request,
WdfUsbTargetPipeGetIoTarget(pipe),
WDF_NO_SEND_OPTIONS
) == FALSE) {
status = WdfRequestGetStatus(Request);
goto Exit;
}
Exit:
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(
Request,
status,
0
);
}
return;
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
最低 KMDF 版本 | 1.0 |
标头 | wdfusb.h (包括 Wdfusb.h) |
库 | Wdf01000.sys(请参阅框架库版本控制。 |
IRQL | <=DISPATCH_LEVEL |
DDI 符合性规则 | DriverCreate(kmdf),KmdfIrql(kmdf),KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf),RequestFormattedValid(kmdf),RequestSendAndForgetNoFormatting(kmdf), RequestSendAndForgetNoFormatting2(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf) |
另请参阅
WdfRequestCompleteWithInformation