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

从上一次调用 WdfUsbTargetDeviceCreateWithParameters获取的 USB 设备对象的句柄。

[in] Request

框架请求对象的句柄。 有关详细信息,请参阅以下“备注”部分。

[in] UrbMemory

框架内存对象的句柄,该对象包含 URB 结构或结构联合成员之一。 (所有 URB 结构的联合成员都包含 _URB_HEADER 结构。

如果驱动程序之前调用 WdfUsbTargetDeviceCreateWithParameters 来创建 UsbDevice,驱动程序必须使用 WdfUsbTargetDeviceCreateUrbWdfUsbTargetDeviceCreateIsochUrb 来创建此内存对象中包含的 URB。 否则,将进行 bug 检查。

[in, optional] UrbMemoryOffset

指向调用方分配的 WDFMEMORY_OFFSET 结构的指针,该结构提供可选的字节偏移量和长度值。 框架使用这些值来确定 UrbMemory 指定的内存中 URB 的起始地址。 如果此指针 NULL,则 URB 位于 UrbMemory 内存的开头。

返回值

WdfUsbTargetDeviceFormatRequestForUrb 如果作成功,则返回STATUS_SUCCESS。 否则,此方法可以返回以下值之一:

返回代码 描述
STATUS_INVALID_PARAMETER
检测到无效参数。
STATUS_INSUFFICIENT_RESOURCES
内存不足。
STATUS_INTEGER_OVERFLOW
指定的 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 目标。 请勿使用 发送和忘记选项 发送请求。

WdfUsbTargetDeviceFormatRequestForUrb 的多次调用,这些调用使用相同的请求不会导致额外的资源分配。 因此,为了减少 WdfRequestCreate 将返回STATUS_INSUFFICIENT_RESOURCES的可能性,驱动程序的 EvtDriverDeviceAdd 回调函数可以调用 WdfRequestCreate 来预分配设备的一个或多个请求对象。 驱动程序随后可以重复使用(调用 WdfRequestReuse)、重新格式化(调用 WdfUsbTargetDeviceFormatRequestForUrb),并重新发送(调用 WdfRequestSend)每个请求对象,而不会有STATUS_INSUFFICIENT_RESOURCES从以后调用 WdfRequestCreate返回值的风险。 如果参数值不更改,则对 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)
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)

另请参阅

EvtDriverDeviceAdd

WDFMEMORY_OFFSET

WdfRequestReuse

WdfRequestSend

WdfUsbTargetDeviceCreateWithParameters

WdfUsbTargetDeviceSendUrbSynchronously