IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX IOCTL (usbioctl.h)
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX 请求检索有关 USB 端口和附加到端口的设备的信息(如果有)。
客户端驱动程序必须在 PASSIVE_LEVEL IRQL 上发送此 IOCTL。
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX 是用户模式 I/O 控制请求。 此请求面向 USB 中心设备(GUID_DEVINTERFACE_USB_HUB)。
主要代码
输入/输出缓冲区
输入和输出缓冲区都指向调用方分配 USB_NODE_CONNECTION_INFORMATION_EX 结构。 输入时,ConnectionIndex 此结构的成员必须包含大于或等于 1 的数字,指示要报告其连接信息的端口数。 中心驱动程序返回 USB_NODE_CONNECTION_INFORMATION_EX的其余成员中的连接信息。 IRP,AssociatedIrp.SystemBuffer 成员指向 USB_NODE_CONNECTION_INFORMATION_EX 结构。
在输出中,USB_NODE_CONNECTION_INFORMATION_EX 结构接收有关来自 USB 中心驱动程序的指示连接的信息。
输入/输出缓冲区长度
USB_NODE_CONNECTION_INFORMATION_EX 结构的大小。
状态块
USB 堆栈 Irp->IoStatus.Status 设置为STATUS_SUCCESS(如果请求成功)。 否则,USB 堆栈会将 状态 设置为适当的错误条件,例如STATUS_INVALID_PARAMETER或STATUS_INSUFFICIENT_RESOURCES。
言论
以下示例演示如何通过发送此请求来获取中心端口的速度。
该函数指定要查询的中心设备和端口索引的符号链接。 返回时,pPortSpeed 指示:
- 端口速度
- SPEED_PATHERROR:如果无法打开路径。
- SPEED_IOCTLERROR:中心 IOCTL 失败。
void GetPortSpeed(const WCHAR *Path, ULONG PortIndex, UCHAR *pPortSpeed)
{
if (Path == NULL) { return; }
HANDLE handle = CreateFile(
Path,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
NULL,
NULL
);
if (handle == INVALID_HANDLE_VALUE)
{
*pPortSpeed = SPEED_PATHERROR;
return;
}
PUSB_NODE_CONNECTION_INFORMATION_EX ConnectionInfo =
(PUSB_NODE_CONNECTION_INFORMATION_EX)
malloc(sizeof(USB_NODE_CONNECTION_INFORMATION_EX));
ConnectionInfo->ConnectionIndex = PortIndex;
ULONG bytes = 0;
BOOL success = DeviceIoControl(handle,
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,
ConnectionInfo,
sizeof(USB_NODE_CONNECTION_INFORMATION_EX),
ConnectionInfo,
sizeof(USB_NODE_CONNECTION_INFORMATION_EX),
&bytes,
NULL);
CloseHandle(handle);
if (success == FALSE)
{
*pPortSpeed = SPEED_IOCTLERROR;
}
else
{
*pPortSpeed = (UCHAR)ConnectionInfo->Speed;
}
free(ConnectionInfo);
}
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP、Windows Server 2003 及更高版本。 |
标头 | usbioctl.h (包括 Usbioctl.h) |