다음을 통해 공유


USB 문자열 설명자

디바이스, 구성 및 인터페이스 설명자에는 문자열 설명자에 대한 참조가 포함될 수 있습니다. 이 항목에서는 디바이스에서 특정 문자열 설명자를 가져오는 방법을 설명합니다.

문자열 설명자는 하나의 기반 인덱스 번호로 참조됩니다. 문자열 설명자에는 하나 이상의 유니코드 문자열이 포함됩니다. 각 문자열은 다른 언어로의 번역입니다.

클라이언트 드라이버는 DescriptorType = USB_STRING_DESCRIPTOR_TYPE UsbBuildGetDescriptorRequest를 사용하여 문자열 설명자를 가져오는 요청을 작성합니다. Index 매개 변수는 인덱스 번호를 지정하고 LanguageID 매개 변수는 언어 ID를 지정합니다(Microsoft Win32 LANGID 값과 동일한 값이 사용됨). 드라이버는 디바이스에서 지원하는 언어 ID를 결정하기 위해 특수 인덱스 번호 0을 요청할 수 있습니다. 이 특수 값의 경우 디바이스는 유니코드 문자열이 아닌 언어 ID 배열을 반환합니다.

문자열 설명자는 가변 길이 데이터로 구성되므로 드라이버는 두 단계로 가져와야 합니다. 먼저 드라이버가 요청을 실행하여 문자열 설명자, USB_STRING_DESCRIPTOR 구조체에 대한 헤더를 저장할 수 있을 만큼 큰 데이터 버퍼를 전달해야 합니다. USB_STRING_DESCRIPTOR bLength 멤버는 전체 설명자의 크기(바이트)를 지정합니다. 그런 다음 드라이버는 bLength 크기의 데이터 버퍼를 사용하여 동일한 요청을 합니다.

다음 코드에서는 언어 ID langID를 사용하여 i-th 문자열 설명자를 요청하는 방법을 보여 줍니다.

USB_STRING_DESCRIPTOR USD, *pFullUSD;
UsbBuildGetDescriptorRequest(
    pURB, // points to the URB to be filled in
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_STRING_DESCRIPTOR_TYPE,
    i, // index of string descriptor
    langID, // language ID of string.
    &USD, // points to a USB_STRING_DESCRIPTOR.
    NULL,
    sizeof(USB_STRING_DESCRIPTOR),
    NULL
);
pFullUSD = ExAllocatePool(NonPagedPool, USD.bLength);
UsbBuildGetDescriptorRequest(
    pURB, // points to the URB to be filled in
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_STRING_DESCRIPTOR_TYPE,
    i, // index of string descriptor
    langID, // language ID of string
    pFullUSD,
    NULL,
    USD.bLength,
    NULL
);