USB 文字列記述子

デバイス、構成、およびインターフェイス記述子に、文字列記述子への参照を含めることができます。ここでは、デバイスから特定の文字列記述子を取得する方法について説明します。

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

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

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

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


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

関連トピック

USB 記述子

 

 

表示:
© 2014 Microsoft