通过 IOKIt 命令传递 CFDictionary
Passing CFDictionary via IOKIt command
我正在寻找一种通用方法来配置从用户空间代理到内核的参数,因为没有 Mac 等同于 windows 注册表,其中驱动程序可以直接访问此 [=26] 中的任何键=] 使用 ZwQueryValueKey
命令。
因此,我想通过CFDictionary
传递一个动态变量列表。
在 IOConnectCallMethod
中有一种传递输入指针的方法,但问题是我是否可以传递 CFDictionary
或 CFDictionaryRef
而不仅仅是一个简单的结构。
我看到有一些 IOkit 命令可以让您直接传递 CFDictionaryRef,例如 IOServiceGetMatchingService
但这些命令不是用于驱动程序模块,而是用于管理驱动程序的实体。
您可以使用 I/O 套件 属性 机制在用户 space 和内核 space 之间交换类似 plist 的数据。要从用户 space 设置它们,您需要使用以下一个或多个 IOKitLib 函数:
IORegistryEntrySetCFProperty
IORegistryEntrySetCFProperties
IOConnectSetCFProperty
IOConnectSetCFProperties
在内核端,您的 IOService 或 IOUserClient 子类应该覆盖 virtual IOReturn setProperties( OSObject * properties );
函数。不要忘记将收到的任何数据视为潜在的敌对数据,因此请确保检查 nullptr
s,在期望具体 OSData
/OSNumber
/[=19 时使用 OSDynamicCast()
=]/OSArray
/等。对象,并清理数据本身。
注意 setProperties()
不会自动更新 IORegistryEntry
对象的属性,您仍然需要为每个 属性 key/value 键调用 this->setProperty()
检查后。
苹果也提供some basic high-level documentation这个机制。
我正在寻找一种通用方法来配置从用户空间代理到内核的参数,因为没有 Mac 等同于 windows 注册表,其中驱动程序可以直接访问此 [=26] 中的任何键=] 使用 ZwQueryValueKey
命令。
因此,我想通过CFDictionary
传递一个动态变量列表。
在 IOConnectCallMethod
中有一种传递输入指针的方法,但问题是我是否可以传递 CFDictionary
或 CFDictionaryRef
而不仅仅是一个简单的结构。
我看到有一些 IOkit 命令可以让您直接传递 CFDictionaryRef,例如 IOServiceGetMatchingService
但这些命令不是用于驱动程序模块,而是用于管理驱动程序的实体。
您可以使用 I/O 套件 属性 机制在用户 space 和内核 space 之间交换类似 plist 的数据。要从用户 space 设置它们,您需要使用以下一个或多个 IOKitLib 函数:
IORegistryEntrySetCFProperty
IORegistryEntrySetCFProperties
IOConnectSetCFProperty
IOConnectSetCFProperties
在内核端,您的 IOService 或 IOUserClient 子类应该覆盖 virtual IOReturn setProperties( OSObject * properties );
函数。不要忘记将收到的任何数据视为潜在的敌对数据,因此请确保检查 nullptr
s,在期望具体 OSData
/OSNumber
/[=19 时使用 OSDynamicCast()
=]/OSArray
/等。对象,并清理数据本身。
注意 setProperties()
不会自动更新 IORegistryEntry
对象的属性,您仍然需要为每个 属性 key/value 键调用 this->setProperty()
检查后。
苹果也提供some basic high-level documentation这个机制。