Objective c 如何获取(段偏移)每个不同的平面(IODeviceTree、IOService…)以进行转储?
我想阅读分析平面(IODeviceTree IOSB IOService IOACPIPlane)Objective c 如何获取(段偏移)每个不同的平面(IODeviceTree、IOService…)以进行转储?,objective-c,xcode,macos,iokit,Objective C,Xcode,Macos,Iokit,我想阅读分析平面(IODeviceTree IOSB IOService IOACPIPlane) 在不使用ioreg的情况下,通过在内存中创建指针(段偏移量),我的问题是如何获取平面的地址,即C或目标C。感谢您的回答。首先,我不确定您在本文中所说的“段偏移量”是什么意思,但问题的其余部分是有意义的,因此我将忽略这一部分作为我的答案 其次是ioreg的源代码,这样您就可以确切地看到它是如何实现的 我将如何做的简要总结: 需要调用的主要函数是IORegistryCreateIterator()
在不使用ioreg的情况下,通过在内存中创建指针(段偏移量),我的问题是如何获取平面的地址,即C或目标C。感谢您的回答。首先,我不确定您在本文中所说的“段偏移量”是什么意思,但问题的其余部分是有意义的,因此我将忽略这一部分作为我的答案 其次是
ioreg
的源代码,这样您就可以确切地看到它是如何实现的
我将如何做的简要总结:
- 需要调用的主要函数是
IORegistryCreateIterator()
- 不要将选项参数递归设置为kioregistryiterated——否则将很难找到图形结构
- 对于
参数,指定例如plane
kIOServicePlane
- 继续调用
,每次您得到一个注册表项时,尝试使用IOIteratorNext()
递归,每次您得到ioregistryiteratorentry()
返回时,使用IO\u OBJECT\u NULL
退出一级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;
}
#包括
#包括
int main(int argc,const char*argv[]
{
io_迭代器\u t iter=io_对象\u NULL;
无符号递归\u级别=0;
kern\u return\u t result=IORegistryCreateIterator(kiomaterPortDefault、kIOServicePlane、0和iter);
如果(结果==0&&iter!=IO\U对象\U NULL)
{
while(true)
{
io_object_t entry=IOIteratorNext(iter);
如果(条目!=IO\U对象\U NULL)
{
io_name_t name=“”;
IORegistryEntryGetName(条目,名称);
printf(“%*s+%s\n”,递归级别*2,”,名称);
++递归层次;
结果=IORegistryInterentry(iter);
断言(结果==KERN_SUCCESS);
}
其他的
{
if(递归_级别==0)
打破
结果=IORegistryInteratorExitEntry(iter);
断言(结果==KERN_SUCCESS);
--递归层次;
}
}
}
返回0;
}
(确保链接到IOKit.framework
)
当然,与对每个注册表项调用IORegistryEntryGetName()
相比,您可以做更多有趣的事情