Прежде всего, я не уверен, что вы подразумеваете под «смещением сегмента» в этом контексте, но остальная часть вопроса имеет смысл, поэтому я просто проигнорирую эту часть для моего ответа.
Во-вторых, исходный код для ioreg
доступен здесь , так что вы можете точно увидеть, как это происходит.
Краткое описание того, как я это сделаю:
- Основная функция, которую вам нужно вызвать, это
IORegistryCreateIterator()
.
- Do not установить аргумент
options
равным kIORegistryIterateRecursively
- иначе будет трудно найти структуру графа.
- Для аргумента
plane
укажите, например, kIOServicePlane
.
Рабочий пример кода:
#include <stdio.h>
#include <IOKit/IOKitLib.h>
int main(int argc, const char * argv[])
{
io_iterator_t iter = IO_OBJECT_NULL;
unsigned recursion_level = 0;
kern_return_t result = IORegistryCreateIterator(kIOMasterPortDefault, kIOServicePlane, 0, &iter);
if (result == 0 && iter != IO_OBJECT_NULL)
{
while (true)
{
io_object_t entry = IOIteratorNext(iter);
if (entry != IO_OBJECT_NULL)
{
io_name_t name = "";
IORegistryEntryGetName(entry, name);
printf("%*s+ %s\n", recursion_level * 2, "", name);
++recursion_level;
result = IORegistryIteratorEnterEntry(iter);
assert(result == KERN_SUCCESS);
}
else
{
if (recursion_level == 0)
break;
result = IORegistryIteratorExitEntry(iter);
assert(result == KERN_SUCCESS);
--recursion_level;
}
}
}
return 0;
}
(не забудьте связать с IOKit.framework
)
Конечно, вы можете делать гораздо более интересные вещи, чем вызывать IORegistryEntryGetName()
для каждой записи реестра.