C++ kextunload:类也有实例

C++ kextunload:类也有实例,c++,macos,kernel-extension,C++,Macos,Kernel Extension,与此处发布的问题类似: 我正在努力了解需要做些什么来解决这个问题 在KEXT中,我们有一个启动的launchctl守护进程,该守护进程将启动,等待加载KEXT,执行sysctl以加载KEXT的配置 我们通过使用kext调用registerService()来实现这一点: 小“zconfigd”在这里等待它: 相当小的一段代码,摘自苹果的一个例子。所以我认为它会像预期的那样发布所有内容 如果我尝试卸载kext,它会拒绝(在Sierra上),因为类有实例。如果我杀了zconfigd(即使launc

与此处发布的问题类似: 我正在努力了解需要做些什么来解决这个问题

在KEXT中,我们有一个启动的launchctl守护进程,该守护进程将启动,等待加载KEXT,执行sysctl以加载KEXT的配置

我们通过使用kext调用registerService()来实现这一点: 小“zconfigd”在这里等待它:

相当小的一段代码,摘自苹果的一个例子。所以我认为它会像预期的那样发布所有内容

如果我尝试卸载kext,它会拒绝(在Sierra上),因为类有实例。如果我杀了zconfigd(即使launchctl将启动一个新的),我可以很好地加载它。假设我可以在sysctl被执行后让它退出(0),但是最好弄清楚它为什么会保留这个示例中的类。想必这很简单


我们还有一个课堂问题,但这是最简单的,我想我应该从小步骤开始。

啊,我喜欢在你发布/询问问题后发现问题。在这种情况下,IOIteratorNext()返回的对象必须通过调用IOObjectRelease()来释放。通过将其粘贴到具有find Match的子句中,我们可以在不重新启动zconfig的情况下卸载kext。下一步可能会困难得多。是的,保留来自用户空间的引用(令人惊讶?)也会将实例保留在内核中。不幸的是,我认为Clang的静态分析器无法检测到IOKitLib泄漏。啊,我喜欢在你发布/询问问题后发现问题。在这种情况下,IOIteratorNext()返回的对象必须通过调用IOObjectRelease()来释放。通过将其粘贴到具有find Match的子句中,我们可以在不重新启动zconfig的情况下卸载kext。下一步可能会困难得多。是的,保留来自用户空间的引用(令人惊讶?)也会将实例保留在内核中。不幸的是,我认为Clang的静态分析仪无法检测到IOKitLib泄漏。