Я пытаюсь получить список всех устройств в системе вместе с тем, как они подключены. Поэтому я хочу по существу клонировать структуру дерева сервисов IO Kit (которую вы видите с помощью IORegistryExplorer
). Как перебрать все ключи? (Одна из причин, по которой это сбивает меня с толку, заключается в том, что я не понимаю, в чем разница между io_service
, io_registry
и io_object
).
Как перебирать ключи IO Kit?
Ответы:
Разница между службой, реестром и объектом заключается только в обстоятельствах, в которых они используются. В остальном они полностью одинаковы. Из IOTypes.h:
typedef io_object_t io_registry_entry_t;
typedef io_object_t io_service_t;
Доступна документация по Обход реестра ввода-вывода, который также включает информацию об обходе всего реестра. Для каждой записи вам нужно будет получить свойства и сохранить их вместе с вашим представлением реестра.
Таким образом, вы должны использовать IORegistryGetRootEntry()
, распечатать/сохранить его имя и свойства, а затем перебрать дочерние элементы с помощью IORegistryEntryGetChildIterator()
.
Вы получаете свойства с IORegistryEntryCreateCFProperties()
после CFDictionaryGetKeysAndValues()
. Затем для значений вам нужно проверить, какие это типы, чтобы распечатать/сохранить их (или использовать CFSHOW). Если вы действительно хотите клонировать это в другую структуру (с другими типами), вы должны явно обрабатывать каждый возможный CFTypeID.
Я создал рабочий прототип по адресу https://gist.github.com/JonnyJD/6126680.
РЕДАКТИРОВАТЬ:
В другом ответе SO исходный код (C) ioreg
связан. Это должно быть хорошим ресурсом для печати/извлечения отсутствующих CFTypes.