Condividi tramite


Descrittori di stringhe USB

I descrittori di dispositivo, configurazione e interfaccia possono contenere riferimenti ai descrittori di stringa. Questo argomento descrive come ottenere un descrittore di stringa specifico dal dispositivo.

I descrittori di stringa vengono a cui fa riferimento il numero di indice basato su uno. Un descrittore di stringa contiene una o più stringhe Unicode; ogni stringa è una traduzione degli altri in un'altra lingua.

I driver client usano UsbBuildGetDescriptorRequest, con DescriptorType = USB_STRING_DESCRIPTOR_TYPE, per compilare la richiesta per ottenere un descrittore stringa. Il parametro Index specifica il numero di indice e il parametro LanguageID specifica l'ID lingua (gli stessi valori vengono usati nei valori LANGID di Microsoft Win32). I driver possono richiedere il numero di indice speciale di zero per determinare quali ID lingua supporta il dispositivo. Per questo valore speciale, il dispositivo restituisce una matrice di ID del linguaggio anziché una stringa Unicode.

Poiché il descrittore di stringa è costituito da dati a lunghezza variabile, il driver deve ottenerlo in due passaggi. Prima di tutto il driver deve emettere la richiesta, passando un buffer di dati abbastanza grande per contenere l'intestazione per un descrittore di stringa, una struttura USB_STRING_DESCRIPTOR. Il membro bLength di USB_STRING_DESCRIPTOR specifica le dimensioni in byte dell'intero descrittore. Il driver effettua quindi la stessa richiesta con un buffer di dati di dimensioni bLength.

Il codice seguente illustra come richiedere il descrittore stringa i-th, con id lingua 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
);