我已经构建了一个卸载程序,它调用具有提升权限的帮助程序可执行文件来删除我的驱动程序的launchd-plist,这样它就不会在下一个引导周期再次出现。
为了反映新阶段,我使用此问题/Library/LaunchDaemons
中显示的以下命令使 kextcache 无效 。touch /Library/Extensions/
但是,当我在删除 plist 文件后立即从帮助程序可执行文件中执行此操作时,它不会成功,并且我的驱动程序在重新启动后仍然会运行。当我touch /Library/Extensions
在卸载程序助手完成后立即通过键入命令手动执行此操作时,它就可以了。
这是我的代码在第一个选项中的样子(从助手 exec 无效)。
remove(OSX_LAUNCHD_PLIST_PATH);
pid_t pid = -1;
char const * args[] = {"touch", "/Library/Extensions", NULL};
posix_spawn(&pid, "/usr/bin/touch", NULL, NULL, (char **)args, NULL);
waitpid(pid, &status, WNOHANG|WUNTRACED);
也许你可以告诉我为什么我在每个选项中都有不同的行为。
更新:
似乎缓存失效需要多次重复此命令。这段代码对我有用,但我不知道为什么......
for (int x=0 ; x < 2; x++ ) {
char const * args[] = {"touch", "/Library/Extensions", NULL};
posix_spawn(&pid, "/usr/bin/touch", NULL, NULL, (char **)args, NULL);
waitpid(pid, &status, WNOHANG|WUNTRACED);
char const * args2[] = {"touch", "/System/Library/Extensions", NULL};
posix_spawn(&pid, "/usr/bin/touch", NULL, NULL, (char **)args2, NULL);
waitpid(pid, &status, WNOHANG|WUNTRACED);
}