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).

Основной код

IRP_MJ_DEVICE_CONTROL

Буфер входных и выходных данных

Входные и выходные буферы указывают на структуру, выделенную вызывающим объектом 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)

См. также раздел

USB_NODE_CONNECTION_INFORMATION

USB_NODE_CONNECTION_INFORMATION_EX