我可以使用 IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 从 DeviceIsOperatingAtSuperSpeedPlusOrHigher 获取 USB 3.2 Gen 2(10Gb/s) 当前链接的单通道信息。 如何使用 Windows API 获取 USB 3.2 Gen 2x2 设备的当前链接通道数?
到目前为止,答案是“不,没有办法请求此信息”。
但是 Windows 11 Build 26100 附带了新的 DeviceIoControl 调用 IOCTL_USB_GET_NODE_CONNECTION_SUPERSPEEDPLUS_INFORMATION,它填充了 USB_NODE_CONNECTION_SUPERSPEEDPLUS_INFORMATION 结构。
需要 USB 设备集线器的句柄,输入是 ConnectionIndex(又名端口号)和结构大小。
大多数输出值始终相同,唯一的变体是 RxLaneCount 和 TxLaneCount,它们对于 1 个通道为 0,对于 2 个通道为 1。
IOCTL_USB_GET_NODE_CONNECTION_SUPERSPEEDPLUS_INFORMATION
USB_NODE_CONNECTION_SUPERSPEEDPLUS_INFORMATION sspi = {
nPort, sizeof(USB_NODE_CONNECTION_SUPERSPEEDPLUS_INFORMATION)
};
DWORD dwBytesReturned;
int res = DeviceIoControl(hHub,
IOCTL_USB_GET_NODE_CONNECTION_SUPERSPEEDPLUS_INFORMATION,
&sspi, sizeof(sspi),
&sspi, sizeof(sspi),
&dwBytesReturned, NULL);
如何打开集线器并确定我在此处显示的端口号: 如何重新启动 USB 端口
这是 UsbTreeView V4.4 的组成部分:
-------- Connection SuperSpeedPlus Information --------
Length : 0x18 (24 bytes)
Connection Index : 0x03 (3)
Rx.SublinkSpeedAttrID : 0x01 (ID 1)
Rx.LaneSpeedExponent : 0x03 (Lane Speed Exponent is 9 -> Gbit/s)
Rx.SublinkTypeMode : 0x00 (Symmetric)
Rx.SublinkTypeDir : 0x00 (Receive Mode)
Rx.Reserved : 0x00
Rx.LinkProtocol : 0x01 (SuperSpeedPlus)
Rx.LaneSpeedMantissa : 0x000A (Lane Speed Mantissa is 10)
Rx.LaneCount : 0x00 (1 Lane)
Tx.SublinkSpeedAttrID : 0x01 (ID 1)
Tx.LaneSpeedExponent : 0x03 (Lane Speed Exponent is 9 -> Gbit/s)
Tx.SublinkTypeMode : 0x00 (Symmetric)
Tx.SublinkTypeDir : 0x01 (Transmit Mode)
Tx.Reserved : 0x00
Tx.LinkProtocol : 0x01 (SuperSpeedPlus)
Tx.LaneSpeedMantissa : 0x000A (Lane Speed Mantissa is 10)
Tx.LaneCount : 0x00 (1 Lane)
-> Rx speed is 10 Gbps
-> Tx speed is 10 Gbps
不幸的是,微软没有更新 USB 端口功能报告,USB_PROTOCOLS 枚举以“Usb300”结尾,因此仍然无法确定端口是否支持 SuperSpeed 以外的功能。