Share via


USB-Zeichenfolgendeskriptoren

Geräte-, Konfigurations- und Schnittstellendeskriptoren können Verweise auf Zeichenfolgendeskriptoren enthalten. In diesem Thema wird beschrieben, wie Sie einen bestimmten Zeichenfolgendeskriptor vom Gerät abrufen.

Zeichenfolgendeskriptoren werden durch ihre 1-basierte Indexnummer referenziert. Ein Zeichenfolgendeskriptor enthält mindestens eine Unicode-Zeichenfolge. Jede Zeichenfolge ist eine Übersetzung der anderen in eine andere Sprache.

Clienttreiber verwenden UsbBuildGetDescriptorRequest mit DescriptorType = USB_STRING_DESCRIPTOR_TYPE, um die Anforderung zum Abrufen eines Zeichenfolgendeskriptors zu erstellen. Der Index-Parameter gibt die Indexnummer an, und der LanguageID-Parameter gibt die Sprach-ID an (die gleichen Werte werden wie in Microsoft Win32 LANGID-Werten verwendet). Treiber können die spezielle Indexnummer 0 anfordern, um zu bestimmen, welche Sprach-IDs das Gerät unterstützt. Für diesen speziellen Wert gibt das Gerät anstelle einer Unicode-Zeichenfolge ein Array von Sprach-IDs zurück.

Da der Zeichenfolgendeskriptor aus Daten variabler Länge besteht, muss der Treiber sie in zwei Schritten abrufen. Zuerst muss der Treiber die Anforderung ausgeben und dabei einen Datenpuffer übergeben, der groß genug ist, um den Header für einen Zeichenfolgendeskriptor, eine USB_STRING_DESCRIPTOR-Struktur, zu halten. Der bLength-Member von USB_STRING_DESCRIPTOR gibt die Größe des gesamten Deskriptors in Byte an. Der Treiber führt dann dieselbe Anforderung mit einem Datenpuffer der Größe bLength aus.

Der folgende Code veranschaulicht, wie Sie den i-ten Zeichenfolgendeskriptor mit der Sprach-ID langID anfordern:

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