Mac OSX ディスク ユーティリティのメイン ウィンドウを見ていると、USB デバイスに関する 4 つの情報が見つかりました (ドライブ項目が選択されている場合)。
- ディスクの説明
- 接続バス
- 接続タイプ
- USB シリアル番号
Disk Arbitration フレームワークを使用して、最初の 3 つの情報を取得できました。新しいディスク デバイスの検出に応答して、コールバック ルーチンを登録するように依頼しました。
DARegisterDiskAppearedCallback(session, NULL, OnDiskAppeared, (void *)NULL);
ルーチンは次のようになりました。
static void OnDiskAppeared(DADiskRef disk, void *__attribute__((__unused__)) ctx) {
CFDictionaryRef dict = DADiskCopyDescription(disk);
const void *DAMediaName = CFSTR("DAMediaName");
const void *DAVolumeName = CFSTR("DAVolumeName");
const void *DADeviceModel = CFSTR("DADeviceModel");
const void *DAMediaUUID = CFSTR("DAMediaUUID");
const void *DAVolumeUUID = CFSTR("DAVolumeUUID");
printf("DAMediaName: ");
CFShow(CFDictionaryGetValue(dict, DAMediaName));
printf("DAVolumeName: ");
CFShow(CFDictionaryGetValue(dict, DAVolumeName));
printf("DADeviceModel: ");
CFShow(CFDictionaryGetValue(dict, DADeviceModel));
printf("DAMediaUUID: ");
CFShow(CFDictionaryGetValue(dict, DAMediaUUID));
printf("DAVolumeUUID: ");
CFShow(CFDictionaryGetValue(dict, DAVolumeUUID));
CFRelease(dict);}
このルーチンは実際にボリュームと物理ドライブに関する情報を返し、最後のケースでは、前に説明した 3 つのディスク プロパティに関する情報を返しました。
残念ながら、4 番目 (USB シリアル番号) については何も見つかりませんでした。
次のように呼び出して、辞書全体を印刷しました。
CFDictionaryApplyFunction(dict, printKeys, NULL);
printKeys コールバック ルーチンを次のようにコーディングします。
static void printKeys (const void* key, const void* value, void* context) {
CFShow(key);
CFShow(value);}
しかし、希望する 4 番目の値を返すキーはありませんでした。
おそらくディスク調停フレームワークのどこかに、そのような情報を提供する何かがなければならなかったと思いますが、どこにあるのかわかりません。
いくつかのアドバイス?
手伝ってくれてありがとう。
アントニオ