WdfUsbTargetPipeFormatRequestForUrb 函数 (wdfusb.h)

[仅适用于 KMDF]

WdfUsbTargetPipeFormatRequestForUrb 方法使用指定的 URB 描述的请求参数为指定的 USB 管道生成 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,则驱动程序必须使用 WdfUsbTargetDeviceCreateUrbWdfUsbTargetDeviceCreateIsochUrb 来创建此内存对象中包含的 URB。

[in, optional] UrbMemoryOffset

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

返回值

如果操作成功,WdfUsbTargetPipeFormatRequestForUrb 将返回 I/O 目标的完成状态值。 否则,此方法可以返回以下值之一:

返回代码 说明
STATUS_INVALID_PARAMETER
检测到参数无效。
STATUS_INSUFFICIENT_RESOURCES
可用内存不足。
STATUS_INTEGER_OVERFLOW
指定的 UsbMemoryOffset 参数无效的偏移量。
STATUS_REQUEST_NOT_ACCEPTED
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) 每个请求对象,而不会冒STATUS_INSUFFICIENT_RESOURCES对 WdfRequestCreate 的调用返回值的风险。 如果参数值不更改,则对重用请求对象的 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)
Library Wdf01000.sys (请参阅框架库 Versioning.)
IRQL <=DISPATCH_LEVEL
DDI 符合性规则 DriverCreate (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) , KmdfIrqlExplicit (kmdf) , RequestFormattedValid (kmdf) RequestSendAndForgetNoFormatting (kmdf) RequestSendAndForgetNoFormatting2 (kmdf) UsbKmdfIrql (kmdf) UsbKmdfIrql2 (kmdf) 、UsbKmdfIrqlExplicit (kmdf)

另请参阅

WDFMEMORY_OFFSET

WdfMemoryCreate

WdfMemoryGetBuffer

WdfRequestCompleteWithInformation

WdfRequestSend

WdfRequestSetCompletionRoutine

WdfUsbInterfaceGetConfiguredPipe