如何从 IOKit 读取 IORegistry 中 属性 的类型?

How to read the type of a property in IORegistry from IOKit?

例如,在以下来自 IOKit documentation 的示例中,此设备的每个条目都有不同的类型,例如数据、数字等

如何使用IOKit读取它的类型?我知道我们可以使用 IORegistryEntryCreateCFProperties 为条目创建字典并将 属性 读取为 void pointer 并将其转换为我们知道的类型,但我怎么知道它的类型不使用 IORegistry Explorer 查看一下?

请注意,您可以使用类似的函数 IORegistryEntryCreateCFProperty 来仅查询一个 属性,这通常更有用,除非您实际上正在尝试构建类似于 IORegistryExplorer 本身的东西并且不还不知道您要检查的属性的名称。

在这两种情况下,这实际上归结为核心基础问题。您会注意到 void* 并不是真正不透明的 IORegistryEntryCreateCFProperty(),而是 return 是 CFTypeRef,同样地,IORegistryEntryCreateCFProperties() 承诺仅 return CoreFoundation-type 个对象在其字典中。这意味着您可以使用 CFGetTypeID(). The exact value of this is meaningless, but it can be compared to the type IDs for the expected set of types, e.g. CFStringGetTypeID() for CFString, CFDataGetTypeID() 来查询对象的类型 CFData 等等。

如果您使用 Objective-C,您还可以执行桥接转换并将 属性 值视为 NSObject - 然后使用例如找出特定类型[object isKindOfClass:[NSString class]].