Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何获取(段偏移)每个不同的平面(IODeviceTree、IOService…)以进行转储?_Objective C_Xcode_Macos_Iokit - Fatal编程技术网

Objective c 如何获取(段偏移)每个不同的平面(IODeviceTree、IOService…)以进行转储?

Objective c 如何获取(段偏移)每个不同的平面(IODeviceTree、IOService…)以进行转储?,objective-c,xcode,macos,iokit,Objective C,Xcode,Macos,Iokit,我想阅读分析平面(IODeviceTree IOSB IOService IOACPIPlane) 在不使用ioreg的情况下,通过在内存中创建指针(段偏移量),我的问题是如何获取平面的地址,即C或目标C。感谢您的回答。首先,我不确定您在本文中所说的“段偏移量”是什么意思,但问题的其余部分是有意义的,因此我将忽略这一部分作为我的答案 其次是ioreg的源代码,这样您就可以确切地看到它是如何实现的 我将如何做的简要总结: 需要调用的主要函数是IORegistryCreateIterator()

我想阅读分析平面(IODeviceTree IOSB IOService IOACPIPlane)
在不使用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()
相比,您可以做更多有趣的事情