1

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

因此,我想通过CFDictionary.

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

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

4

1 回答 1

1

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

  • IORegistryEntrySetCFProperty
  • IORegistryEntrySetCFProperties
  • IOConnectSetCFProperty
  • IOConnectSetCFProperties

在内核方面,您的 IOService 或 IOUserClient 子类应该覆盖该virtual IOReturn setProperties( OSObject * properties );函数。不要忘记将收到的任何数据视为潜在的敌对数据,因此请确保检查nullptrs,在OSDynamicCast()期待具体的OSData////等OSNumber时使用。对象,并清理数据本身。OSStringOSArray

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

Apple也为此机制提供了一些基本的高级文档。

于 2017-11-07T14:53:43.037 回答