как получить (смещение сегмента) каждой отдельной плоскости (IODeviceTree, IOService ....), чтобы сделать дамп? - PullRequest
0 голосов
/ 04 мая 2018

Я хочу прочитать анализ плоскости (IODeviceTree IOUSB IOService IOACPIPlane) без использования ioreg, создав указатель (смещение сегмента) в памяти, мой вопрос заключается в том, как получить адрес плоскости, такой как в C или Objective C. Спасибо за ваши ответы.

1 Ответ

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

Прежде всего, я не уверен, что вы подразумеваете под «смещением сегмента» в этом контексте, но остальная часть вопроса имеет смысл, поэтому я просто проигнорирую эту часть для моего ответа.

Во-вторых, исходный код для 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() для каждой записи реестра.

...