libusb-win32で通常のクラス準拠デバイスを制御する

Windows上でHIDなディバイスをlibusbで操作する方法ってあるのかな.

  • そういえば、瓶詰堂さんが書かれていた、HIDなのにlibusb経由でドライブする方法ってあるのかな。
  • そもそもWindowsでは、device.infにlibusb0.sysって書いておかないとlibusbが捌いてくれないような気もしている。

結論から言えば、有る。

  • 方法a : libusb-win32のHIDバックエンドを使う
    • この方法は微妙に面倒なので省略。
  • 方法b : libusb-win32のドライバを無理矢理インストールする
    • 以下に解説。この方法は大抵のデバイスで使える。

本当にlibusbで制御する必要があるのかは考える余地がある。例えばMass storageを直接コントロールすることによるパフォーマンス上のメリットは殆ど無い。また、WinUSBには(通常のユーザには)単純に価値がない。libusb-win32は十分なパフォーマンスを提供する。
個人的には、特別な事情が無い限りlibusb-win32のフィルタドライバは使わず、この方法でデバイスをインストールすることを推奨する。
Windowsにはインターフェースのドライバを作るための簡単なフレームワークは無いので、HID+αのデバイスを作った場合には意味があるかも知れない。

ドライバの差し替え

MassStorageで試してみる。どのようなデバイスでも全体的な手順は変わらない。

まず、VIDとPIDを調べ、libusb-win32に付属する、inf-wizard.exeを使ってinfとcatを作る。作ったinfとcatと同じディレクトリに、libusb0.dllや.sysをコピーしておく。
バイスの右クリックから、デバイスドライバの更新、手動で選択、ディスク使用として、先ほどのinfを指定すると、次のように選択が可能になる。

あとは選択すればlibusbから制御可能になる。付属のtestlibusb-win.exeを使って、デバイスが出現することを確かめる。

多くのクラス準拠デバイスは、自分以外のデバイスを作り出す。

マスストレージであればディスクデバイスが出現するが、これはハズれなので注意。
また、WindowsXPの場合、接続するポートを変更するとデバイスドライバを再インストールする必要が生じるケースがある。
ハブに対してこれを行うべきではない。何かおかしな問題が起こるかも知れない。
署名したドライバが存在しており、デバイスドライバを削除できないケースではこの方法でlibusbをインストール出来ないかも知れない。その場合は、libusb0.dllのusb_install_driver_np_rundll()を使う。単に、infの有るディレクトリで、

  • rundll32 libusb0.dll,usb_install_driver_np_rundll 作成した.inf

とする。これは当然管理者権限が必要で、また、.infが正確に作成されている必要がある。

実績

以下のデバイスに関してはlibusb-win32で制御した実績がある。

  • マウスとキーボード等のHID
    • 一台のWindows PCに複数のマウスを接続したデモを作成した
  • Bluetooth(除Broadcomチップ)
  • Mass storage

ただし、libusb-win32はEz-USBや、無線LANのような、『USBデバイスとして機能するためにファームウェアのロードを必要とするデバイス』は正常に動作しない傾向にある。