2017-06-27 38 views
1

因此,我有一个USB大容量存储设备,它将两个磁盘暴露给macOS。 我得到检测用https://stackoverflow.com/users/1412808/rafael-baptista的文章第一个: https://oroboro.com/usb-serial-number-osx/获取所有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) { 
.... 

我会很感激的是我可以有任何指针或信息在这里做得更好。

谢谢。

+0

你的'usbDevice'句柄来自哪里?当然,这是这个问题的关键。 – pmdj

+0

它来自usbDevice = IOIteratorNext(iterator),它是检测到新匹配设备时获得的迭代器。我不认为它是一个问题。 – GregJaskiewicz

+0

那么,你是否在迭代多个usbDevices?这部分工作吗? – pmdj

回答

1

是的。顺便说一句,我找到了解决办法。我正在使用磁盘仲裁来发现新驱动器。

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将包含IOPath,其中将包括设备ID(或名称)和VendorID!