WdfUsbTargetDeviceFormatRequestForUrb 函数 (wdfusb.h)
[仅适用于 KMDF]
WdfUsbTargetDeviceFormatRequestForUrb 方法使用 URB 描述的请求参数为指定的 USB 设备生成 USB 请求,但不会发送请求。
语法
NTSTATUS WdfUsbTargetDeviceFormatRequestForUrb(
[in] WDFUSBDEVICE UsbDevice,
[in] WDFREQUEST Request,
[in] WDFMEMORY UrbMemory,
[in, optional] PWDFMEMORY_OFFSET UrbMemoryOffset
);
参数
[in] UsbDevice
USB 设备对象的句柄,该对象是从之前调用 WdfUsbTargetDeviceCreateWithParameters 获取的。
[in] Request
框架请求对象的句柄。 有关更多信息,请参见下面的“备注”部分。
[in] UrbMemory
框架内存对象的句柄,该对象包含 URB 结构或结构的联合成员之一。 (所有 URB 结构的联合成员都包含 _URB_HEADER 结构。)
如果驱动程序以前调用 WdfUsbTargetDeviceCreateWithParameters 来创建 UsbDevice,则驱动程序必须使用 WdfUsbTargetDeviceCreateUrb 或 WdfUsbTargetDeviceCreateIsochUrb 来创建此内存对象中包含的 URB。 否则,将发生 bug 检查。
[in, optional] UrbMemoryOffset
指向调用方分配 的WDFMEMORY_OFFSET 结构的指针,该结构提供可选的字节偏移量和长度值。 框架使用这些值来确定 UrbMemory 指定的内存中 URB 的起始地址。 如果此指针为 NULL,则 URB 位于 UrbMemory 内存的开头。
返回值
如果操作成功,WdfUsbTargetDeviceFormatRequestForUrb 将返回STATUS_SUCCESS。 否则,此方法可返回以下值之一:
返回代码 | 说明 |
---|---|
|
检测到无效的参数。 |
|
内存不足。 |
|
指定的 UsbMemoryOffset 参数无效的偏移量。 |
此方法还可能返回其他 NTSTATUS 值。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
注解
使用 WdfUsbTargetDeviceFormatRequestForUrb(后跟 WdfRequestSend)以同步或异步方式发送 USB 控制传输请求。 或者,使用 WdfUsbTargetDeviceSendUrbSynchronously 方法以同步方式发送请求。
可以转发驱动程序在 I/O 队列中收到的 I/O 请求,也可以创建并发送新请求。
若要转发驱动程序在 I/O 队列中收到的 I/O 请求,请为 WdfUsbTargetDeviceFormatRequestForUrb 方法的 Request 参数指定接收的请求句柄。
若要创建新的 I/O 请求,请调用 WdfRequestCreate 以预分配请求对象。 为 WdfUsbTargetDeviceFormatRequestForUrb 方法的 Request 参数提供 请求 句柄。 可以通过调用 WdfRequestReuse 重用请求对象。 驱动程序的 EvtDriverDeviceAdd 回调函数可以预分配设备的请求对象。
调用 WdfUsbTargetDeviceFormatRequestForUrb 以格式化 I/O 请求后,驱动程序必须调用 WdfRequestSend 以同步或异步方式将请求 () 发送到 I/O 目标。 请勿使用 send and forget 选项 发送请求。
对使用相同请求的 WdfUsbTargetDeviceFormatRequestForUrb 的多次调用不会导致额外的资源分配。 因此,为了降低 WdfRequestCreate 返回STATUS_INSUFFICIENT_RESOURCES的可能性,驱动程序的 EvtDriverDeviceAdd 回调函数可以调用 WdfRequestCreate 来预分配设备的一个或多个请求对象。 驱动程序随后可以重用 (调用 WdfRequestReuse) 、重新格式化 (调用 WdfUsbTargetDeviceFormatRequestForUrb) ,并重新发送 (调用 WdfRequestSend) 每个请求对象,而不会有从以后调用 WdfRequestCreate STATUS_INSUFFICIENT_RESOURCES返回值的风险。 如果参数值不更改,对 WdfUsbTargetDeviceFormatRequestForUrb 的所有后续调用都将返回STATUS_SUCCESS。 (如果驱动程序不每次调用相同的请求格式设置方法,则可能会分配其他资源。)
有关在 I/O 请求完成后获取状态信息的信息,请参阅 获取完成信息。
有关 WdfUsbTargetDeviceFormatRequestForUrb 方法和 USB I/O 目标的详细信息,请参阅 USB I/O 目标。
示例
下面的代码示例创建一个内存对象来保存 URB 结构,初始化 URB 结构,并调用 WdfUsbTargetDeviceFormatRequestForUrb 来格式化使用 URB 结构的内容的请求。 然后,该示例注册一个 CompletionRoutine 回调函数,并将请求发送到 I/O 目标。
WDFMEMORY urbMemory;
URB *urbBuffer;
status = WdfMemoryCreate(
WDF_NO_OBJECT_ATTRIBUTES,
NonPagedPool,
0,
sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST),
&urbMemory,
NULL
);
if (!NT_SUCCESS(status)){
return status;
}
urbBuffer = (PURB) WdfMemoryGetBuffer(
urbMemory,
NULL
);
urbBuffer->UrbHeader.Function = URB_FUNCTION_GET_CONFIGURATION;
urbBuffer->UrbHeader.Length = sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST);
urbBuffer->UrbControlGetConfigurationRequest.TransferBufferLength = 1 ;
urbBuffer->UrbControlGetConfigurationRequest.TransferBufferMDL = NULL;
urbBuffer->UrbControlGetConfigurationRequest.TransferBuffer = outBuffer;
urbBuffer->UrbControlGetConfigurationRequest.UrbLink = NULL;
status = WdfUsbTargetDeviceFormatRequestForUrb(
deviceContext->WdfUsbTargetDevice,
request,
urbMemory,
NULL
);
WdfRequestSetCompletionRoutine(
request,
MyCompletionRoutine,
NULL);
if (WdfRequestSend(
request,
WdfUsbTargetDeviceGetIoTarget(UsbDevice),
NULL
) == FALSE) {
status = WdfRequestGetStatus(request);
}
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
最低 KMDF 版本 | 1.0 |
标头 | wdfusb.h (包括 Wdfusb.h) |
Library | 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) |