我有一个具有一对多关系的 IOKit 基础驱动程序/守护程序项目(意味着多个客户端连接到单个驱动程序)。
核心驱动程序是一个 IOKit 对象IOService
,它是从IOUserClient
. 这些是用户空间客户端的代理(每个用户空间客户端一个)
我的目标是在具有root权限的命令的情况下防止驱动程序卸载kextunload
,这样只有当最后一个客户端断开连接(进程终止或调用IOServiceClose
)时,驱动程序才会自动关闭(无需kextunload
手动执行)
为了检查我需要禁用/邮寄哪些 IOKit 命令,我已经用相关的打印消息包装了基本回调,并在连接 2 个客户端IOService
的运行场景中观察了日志:kextunload
kernel: (driver) virtual bool com_osxkernel_driver::terminate(IOOptionBits)
kernel: (driver) virtual bool com_osxkernel_driverClient::terminate(IOOptionBits)
kernel: (driver) virtual bool com_osxkernel_driverClient::terminate(IOOptionBits)
kernel: (driver) virtual void com_osxkernel_driverClient::stop(IOService *)
kernel: (driver) virtual void com_osxkernel_driverClient::stop(IOService *)
kernel: (driver) virtual void com_osxkernel_driver::stop(IOService *)
--
似乎即使我从每个IOUserClient
提供者那里获取参考,并在 上释放这些参考IOUserClient::clientClose
,该kextunload
命令仍然成功。
我发现实现目标的唯一方法是推迟::terminate
命令并从::clientClose
.
所以我删除了对的调用IOService::terminate
,而是从IOUserClient::clientClose()
. 这里是相关代码:
IOReturn com_osxkernel_driverClient::clientClose()
{
myProvider->release();
return super::terminate(kIOServiceSynchronous) ? kIOReturnSuccess : kIOReturnError;
}
bool com_osxkernel_driverClient::terminate(IOOptionBits options) {
os_log_info(g_logger,"%s", __PRETTY_FUNCTION__);
return true;
}
我想知道是否有任何不那么老套的方法来防止kextunload
成功和控制驱动程序卸载的时间。
谢谢