IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX IOCTL (usbioctl.h)
Запрос IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX получает сведения о USB-порте и устройстве, подключенном к порту , если таковой имеется.
Клиентские драйверы должны отправлять этот IOCTL в IRQL PASSIVE_LEVEL.
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX — это запрос на управление вводом-выводом в пользовательском режиме. Этот запрос предназначен для 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) |