IOCTL_GET_HCD_DRIVERKEY_NAME IOCTL(usbioctl.h)

IOCTL_GET_HCD_DRIVERKEY_NAME I/O 컨트롤 요청은 USB 호스트 컨트롤러 드라이버에 대한 레지스트리의 드라이버 키 이름을 검색합니다.

IOCTL_GET_HCD_DRIVERKEY_NAME 사용자 모드 I/O 제어 요청입니다. 이 요청은 USB 호스트 컨트롤러(GUID_DEVINTERFACE_USB_HOST_CONTROLLER)를 대상으로 합니다.

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

없음

입력 버퍼 길이

없음

출력 버퍼

ASSOCIATedIrp.SystemBuffer 멤버는 USB_HCD_DRIVERKEY_NAME 구조를 포함하는 호출자가 할당한 버퍼의 주소를 지정합니다. 출력에서 이 구조체는 드라이버 키 이름을 보유합니다. 자세한 내용은 설명 부분을 참조하세요.

출력 버퍼 길이

이 버퍼의 크기는 Parameters.DeviceIoControl.OutputBufferLength 멤버에 지정됩니다.

상태 블록

USB 스택은 요청이 성공하면 Irp-IoStatus.Status>를 STATUS_SUCCESS 설정합니다. 그렇지 않으면 USB 스택이 상태를 STATUS_INVALID_PARAMETER 또는 STATUS_INSUFFICIENT_RESOURCES 같은 적절한 오류 조건으로 설정합니다.

설명

레지스트리에서 드라이버 키 이름을 얻으려면 다음 작업을 수행해야 합니다.

  1. USB_HCD_DRIVERKEY_NAME 형식의 변수를 선언합니다.
  2. 출력 매개 변수에서 변수 의 주소와 크기를 지정하여 IOCTL_GET_HCD_DRIVERKEY_NAME 요청을 보냅니다. 반환될 때 USB_HCD_DRIVERKEY_NAMEActualLength 멤버에는 드라이버 키 이름으로 채워진 USB_HCD_DRIVERKEY_NAME 보관하기 위해 버퍼를 할당하는 데 필요한 길이가 포함됩니다.
  3. 버퍼에 대한 메모리를 할당하여 USB_HCD_DRIVERKEY_NAME 구조를 유지합니다. 버퍼의 크기는 받은 ActualLength 값이어야 합니다.
  4. 출력 매개 변수에서 할당 된 버퍼 및 해당 크기에 대한 포인터를 전달하여 IOCTL_GET_HCD_DRIVERKEY_NAME 요청을 보냅니다. 반환될 때 USB_HCD_DRIVERKEY_NAMEDriverKeyName 멤버는 호스트 컨트롤러 드라이버와 연결된 드라이버 키의 이름을 포함하는 null로 끝나는 유니코드 문자열입니다.
다음 예제 코드에서는 IOCTL_GET_HCD_DRIVERKEY_NAME I/O 컨트롤 요청을 보내는 방법을 보여 드립니다.

/*++

Routine Description:

This routine prints the name of the driver key associated with
the specified host controller driver.

Arguments:

HCD - Handle for host controller driver.

Return Value: Boolean that indicates success or failure.

--*/

BOOL GetHCDDriverKeyName (HANDLE  HCD)
{
    BOOL                    success;
    ULONG                   nBytes;
    USB_HCD_DRIVERKEY_NAME  driverKeyName;
    PUSB_HCD_DRIVERKEY_NAME driverKeyNameW;

    driverKeyNameW = NULL;

    // 1. Get the length of the name of the driver key.
    success = DeviceIoControl(HCD,
        IOCTL_GET_HCD_DRIVERKEY_NAME,
        NULL,
        0,
        &driverKeyName,
        sizeof(driverKeyName),
        &nBytes,
        NULL);

    if (!success) 
    {
        printf("First IOCTL_GET_HCD_DRIVERKEY_NAME request failed\n");
        goto GetHCDDriverKeyNameDone;
    }

    //2. Get the length of the driver key name.
    nBytes = driverKeyName.ActualLength;

    if (nBytes <= sizeof(driverKeyName)) 
    {
        printf("Incorrect length received by IOCTL_GET_HCD_DRIVERKEY_NAME.\n");
        goto GetHCDDriverKeyNameDone;
    }

    // 3. Allocate memory for a USB_HCD_DRIVERKEY_NAME
    //    to hold the driver key name.
    driverKeyNameW = (PUSB_HCD_DRIVERKEY_NAME) malloc(nBytes);

    if (driverKeyNameW == NULL) 
    {
        printf("Failed to allocate memory.\n");
        goto GetHCDDriverKeyNameDone;
    }

    // Get the name of the driver key of the device attached to
    // the specified port.
    success = DeviceIoControl(HCD,
        IOCTL_GET_HCD_DRIVERKEY_NAME,
        NULL,
        0,
        driverKeyNameW,
        nBytes,
        &nBytes,
        NULL);

    if (!success) 
    {
        printf("Second IOCTL_GET_HCD_DRIVERKEY_NAME request failed.\n");
        goto GetHCDDriverKeyNameDone;
    }

    // print the driver key name. 
    printf("Driver Key Name: %s.\n", driverKeyNameW->DriverKeyName);


GetHCDDriverKeyNameDone:

    // Cleanup.
    // Free the allocated memory for USB_HCD_DRIVERKEY_NAME.

    if (driverKeyNameW != NULL) 
    {
        free(driverKeyNameW);
        driverKeyNameW = NULL;
    }

    return success;
}


요구 사항

요구 사항
헤더 usbioctl.h(Usbioctl.h 포함)

추가 정보

USB_HCD_DRIVERKEY_NAME