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)를 대상으로 합니다.

주 코드

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