USBデバイス作成時はMicrosoft OS ディスクリプタに注意

人に指摘してもらって気がついたのだが、Windows XP SP1以降のWindowsは、USBデバイスから、Microsoft OS Descriptor なるものを取得しようとするらしい。

USB に関する FAQ: 中級レベル (microsoft.com)
Microsoft OS ディスクリプター (microsoft.com)

具体的には Windowsは index 0xEE で String Descriptor を取得しようとしてくる。

そんなindexのStringDescriptorは持ってません、と無視してしまえば問題はないのだが、たとえば、STM32の、最初期(2007年頃)のUSBサンプルコードでは、

こんな String_Descriptor配列を

ONE_DESCRIPTOR String_Descriptor[4] =
  {
    {(u8*)Joystick_StringLangID, JOYSTICK_SIZ_STRING_LANGID},
    {(u8*)Joystick_StringVendor, JOYSTICK_SIZ_STRING_VENDOR},
    {(u8*)Joystick_StringProduct, JOYSTICK_SIZ_STRING_PRODUCT},
    {(u8*)Joystick_StringSerial, JOYSTICK_SIZ_STRING_SERIAL}
  };
u8 *Joystick_GetStringDescriptor(u16 Length)
{
  u8 wValue0 = pInformation->USBwValue0;
  return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]);
}

こうやってindexノーチェックで引いて返信していた。

危ないのでindexはきちんとチェックしましょう・・・。

コメント

タイトルとURLをコピーしました