处理 USB 主控制器驱动程序中的 I/O 请求

用于处理 UCX 发送的 I/O 请求的主控制器驱动程序的最佳做法。

UCX 跟踪由 USB 总线上的设备的主机控制器驱动程序创建的所有终结点。 中心驱动程序或 USB 设备堆栈中较高位置的其他驱动程序发送的任何数据传输请求首先由 UCX 处理。 UCX 负责将框架请求对象转发到正确的终结点队列。 请求中包含的 USB 请求块 (URB) 可以指定终结点句柄。 如果指定了终结点句柄,UCX 会在设备存在的终结点中检查相应的终结点。 如果存在指定的终结点句柄,则请求将转发到终结点的队列。 如果未找到指定的终结点句柄,则请求失败。 如果未指定句柄,则请求针对默认终结点,UCX 会将请求转发到该设备的主控制器驱动程序的默认终结点队列。

为了确保与现有 USB 驱动程序兼容,主机控制器在完成 URB 请求时必须符合以下要求:

  • 必须在DISPATCH_LEVEL调用 WdfRequestComplete
  • 如果 URB 已传递到其框架队列,并且驱动程序开始在调用驱动程序的线程或 DPC 上同步处理它,则不应同步完成请求。 必须在单独的 DPC 上完成请求,该 DPC 可以通过调用 WdfDpcEnqueue 进行计划。
  • 与上述要求类似,在收到 EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUEEVT_WDF_REQUEST_CANCEL时,主机控制器驱动程序必须在与调用线程或 DPC 不同的 DPC 上完成 URB 请求。 默认情况下,WDF 同步完成队列中已取消的请求。 该行为可能会导致 URB 请求出现问题。 因此,驱动程序必须为其 URB 队列提供 EvtIoCanceledOnQueue 回调。

IOCTL_INTERNAL_USB_SUBMIT_URB的框架请求对象包含位于请求的 Parameters.Others.Arg1 中的 URB。 请求完成后,URB 状态必须设置为USBD_STATUS_SUCCESS或指示失败性质的失败状态。 失败状态值在 usb.h 头文件中定义。