0

私のアプリは、必要なベンダー ID、デバイス ID などの特定の情報を持つ USB キーから実行されます。

libusb を使用してみましたが、まだ適切に動作させることはできませんが、情報を取得する適切な USB ドライブを見つけるにはどうすればよいでしょうか?

コードをクロスプラットフォームにしたいことに注意してください。そのため、最初に libusb を選択します。

編集 :

ドライブが接続されているときに、すべての USB ポートとドライブに関する特定の情報を列挙するプログラム (usbviewer) を見つけました。

Linux のソースを読んだことがあります。情報は /proc/bus/usb/devices から直接抽出されます。非常に簡単です。

しかし、Windows では、USB ノード接続情報を取得するには、データ構造 (ハブ コントローラー、ルート ハブ、ポートの列挙など) で実際の情報を取得する前に約 1000 行かかります。

反対側のlibusbは、情報に到達する前に、INFファイルを生成し、各デバイスのinf-wizard.exeを介してドライバーをインストールするように強制します(ただし、Linuxでは試しませんでした)。

編集2:

Windows、Linux、および Mac OS X でデバイスのシリアル番号を取得する方法を見つけました (MAC OS X は試していませんが、Linux と同じように動作するはずです)。Windows では関数を使用し、GetVolumeInformation()Linux では FAT ファイル システムのドライブのシリアル番号を読み取ります。FAT のバージョンに応じて、対応する /dev/* ファイルの 0x27 または 0x43 から始まる 4 バイトを読み取ります。

しかし、この読み取りには、プログラムにはないルートアクセスが必要であり、少し信頼性がないように思えます。

何か案は ?

4

1 に答える 1

0

興味のある人のために、私に合った解決策を見つけました。

Windows の場合:

ドライブ文字を認識しているレジストリからデバイスのシリアル番号を抽出します: HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\DosDevices\X:

Unix の場合:

コマンドで/devファイルを取得し、そのファイルに対応するリンクを読み取ります (例: The drive is /dev/sdb, I read link of .次に、リンクが指すディレクトリにあるファイルを読み取ります。 6x ディレクトリ後方。df/sys/block/dev/sys/block/sdbserial

それが役に立てば幸い。

于 2012-05-23T08:22:31.370 に答える