我正在尝试获取系统中所有设备的列表以及它们的连接方式。因此,我想基本上克隆IO Kit服务树的结构(您可以使用IORegistryExplorer
看到)。如何遍历所有键? (这让我感到困惑的一个原因是因为我不明白io_service
,io_registry
和io_object
之间的区别是什么。
答案 0 :(得分:2)
服务,注册表和对象之间的区别仅在于它们被使用的情况。否则他们完全相同。 来自IOTypes.h:
typedef io_object_t io_registry_entry_t;
typedef io_object_t io_service_t;
有关于Traversing the I/O Registry的文档,其中还包含有关遍历整个注册表的信息。 对于每个条目,您必须get the properties并使用您对注册表的表示保存它们。
因此,您可以使用IORegistryGetRootEntry()
,打印/保存其名称和属性,然后使用IORegistryEntryGetChildIterator()
迭代孩子。
您在CFDictionaryGetKeysAndValues()
之后获得IORegistryEntryCreateCFProperties()
的属性。对于这些值,您必须检查打印/保存它们的类型(或使用CFSHOW)。当你真的想要将它克隆到不同的结构(具有不同的类型)时,你必须明确地处理每个可能的CFTypeID。
我创建了一个工作原型 https://gist.github.com/JonnyJD/6126680
编辑:
在another SO answer中,{C}源代码ioreg
已被链接。这应该是打印/提取缺失的CFType的良好资源。