我想在不使用ioreg的情况下阅读analyze a plane (IODeviceTree IOUSB IOService IOACPIPlane),通过在内存中创建一个指针(段偏移量),我的问题是如何在C或Objective C中获取平面的地址。谢谢你的回答。
发布于 2018-05-10 01:25:33
首先,我不确定您在此上下文中所说的“段偏移”是什么意思,但问题的其余部分是有意义的,所以我将忽略这一部分作为我的答案。
第二,ioreg is available here的源代码,这样您就可以确切地看到它是如何做到的。
快速总结一下我将如何做到这一点:
调用您需要调用的主要函数是IORegistryCreateIterator().
options参数设置为kIORegistryIterateRecursively -否则将很难找到图形调用plane参数,指定例如kIOServicePlane.IOIteratorNext() IOIteratorNext(),并且每次您得到一个注册表项时,尝试使用IORegistryIteratorEnterEntry()递归,每次您得到d19>返回时,使用IORegistryIteratorExitEntry().单步退出一级
工作示例代码:
#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()之外,您还可以做更有趣的事情。
https://stackoverflow.com/questions/50167930
复制相似问题