WdfUsbTargetPipeSendUrbSynchronously 函数 (wdfusb.h)

[仅适用于 KMDF]

WdfUsbTargetPipeSendUrbSynchronously 方法使用指定的 URB 描述的请求参数为指定的 USB 管道生成 USB 请求。

语法

NTSTATUS WdfUsbTargetPipeSendUrbSynchronously(
  [in]           WDFUSBPIPE                Pipe,
  [in, optional] WDFREQUEST                Request,
  [in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
  [in]           PURB                      Urb
);

参数

[in] Pipe

通过调用 WdfUsbInterfaceGetConfiguredPipe 获取的框架管道对象的句柄。

[in, optional] Request

框架请求对象的句柄。 此参数是可选的,可以为 NULL。 有关更多信息,请参见下面的“备注”部分。

[in, optional] RequestOptions

指向调用方分配 的WDF_REQUEST_SEND_OPTIONS 结构的指针,该结构指定请求的选项。 此指针是可选的,可以为 NULL。 有关更多信息,请参见下面的“备注”部分。

[in] Urb

指向驱动程序初始化的 URB 结构的指针。

如果驱动程序以前调用 WdfUsbTargetDeviceCreateWithParameters 来创建 UsbDevice,则驱动程序必须使用 WdfUsbTargetDeviceCreateUrbWdfUsbTargetDeviceCreateIsochUrb 来创建此 URB。

返回值

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

返回代码 说明
STATUS_INFO_LENGTH_MISMATCH
指定的 RequestOptions 参数不正确WDF_REQUEST_SEND_OPTIONS结构的大小。
STATUS_INVALID_PARAMETER
检测到无效的参数。
STATUS_INSUFFICIENT_RESOURCES
可用内存不足。
STATUS_INVALID_DEVICE_REQUEST
调用方的 IRQL 未PASSIVE_LEVEL,或者指定的 I/O 请求已排队到 I/O 目标。
STATUS_IO_TIMEOUT
驱动程序提供了超时值,但请求未在分配的时间内完成。
STATUS_REQUEST_NOT_ACCEPTED
请求参数表示的 I/O 请求数据包 (IRP) 不提供足够的IO_STACK_LOCATION结构来允许驱动程序转发请求。
 

此方法还可能返回其他 NTSTATUS 值

如果驱动程序提供无效的对象句柄,则会发生 bug 检查。

注解

使用 WdfUsbTargetPipeSendUrbSynchronously 方法以同步方式发送 USB 请求。 若要异步发送此类请求,请使用 WdfUsbTargetPipeFormatRequestForUrb,然后使用 WdfRequestSend

WdfUsbTargetPipeSendUrbSynchronously 方法在请求完成之前不会返回,除非驱动程序在 RequestOptions 参数指向的WDF_REQUEST_SEND_OPTIONS结构中提供超时值,或者除非检测到错误。

框架不检查 USB 请求。 如果请求更改 USB 管道的状态,框架将不知道更改。

可以转发驱动程序在 I/O 队列中收到的 I/O 请求,也可以创建并发送新请求。

若要转发驱动程序在 I/O 队列中收到的 I/O 请求,请为 WdfUsbTargetPipeSendUrbSynchronously 方法的 Request 参数指定接收的请求句柄。

若要创建并发送新请求,请为 Request 参数提供 NULL请求 句柄,或创建新的请求对象并提供其句柄:

  • 如果提供 NULL 请求句柄,框架将使用内部请求对象。 此方法易于使用,但驱动程序无法取消请求。
  • 如果调用 WdfRequestCreate 来创建一个或多个请求对象,可以通过调用 WdfRequestReuse 重用这些请求对象。 此方法使驱动程序的 EvtDriverDeviceAdd 回调函数能够预分配设备的请求对象。 此外,如果需要,另一个驱动程序线程可以调用 WdfRequestCancelSentRequest 来取消请求。
无论驱动程序提供非 NULL 还是 NULL 请求参数,驱动程序都可以指定非 NULLRequestOptions 参数。 例如,可以使用 RequestOptions 参数指定超时值。

有关在 I/O 请求完成后获取状态信息的信息,请参阅 获取完成信息

有关 WdfUsbTargetPipeSendUrbSynchronously 方法和 USB I/O 目标的详细信息,请参阅 USB I/O 目标

示例

下面的代码示例初始化 URB 并将 URB 发送到 USB 管道。

URB  urb;
PURB  pUrb = NULL;
NTSTATUS status;

pUrb = &urb;
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 = WdfUsbTargetPipeSendUrbSynchronously(
                                              Pipe,
                                              Request,
                                              NULL,
                                              pUrb
                                              );

要求

要求
目标平台 通用
最低 KMDF 版本 1.0
标头 wdfusb.h (包括 Wdfusb.h)
Library Wdf01000.sys (请参阅框架库版本控制.)
IRQL PASSIVE_LEVEL
DDI 符合性规则 DriverCreate (kmdf) IoctlReqs (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf) , SyncReqSend (kmdf) UsbKmdfIrql (kmdf) UsbKmdfIrql2 (kmdf) 、 UsbKmdfIrqlExplicit (kmdf)

另请参阅

WDF_REQUEST_SEND_OPTIONS

WdfRequestCancelSentRequest

WdfUsbInterfaceGetConfiguredPipe