通过 IOKIt 命令传递 CFDictionary

Passing CFDictionary via IOKIt command

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

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

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

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

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

  • IORegistryEntrySetCFProperty
  • IORegistryEntrySetCFProperties
  • IOConnectSetCFProperty
  • IOConnectSetCFProperties

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

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

苹果也提供some basic high-level documentation这个机制。