libusb-win32で通常のクラス準拠デバイスを制御する
- そういえば、瓶詰堂さんが書かれていた、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が正確に作成されている必要がある。