如何迭代IO Kit的密钥?

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

服务,注册表和对象之间的区别仅在于它们被使用的情况。 否则它们完全相同 。 来自IOTypes.h:

 typedef io_object_t io_registry_entry_t; typedef io_object_t io_service_t; 

有关于遍历I / O注册表的文档,其中还包含有关遍历整个注册表的信息。 对于每个条目,您必须获取属性并使用您对注册表的表示来保存它们。

因此,您将使用IORegistryGetRootEntry() ,打印/保存其名称和属性,然后使用IORegistryEntryGetChildIterator()迭代子项。

您可以在CFDictionaryGetKeysAndValues()之后获得IORegistryEntryCreateCFProperties()的属性。 对于这些值,您必须检查打印/保存它们的类型(或使用CFSHOW)。 当你真的想要将它克隆到不同的结构(具有不同的类型)时,你必须明确地处理每个可能的CFTypeID。

我在https://gist.github.com/JonnyJD/6126680上创建了一个工作原型


编辑:

在另一个SO答案中 , ioreg的(C)源代码是链接的。 这应该是打印/提取丢失的CFType的良好资源。