macos – 通过IOKIt命令传递CFDictionary

我正在寻找一种通用方法来配置从用户空间代理到内核的参数,因为没有Mac等效于
Windows注册表,其中驱动程序可以使用ZwQueryValueKey命令直接访问此表中的任何键.

因此,我想通过CFDictionary传递一个动态的变量列表.

在IOConnectCallMethod中有一种传递输入指针的方法,但问题是我是否可以传递CFDictionary或CFDictionaryRef而不仅仅是一个简单的结构.

我看到有一些IOkit命令可以让你直接传递CFDictionaryRef,比如IOServiceGetMatchingService,但这些命令不适用于驱动程序模块,而是适用于管理驱动程序的实体.

最佳答案 您可以使用I / O Kit属性机制在用户空间和内核空间之间交换类似plist的数据.要从用户空间设置它们,您需要使用以下一个或多个IOKitLib函数:

> IORegistryEntrySetCFProperty
> IORegistryEntrySetCFProperties
> IOConnectSetCFProperty
> IOConnectSetCFProperties

在内核方面,您的IOService或IOUserClient子类应覆盖虚拟IOReturn setProperties(OSObject *属性);功能.不要忘记将收到的任何数据视为具有潜在敌意的数据,因此请确保检查nullptrs,在期望具体的OSData / OSNumber / OSString / OSArray / etc时使用OSDynamicCast().对象,并清理数据本身.

请注意,setProperties()不会自动更新IORegistryEntry对象的属性,在检查后,您仍需要为每个属性键/值键调用this-> setProperty().

Apple也为此机制提供了some basic high-level documentation.

点赞