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,驱动程序必须使用 WdfUsbTargetDeviceCreateUrb 或 WdfUsbTargetDeviceCreateIsochUrb 来创建此 URB。
返回值
WdfUsbTargetPipeSendUrbSynchronously 如果操作成功,则返回 I/O 目标的完成状态值。 否则,此方法可能会返回以下值之一:
返回代码 | 描述 |
---|---|
|
指定的 RequestOptions 参数 WDF_REQUEST_SEND_OPTIONS 结构的大小不正确。 |
|
检测到无效参数。 |
|
内存不足。 |
|
调用方的 IRQL 未PASSIVE_LEVEL,或者指定的 I/O 请求已排队到 I/O 目标。 |
|
驱动程序提供了超时值,请求未在分配的时间内完成。 |
|
Request 参数表示的 I/O 请求数据包(IRP),不提供足够的 IO_STACK_LOCATION 结构,使驱动程序能够转发请求。 |
此方法还可以返回其他
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
言论
使用 WdfUsbTargetPipeSendUrbSynchronously 方法同步发送 USB 请求。 若要异步发送此类请求,请使用 WdfUsbTargetPipeFormatRequestForUrb,后跟 WdfRequestSend。
WdfUsbTargetPipeSendUrbSynchronously 方法在请求完成之前不会返回,除非驱动程序在 WDF_REQUEST_SEND_OPTIONS 结构中提供 RequestOptions 参数指向的超时值,或者除非检测到错误。
框架不检查 USB 请求。 如果请求更改 USB 管道的状态,框架将不知道更改。
可以转发驱动程序在 I/O 队列中收到的 I/O 请求,也可以创建并发送新请求。
若要转发驱动程序在 I/O 队列中收到的 I/O 请求,请为 WdfUsbTargetPipeSendUrbSynchronously 方法的 Request 参数指定收到的请求的句柄。
若要创建和发送新请求,请为 请求 参数提供 NULL 请求句柄,或创建新的请求对象并提供其句柄:
- 如果提供 NULL 请求句柄,框架将使用内部请求对象。 此方法易于使用,但驱动程序无法取消请求。
- 如果调用 WdfRequestCreate 来创建一个或多个请求对象,可以通过调用 WdfRequestReuse来重复使用这些请求对象。 通过此方法,驱动程序的 EvtDriverDeviceAdd 回调函数可以预分配设备的请求对象。 此外,另一个驱动程序线程可以根据需要调用 WdfRequestCancelSentRequest 以取消请求。
有关在 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) |
库 | Wdf01000.sys(请参阅框架库版本控制。 |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | DriverCreate(kmdf),IoctlReqs(kmdf),KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)、SyncReqSend(kmdf)、UsbKmdfIrql(kmdf)、UsbKmdfIrql2(kmdf)、UsbKmdfIrqlExplicit(kmdf) |