如何迭代IO Kit的密钥?

时间:2013-06-04 15:47:22

标签: c++ c macos

我正在尝试获取系统中所有设备的列表以及它们的连接方式。因此,我想基本上克隆IO Kit服务树的结构(您可以使用IORegistryExplorer看到)。如何遍历所有键? (这让我感到困惑的一个原因是因为我不明白io_serviceio_registryio_object之间的区别是什么。

1 个答案:

答案 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的良好资源。