Невозможно получить имя USB bsd из macOS Monterey 12 Bate4 процессора Intel

Я не могу получить USB-имя bsd из macOS Monterey 12 Bate4 процессора Intel: я использовал функцию «IORegistryEntrySearchCFProperty», чтобы получить bsdName для io_service_t, он отлично работал на MacOS Big Sur M1 и Intel MBP. Также он отлично работал на macOS Monterey App M1. Но на macOS Monterey Intel MBP он всегда возвращал ноль. Он включает в себя следующий код:

      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;
        }
}

Кто-нибудь знает, почему это произошло? Как заставить его работать на процессоре Intel MacOS 12? Или есть другой способ сделать это?

Я также загрузил тот же вопрос на форум Apple, проверьте эту ссылку: Apple_forum_thread_686377

2 ответа

Если вы используете «IOUSBHostDevice» вместо kIOUSBDeviceClassName при создании словаря сопоставления для вызова IOServiceGetMatchingServices, IORegistryEntryCreateCFProperty будет правильно рекурсивно выполняться.

Версия Monterey для Intel больше не учитывает запись «IOClassNameOverride» = «IOUSBDevice» в словаре, или, по крайней мере, я думаю, что это происходит.

Решил этот вопрос другими способами.

Поскольку устройство, которое я ищу, является объектом IOMedia. Я нашел его имя BSD, перечислив объект kIOMediaClass. И я посмотрел на родительское устройство IOMedia, чтобы определить интересующее меня USB-устройство.

      bool getBsdName(io_object_t mediaDevice)
{
    // your code... ...
    CFStringRef mediaDevBsdName = NULL;
    mediaDevBsdName = (CFStringRef)IORegistryEntryCreateCFProperty(mediaDevice,
                                                                 CFSTR(kIOBSDNameKey),
                                                                 kCFAllocatorDefault,0);
    // your code... ...
}
Другие вопросы по тегам