【问题标题】:Passing CFDictionary via IOKIt command通过 IOKIt 命令传递 CFDictionary
【发布时间】:2017-11-07 14:11:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: macos registry iokit kernel-extension xnu


    【解决方案1】:

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

    • IORegistryEntrySetCFProperty
    • IORegistryEntrySetCFProperties
    • IOConnectSetCFProperty
    • IOConnectSetCFProperties

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-25
      • 2016-03-06
      • 2016-07-21
      • 2021-12-13
      • 1970-01-01
      • 2020-08-18
      • 2014-10-17
      • 2014-11-05
      • 2012-11-02
      相关资源
      最近更新 更多