0

我无法从英特尔处理器的 macOS Monterey 12 Bate4 获取 USB bsdname:我使用“IORegistryEntrySearchCFProperty”函数获取 io_service_t 的 bsdName,它在 macOS Big Sur 的 M1 和 Intel MBP 上运行良好。它在 macOS Monterey App M1 上也运行良好。但它在 macOS Monterey Intel MBP 上总是返回 nil。它涉及以下代码:

void getBsdName(io_service_t usbDevice)
{
    CFStringRef bsdName = NULL;
    for(int i = 0; i < 500; i++)
    {

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

          if(!bsdName) {
                // If don't get a bsd name, keep waiting in 5s.
                usleep(10000);
                continue;
         }

          printf("[%s]: Found bsd name for device %d.\n”, __func__, usbDevice);
          break;
        }
}

有人知道为什么会这样吗?如何使其在 MacOS 12 英特尔处理器上运行?或者有没有其他方法可以做到这一点?

我也将同样的问题上传到苹果论坛,请查看此链接:Apple_forum_thread_686377

4

2 回答 2

1

如果在为 IOServiceGetMatchingServices 创建匹配字典时使用“IOUSBHostDevice”而不是 kIOUSBDeviceClassName,则调用 IORegistryEntryCreateCFProperty 将正确递归。

英特尔版本的蒙特雷不再尊重字典中的“IOClassNameOverride”=“IOUSBDevice”条目,或者至少我认为这是正在发生的事情。

于 2021-12-14T22:39:44.790 回答
0

我通过其他方式解决了这个问题。

由于我正在寻找的设备是一个 IOMedia 对象。我通过枚举 kIOMediaClass 对象找到了它的 BSD 名称。我查找了 IOMedia 的父设备以确定我感兴趣的 USB 设备。

bool getBsdName(io_object_t mediaDevice)
{
    // your code... ...
    CFStringRef mediaDevBsdName = NULL;
    mediaDevBsdName = (CFStringRef)IORegistryEntryCreateCFProperty(mediaDevice,
                                                                 CFSTR(kIOBSDNameKey),
                                                                 kCFAllocatorDefault,0);
    // your code... ...
}
于 2021-10-20T08:49:19.913 回答