通过IOKIt命令传递CFDictionary

时间:2017-11-07 14:11:35

标签: macos registry iokit kernel-extension xnu

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

因此,我想通过CFDictionary传递动态变量列表。

IOConnectCallMethod中有一种传递输入指针的方法,但问题是我是否可以传递CFDictionaryCFDictionaryRef而不是简单的结构。

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

1 个答案:

答案 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