Невозможно получить имя 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... ...
}