Compartilhar via


Descritores de Cadeia de Caracteres de USB

Os descritores de dispositivo, configuração e interface podem conter referências a descritores de cadeia de caracteres. Este tópico descreve como obter um descritor de cadeia de caracteres específico do dispositivo.

Os descritores de cadeia de caracteres são referenciados pelo número de índice baseado em um. Um descritor de cadeia de caracteres contém uma ou mais cadeias de caracteres Unicode; cada cadeia de caracteres é uma tradução das outras em outro idioma.

Client drivers use UsbBuildGetDescriptorRequest, with DescriptorType = USB_STRING_DESCRIPTOR_TYPE, to build the request to obtain a string descriptor. The Index parameter specifies the index number, and the LanguageID parameter specifies the language ID (the same values are used as in Microsoft Win32 LANGID values). Os drivers podem solicitar o número de índice especial de zero para determinar quais IDs de idioma o dispositivo dá suporte. Para esse valor especial, o dispositivo retorna uma matriz de IDs de idioma em vez de uma cadeia de caracteres Unicode.

Como o descritor de cadeia de caracteres consiste em dados de comprimento variável, o driver deve obtê-los em duas etapas. Primeiro, o driver deve emitir a solicitação, passando um buffer de dados grande o suficiente para manter o cabeçalho de um descritor de cadeia de caracteres, uma estrutura USB_STRING_DESCRIPTOR. The bLength member of USB_STRING_DESCRIPTOR specifies the size in bytes of the entire descriptor. The driver then makes the same request with a data buffer of size bLength.

The following code demonstrates how to request the i-th string descriptor, with language ID langID:

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