USB 文字列記述子

デバイス、構成、インターフェイス記述子には、文字列記述子への参照が含まれる場合があります。 このトピックでは、デバイスから特定の文字列記述子を取得する方法について説明します。

文字列記述子は、1 から始まるインデックス番号で参照されます。 文字列記述子には 1 つ以上の Unicode 文字列が含まれており、各文字列は他の言語の文字列からの翻訳です。

クライアント ドライバーは、UsbBuildGetDescriptorRequestDescriptorType = USB_STRING_DESCRIPTOR_TYPE と指定して、文字列記述子を取得する要求を構築します。 Index パラメーターはインデックス番号を指定し、LanguageID パラメーターは言語 ID を指定します (Microsoft Win32 LANGID 値と同じ値が使用されます)。 ドライバーは特別なインデックス番号 0 を要求して、デバイスがサポートする言語 ID を判断できます。 この特別な値に対して、デバイスは Unicode 文字列ではなく、言語 ID の配列を返します。

文字列記述子は可変長データで構成されているため、ドライバーは 2 ステップで文字列記述子を取得する必要があります。 まずドライバーは要求を発行し、文字列記述子のヘッダーである USB_STRING_DESCRIPTOR 構造体を保持するのに十分な大きさのデータ バッファーを渡す必要があります。 USB_STRING_DESCRIPTOR の bLength メンバーは記述子全体のサイズをバイト単位で指定します。 次に、ドライバーはサイズ bLength のデータ バッファーを使用して同じ要求を行います。

次のコードは、言語 ID langID を使用して i 番目の文字列記述子を要求する方法を示しています。

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