プログラミング」カテゴリーアーカイブ

USB バージョンを取得する (VC++)

PC に接続されている USB デバイスのバージョンがどう認識されているか
(ハイスピードの USB2.0 なのか、USB1.1 なのか…等)
知りたいことがあります。
これを取得する直接的な API はないようですが、
Microsoft の WinDDK に含まれる usbview サンプルが参考になります。

USB バージョンを調べるには、ルートハブからデバイスを走査していき、
DeviceIoControl 関数を使って USB_NODE_CONNECTION_INFORMATION_EX 構造体の情報を取得して、
デバイスディスクリプタの bcdUSB を見るというのが確実な方法だと思います。
bcdUSB には BCD で USB バージョンが入っています。

USB デバイスの VID と PID から USB バージョンを返す C++ のクラスをつくりました。
-> ダウンロード
CGetUSBVersion::GetUSBVersion(pid, vid) を呼び出すことで、
USB バージョンが BCD で帰ります。
(たとえば 2.0 なら 0x200)
取得失敗で負の値が帰ります。

なお GetRootHubName などの一部の関数は、WinDDK のサンプルから引用しています。