如何获得(段偏移)每个不同的平面(IODeviceTree,IOService ....)来进行转储?

时间:2018-05-04 05:43:56

标签: objective-c xcode macos iokit

我想阅读分析一架飞机(IODeviceTree IOUSB IOService IOACPIPlane) 不使用ioreg,通过在内存中创建指针(段偏移),我的问题是如何获取平面的地址,在C或Objective C中。感谢您的答案。

1 个答案:

答案 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之外,您可以做更多有趣的事情。