gpt4 book ai didi

c++ - 防止 IOKit 驱动程序在 "kextunload"中关闭,除非某些客户端保持连接

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:10 25 4
gpt4 key购买 nike

我有一对多关系的 IOKit 基础驱动程序/守护程序项目(意味着多个客户端连接到单个驱动程序)。

核心驱动是一个派生自IOService的IOKit对象,也是派生自IOUserClient的驱动客户端提供者。这些是用户空间客户端的代理(每个用户空间客户端一个)

我的目标是防止驱动程序在 kextunload 命令的情况下卸载,只有当最后一个客户端断开连接时(进程终止或调用 IOServiceClose),驱动程序将自动关闭(无需手动执行 kextunload)

为了检查我需要禁用/后接电话的 IOKit 命令,我用相关的打印消息包装了基本的 IOService 回调,并在运行 kextunload 的场景中观察了日志 其中连接了 2 个客户端:

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 成功并控制驱动程序卸载的时间。

谢谢

最佳答案

如果你看the kextunload source code ,您会看到它向下调用 IOCatalogueTerminate()。在内核中,这最终进入了 IOCatalogue::_terminateDrivers() 函数。 (xnu 源代码中的 IOCatalogue.cpp)您会看到以下内容针对属于正在卸载的 kext 的每个 IOKit 类实例运行:

if ( !service->terminate(kIOServiceRequired|kIOServiceSynchronous) ) 
{
ret = kIOReturnUnsupported;
break;
}

这表明停止 kext 的 IORegistry 条目的唯一方法确实是从 terminate() 返回 false。

像这样硬阻止它是否是个好主意当然完全是另一个问题。我建议您仅在卸载会危及操作系统的稳定性时才这样做。考虑到 kextunload 需要 root 权限,因此在大多数情况下,最好在用户空间代码中简单地处理服务和用户客户端的终止。

如果您确实从 terminate() 返回 false,您还需要注意不要出于合法原因阻止终止。 (例如,如果它是一个设备驱动程序,您的驱动程序匹配的 nub,例如 IOUSBInterface 可能会尝试 terminate() 如果设备是热拔出的,您的驱动程序实例。)

关于c++ - 防止 IOKit 驱动程序在 "kextunload"中关闭,除非某些客户端保持连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47529410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com