USB機器の固有シリアル番号を取得しよう / USBViewビルド編

今日の満月


STATUS: 故障中x2


 USBデバイスには製造メーカーをあらわす「ベンダーID」と製品種別を表す「プロダクトID」のほかに、1台1台ユニークなIDとして「iSerialNumber」という文字列(16進16桁)を持っています。
 (ただしiSerialNumberが無いUSBデバイスもある)


 この iSerialNumber を利用すればUSBデバイスを用いて簡易な認証が出来そうです(買うと結構高いアレの代わりにしたいんですけどね)。


 で、イロイロ調べていたらまさにそのような用途に使っている製品がありました。
 → 手持ちのUSB機器をPCの鍵にできる「カチャッとUSBパソコンロック2」 (MYCOMジャーナル)


 あと、同じような目的で開発しているっぽい人が掲示板で質問しているのを見つけたので、これが大変参考になりました。(iSerialNumberについてはココで知った)
 → USBシリアルナンバーの取得 (Belution.com)


 イメージ的には、[ココ]の書き込みのようなコードで勧めていけばよさそう。
 setupapi.lib を使った、USBデバイスの列挙とかは以前やったことがあるのでこの延長で勧めればいいのかな。


 で、iSerialNumberその他USBデバイスの情報を取得するには、DDKにある USBView というあプログラムを使うとよいです。
 USBデバイスが接続順にツリー形式で表示され、デバイス名をクリックすると詳細が表示されるというものです。
 ビルド済みの実行ファイルは、[ココ]からダウンロードできます。(ただ僕のWin2kではちゃんと動かなかった。XPでは動いたけど)
 USBViewは、ソースも公開されているのでこれを参考にするのが一番の近道でしょうね。


 というわけで、今回は USBView(DDK)の入手方法とビルド方法について書いてみます。
(という自分向けのメモ)


【参考資料】
・USB解説記事 (PDF)
 「これだけは知っておきたいUSBの基礎知識」
・USB仕様書 (英文)
 USB 2.0 Specification
・参考書
 USBコンプリート―USB2.0を含むカスタムUSBデバイス開発のすべて (単行本)


● USBViewソースの入手


 USBViewは、DDK(Microsoft Windows ドライバ開発キット)に含まれています。
 MicroSoftのサイトから無償でダウンロードできます(ISOイメージ)。
 → DDK - Windows ドライバ開発キット


 現状のDDKのバージョンは、「Windows Server 2003 SP1 DDK」と呼ばれていますが、これで Windows2000/XP/XP64bit/2003 のデバイスドライバが開発できます。
 ※Vistaは、「Windows Vista WDK」を使います。
 詳しくは、こちら


● USBViewをビルドします。


 DDKに入っているのは、ソースとリソースファイルだけなので、DeveloperStudio等に自分でプロジェクトを作ってビルドする必要があります。


 ビルド方法は以下のページに載っています。


 → Windows USBプログラミング


 ただ上記サイトでの解説は少し古いようなので、最新のDDK + DeveloperStudio5.0 を使った手順をいかに示します。


1.DDKのインストール
 インストーラ(Setup.exe)を起動して、全部入りでインストール。
 ※実際にはデフォルトで選択されている項目+「WDM Samples」でいいのかな
 デフォルトではインストール先は「C:\WINDDK\3790.1830」となります。


2.プロジェクトを作成
 DeleloperStudioを起動して、新規プロジェクトを作成。
 「Win32 Applicatoin」を選択し
 プロジェクト名は、「USBView」
 プロジェクトの種類は、「空のプロジェクト」


3.サンプルのソースをコピー

 作成したプロジェクトのフォルダに、DDKのサンプルフォルダ「C:\WINDDK\3790.1830\src\wdm\usb\usbview」の中のファイルを全てコピー。


4.プロジェクトにソース・リソースを追加

debug.c
devnode.c
dispaud.c
display.c
enum.c
resource.h
usbdesc.h
usbview.c
usbview.h
usbview.rc
vndrlist.h


5.プロジェクトの設定に追加

・[リンク]タブの「オブジェクト/ライブラリモジュール」に「CFGMGR32.LIB COMCTL32.LIB setupapi.lib」を追加
・[リンク]タブの「追加ライブラリのパス」に「C:\WINDDK\3790.1830\lib\wxp\i386」を追加
・[C/C++]タブの「プリプロセッサ」カテゴリの「インクルードファイルのパス」に「C:\WINDDK\3790.1830\inc\wxp,C:\WINDDK\3790.1830\inc\crt」を追加

※ w2kのパスを指定したら「usbiodef.h」がないって怒られた。Win2kでビルドするときも「wxp」で大丈夫みたい。


6.リソースがコンパイルできなかったら…
 エラーがでてる行をコメントアウトすればおk


以上で準備完了。あとはビルドするだけです。