_URB_CONTROL_TRANSFER_EX 结构 (usb.h)

USB 客户端驱动程序使用 _URB_CONTROL_TRANSFER_EX 结构将数据传入或传出控制管道,超时会限制可接受的传输时间。

语法

struct _URB_CONTROL_TRANSFER_EX {
  struct _URB_HEADER   Hdr;
  USBD_PIPE_HANDLE     PipeHandle;
  ULONG                TransferFlags;
  ULONG                TransferBufferLength;
  PVOID                TransferBuffer;
  PMDL                 TransferBufferMDL;
  ULONG                Timeout;
  ULONG                Pad;
  struct _URB_HCD_AREA hca;
  UCHAR                SetupPacket[8];
};

成员

Hdr

指向指定 URB 标头信息的 _URB_HEADER 结构的指针。 hdr.Function 必须为 URB_FUNCTION_CONTROL_TRANSFER_EX,Hdr.Length 必须为 sizeof(_URB_CONTROL_TRANSFER_EX)

PipeHandle

管道的句柄。

如果目标为默认控制终结点,则 PipeHandle 必须为 NULL。 在这种情况下, TransferFlags 必须包含 USBD_DEFAULT_PIPE_TRANSFER 标志。

如果目标为非默认控制终结点, PipeHandle 将指定控件管道的不透明句柄。 当客户端驱动程序选择具有 URB_FUNCTION_SELECT_CONFIGURATION 类型的 URB 的设备配置时,或者当客户端驱动程序更改具有 URB_FUNCTION_SELECT_INTERFACE 类型的 URB 的接口的设置时,主机控制器驱动程序将返回此句柄。

TransferFlags

指定以下标志的零、一或组合:

含义
USBD_TRANSFER_DIRECTION_IN
设置为从设备请求数据。 若要将数据传输到设备,必须清除此标志。
USBD_TRANSFER_DIRECTION_OUT
设置为将数据传输到设备。 设置此标志等效于清除USBD_TRANSFER_DIRECTION_IN标志。
USBD_SHORT_TRANSFER_OK
设置为指示主机控制器在从设备接收的数据包时不返回错误,该数据包短于终结点的最大数据包大小。 终结点的最大数据包大小报告在USB_DEVICE_DESCRIPTOR结构的 bMaxPacketSize0 成员中, (默认控制终结点的设备描述符) 。 对于非默认控制终结点,最大数据包大小在USB_ENDPOINT_DESCRIPTOR结构的 wMaxPacketSize 成员中设置, (终结点描述符) 。

当主控制器收到长度短于控制终结点上的 wMaxPacketSize 值的数据包时,根据主机控制器的类型,行为如下所示:

  • 在 EHCI 主控制器上,主机控制器会立即进入控制传输的状态阶段。 无论是否设置了USBD_SHORT_TRANSFER_OK,传输都成功完成。
  • 在 UHCI 和 OHCI 主机控制器上,如果设置了USBD_SHORT_TRANSFER_OK,则主机控制器将进入状态阶段。 如果未设置USBD_SHORT_TRANSFER_OK,则主机控制器将放弃控制传输的数据和状态阶段,并且传输完成并显示错误。
USBD_DEFAULT_PIPE_TRANSFER
设置为指示主控制器在默认控制管道上执行控件传输。 这允许调用方将命令发送到默认控件管道,而无需显式指定管道句柄。

TransferBufferLength

指定 TransferBuffer 中指定的缓冲区或 TransferBufferMDL 中所述的缓冲区的长度(以字节为单位)。 主控制器驱动程序返回在此成员的管道中发送到管道或从管道读取的字节数。

TransferBuffer

指向传输的常驻缓冲区的指针;如果在 TransferBufferMDL 中提供了 MDL,则为 NULL。 此缓冲区的内容取决于 TransferFlags 的值。 如果指定了USBD_TRANSFER_DIRECTION_IN,则此缓冲区将包含从主机控制器驱动程序返回时从设备读取的数据。 否则,此缓冲区包含驱动程序提供的数据以传输到设备。

TransferBufferMDL

指向描述常驻缓冲区的 MDL 的指针;如果 TransferBuffer 中提供了缓冲区,则为 NULL。 缓冲区的内容取决于 TransferFlags 的值。 如果指定了USBD_TRANSFER_DIRECTION_IN,则描述的缓冲区将包含从主机控制器驱动程序返回时从设备读取的数据。 否则,缓冲区包含驱动程序提供的数据,以便传输到设备。 必须从非分页池中分配此 MDL。

Timeout

指示 URB 超时之前的时间(以毫秒为单位)。值为 0 表示此 URB 没有超时。

Pad

保留。 请勿使用。

hca

保留。 请勿使用。

SetupPacket[8]

指定 USB 定义的请求设置数据包。 USB 核心规范中提供了 USB 请求设置数据包的格式。

注解

此 URB 结构与 _URB_CONTROL_TRANSFER 相同,只是 Timeout 成员为 URB 建立超时。

此结构的保留成员必须被视为不透明成员,并保留供系统使用。

要求

要求
最低受支持的客户端 在 Windows Vista 和更高版本的操作系统中可用。
标头 usb.h (包括 Usb.h)

另请参阅

URB

USB 结构

_URB_CONTROL_TRANSFER

_URB_HEADER