我想阅读分析一架飞机(IODeviceTree IOUSB IOService IOACPIPlane) 不使用ioreg,通过在内存中创建指针(段偏移),我的问题是如何获取平面的地址,在C或Objective C中。感谢您的答案。
答案 0 :(得分:1)
首先,我不确定你的意思是"段偏移"在这种情况下,但问题的其余部分是有道理的,所以我只是忽略那部分作为我的答案。
其次,ioreg
is available here的源代码,以便您可以确切了解它是如何做到的。
我将如何做的快速摘要:
IORegistryCreateIterator()
。options
参数设置为kIORegistryIterateRecursively
- 否则很难找到图结构。plane
参数,请指定例如kIOServicePlane
。IOIteratorNext()
,每次收到注册表项后,尝试使用IORegistryIteratorEnterEntry()
进行递归,每次回到IO_OBJECT_NULL
时,使用{{步骤退一步1}}。工作示例代码:
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
之外,您可以做更多有趣的事情。