Deskriptor String USB

Deskriptor perangkat, konfigurasi, dan antarmuka mungkin berisi referensi ke deskriptor string. Topik ini menjelaskan cara mendapatkan deskriptor string tertentu dari perangkat.

Deskriptor string dirujuk oleh nomor indeks berbasis satu. Deskriptor string berisi satu atau beberapa string Unicode; setiap string adalah terjemahan dari yang lain ke dalam bahasa lain.

Driver klien menggunakan UsbBuildGetDescriptorRequest, dengan DescriptorType = USB_STRING_DESCRIPTOR_TYPE, untuk membangun permintaan untuk mendapatkan deskriptor string. Parameter Indeks menentukan nomor indeks, dan parameter LanguageID menentukan ID bahasa (nilai yang sama digunakan seperti dalam nilai LANGID Microsoft Win32). Driver dapat meminta jumlah indeks khusus nol untuk menentukan ID bahasa mana yang didukung perangkat. Untuk nilai khusus ini, perangkat mengembalikan array ID bahasa daripada string Unicode.

Karena deskriptor string terdiri dari data panjang variabel, driver harus mendapatkannya dalam dua langkah. Pertama driver harus mengeluarkan permintaan, melewati buffer data yang cukup besar untuk menahan header untuk deskriptor string, struktur USB_STRING_DESCRIPTOR. Anggota USB_STRING_DESCRIPTOR bLength menentukan ukuran dalam byte dari seluruh deskriptor. Driver kemudian membuat permintaan yang sama dengan buffer data ukuran bLength.

Kode berikut menunjukkan cara meminta deskriptor string i-th, dengan ID bahasa 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
);