IOKIT mac os IORegistryEntry - PullRequest
       9

IOKIT mac os IORegistryEntry

0 голосов
/ 27 апреля 2018

Я хочу знать, как связать IOKit.framework с помощью приведенного ниже кода. Я не могу связать его в своем приложении: XCode всегда предупреждает меня, что используемые мной методы неизвестны. Я знаю, что есть ограничения на использование , , например, только для расширений ядра : набор ввода / вывода использует объектно-ориентированную модель программирования, реализованную в ограниченном подмножестве C ++ для ускорения повторного использования кода, как указано в Обзор комплекта ввода / вывода . Если вы сможете мне помочь, я с большим удовольствием научусь.

 OSData * data;
 IORegistryEntry * entry;
 OSString * string = 0;
 uuid_string_t uuid;
 const IORegistryPlane * gIODTPlane;



 entry = IORegistryEntry :: fromPath ("/efi/platform", gIODTPlane);
 if (entry)
 {
     data = OSDynamicCast (OSData, entry-> getProperty ("SystemSerialNumber"));
     if (data && data-> getLength () == 16)
     {
         string = OSString :: withCString ((char const *) data-> getBytesNoCopy ());
     }

     entry-> release ();
 }

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

ниже использования «CFMutableDictionaryRef» с «IORegistryEntryFromPath», «IORegistryEntryCreateCFProperties» и «CFDictionaryApplyFunction», вы получите блок, содержащийся в «платформе», в которой он отсортировал каждый элемент со строкой преобразования или данными. Это то, что существует с ioreg .c в очень легкой форме

void getsystemuuid()
{

    io_registry_entry_t service  = 0;
    struct options      options;
    CFMutableDictionaryRef properties = 0;
    kern_return_t       status      = KERN_SUCCESS;


    service = IORegistryEntryFromPath(kIOMasterPortDefault, "IODeviceTree:/efi/platform");

    status=IORegistryEntryCreateCFProperties( service,&properties,kCFAllocatorDefault,kNilOptions );

    if (status)
        goto sortie;


    CFDictionaryApplyFunction(properties, showitem,&options.depth);

sortie:
    CFRelease(properties);
    IOObjectRelease(service);
}
0 голосов
/ 28 апреля 2018

Все эти типы и функции определены в Kernel.framework. Если вы не создаете расширение ядра, это не то, что вам нужно. API пользовательского пространства для доступа к IOKit осуществляется через C API (IOKitLib), предоставляемый IOKit.framework.

Документация для этого здесь: https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/AccessingHardware/AH_IOKitLib_API/AH_IOKitLib_API.html

Похоже, вы хотите, чтобы функции IORegistryEntryFromPath() и IORegistryEntryCreateCFProperty() получали необходимую информацию в пространстве пользователя.

(Оба объявлены в <IOKit/IOKitLib.h>, убедитесь, что вы добавили IOKit.framework в список библиотек вашей цели для ссылок. Вам также может понадобиться ссылка на CoreFoundation.framework, если ваше приложение еще не ссылается на него или Какао. Рамка.)

...