我正在寻找一种通用方法来配置从用户空间代理到内核的参数,因为没有相当于Windows注册表的Mac,其中驱动程序可以使用ZwQueryValueKey
命令直接访问此表中的任何键。
因此,我想通过CFDictionary
传递动态变量列表。
在IOConnectCallMethod
中有一种传递输入指针的方法,但问题是我是否可以传递CFDictionary
或CFDictionaryRef
而不是简单的结构。
我看到有一些IOkit命令可以让你直接传递CFDictionaryRef,例如IOServiceGetMatchingService
,但这些命令不适用于驱动程序模块,而是适用于管理驱动程序的实体。
答案 0 :(得分:1)
您可以使用I / O Kit属性机制在用户空间和内核空间之间交换类似plist的数据。要从用户空间设置它们,您需要使用以下一个或多个IOKitLib函数:
IORegistryEntrySetCFProperty
IORegistryEntrySetCFProperties
IOConnectSetCFProperty
IOConnectSetCFProperties
在内核方面,您的IOService或IOUserClient子类应覆盖virtual IOReturn setProperties( OSObject * properties );
函数。不要忘记将收到的任何数据视为具有潜在敌意的数据,因此请务必检查nullptr
,并在预期具体OSDynamicCast()
/ OSData
/ {{1时使用OSNumber
}} / OSString
/等。对象,并清理数据本身。
请注意,OSArray
不会自动更新setProperties()
对象的属性,在检查完每个属性键/值后,您仍需要调用IORegistryEntry
。
Apple也为此机制提供some basic high-level documentation。