2017-06-27 4 views
1

私はMacOSに2つのディスクを公開するUSB​​マスストレージデバイスを持っています。すべてのUSBマスストレージデバイスの一覧を取得

io_registry_entry_t child; 
io_iterator_t  child_iterator = MACH_PORT_NULL; 
kern_return_t  kr; 

kr = IORegistryEntryCreateIterator(usbDevice, 
            kIOServicePlane, 
            kIORegistryIterateRecursively, 
            &child_iterator); 
if (kr != kIOReturnSuccess) { 
    return; 
} 

while ((child = IOIteratorNext(child_iterator)) != MACH_PORT_NULL) { 
    CFStringRef bsdName = NULL; 

    bsdName = (CFStringRef) IORegistryEntrySearchCFProperty(child, kIOServicePlane, CFSTR(kIOBSDNameKey), kCFAllocatorDefault, kIORegistryIterateRecursively); 

    if (bsdName) { 
.... 

は私が持っている可能性が何の任意のポインタまたは情報をいただければと思います。私は、コードを使用して第2のものを得ることができない、しかし https://oroboro.com/usb-serial-number-osx/

: 私はhttps://stackoverflow.com/users/1412808/rafael-baptistaさんの記事を使用して最初のものを検出し得ますここでもっとうまくいった。

ありがとうございました。

+0

あなたの 'usbDevice'ハンドルはどこから来ていますか?確かに、それがこの問題の鍵です。 – pmdj

+0

usbDevice = IOIteratorNext(iterator)から来ます。新しい一致するデバイスが検出されたときに取得するイテレータです。私はその問題とは思わない。 – GregJaskiewicz

+0

さて、あなたは複数のusbデバイスで繰り返し処理していますか?その部分は機能しますか? – pmdj

答えて

1

はい。 Btw、私はこれに対する解決策を見つけました。私は新しいドライブを発見するためにディスクアービトレーションを使用しています。

CFDictionaryRef dict = DADiskCopyDescription(disk); 

    NSDictionary *diskDictionary = (__bridge NSDictionary *)dict; 
    NSURL *mountPointURL = diskDictionary[(__bridge NSString *)kDADiskDescriptionVolumePathKey]; 
    NSString *deviceMountPath = [mountPointURL path]; 

    NSString *deviceDiskPath = diskDictionary[(__bridge NSString *)kDADiskDescriptionDevicePathKey]; 

deviceDiskPathには、デバイスID(または名前)とVendorIDが含まれるIOPathが含まれます。

関連する問題