ユーザーがUSBキーを挿入し、外部ディスクを追加し、ディスクイメージをマウントするときに、ストレージデバイスのリストを更新したいと思います。IOKitのIOServiceAddInterestNotificationは進むべき道のように見えますが、kIOMediaClassに一般的な関心を登録するという明白な使用法は、ボリュームのアンマウントの通知のみを提供し、その後はたまにしか提供しません。
これを行う正しい方法は何ですか?
ユーザーがUSBキーを挿入し、外部ディスクを追加し、ディスクイメージをマウントするときに、ストレージデバイスのリストを更新したいと思います。IOKitのIOServiceAddInterestNotificationは進むべき道のように見えますが、kIOMediaClassに一般的な関心を登録するという明白な使用法は、ボリュームのアンマウントの通知のみを提供し、その後はたまにしか提供しません。
これを行う正しい方法は何ですか?
DiskArbitration.h の次の呼び出しは、まさに私が望むことを行います。
DARegisterDiskAppearedCallback
DARegisterDiskDisappearedCallback
DARegisterDiskDescriptionChangedCallback
これらは、挿入、削除 (マウントできないボリュームであっても) の
メタデータ変更イベントをカバーします。
DASession
PSを実行ループに追加することを忘れないでください。そうし
ないと、コールバックが得られません。
ユーザーが USB キーを挿入し、外部ディスクを追加し、ディスク イメージをマウントするときに、ストレージ デバイスのリストを更新したいと考えています。
このコードで 3 分の 2 を得ることができます。
File: USBNotificationExample.c
Description: This sample demonstrates how to use IOKitLib and IOUSBLib to set up asynchronous
callbacks when a USB device is attached to or removed from the system.
It also shows how to associate arbitrary data with each device instance.
USB HDDの接続を監視するために、私は個人的に(このコードのわずかに変更されたコピー)を長い間使用してきました。
この小さなサンプルからわかるように、マウントされたドライブの監視に適応できることが容易に証明される可能性があります。またはそうではないかもしれません。YMMV。
matchingDict = IOServiceMatching(kIOUSBDeviceClassName); // Interested in instances of class
// IOUSBDevice and its subclasses
そしてそれが一致したとき
void DeviceAdded(void *refCon, io_iterator_t iterator)
{
kern_return_t kr;
io_service_t usbDevice;
IOCFPlugInInterface **plugInInterface=NULL;
SInt32 score;
HRESULT res;
while ( (usbDevice = IOIteratorNext(iterator)) )
{
io_name_t deviceName;
CFStringRef deviceNameAsCFString;
MyPrivateData *privateDataRef = NULL;
UInt32 locationID;
printf("Device 0x%08x added.\n", usbDevice);
などなど。
変更を監視/Volumes
すると、必要なことが行われますか?
Cocoa レベルで作業している場合は、登録してNSWorkspaceから次の通知を受け取ることもできます。