Macos 删除驱动程序启动plist文件后使kextcache无效

Macos 删除驱动程序启动plist文件后使kextcache无效,macos,launchd,kernel-extension,xnu,Macos,Launchd,Kernel Extension,Xnu,我已经为我的驱动程序创建了卸载程序,它将从/Library/LaunchDaemons中删除匹配的plist文件,以便在下一个引导周期启动时不会再次加载它。 然而,它似乎没有对我的驱动程序产生任何影响,在启动机器后,驱动程序仍在正常加载 在对这件事做了一些研究之后,我发现kextcache是这种行为的原因,为了清除/使其无效,我需要触摸安装目标卷所在的文件夹。然而,这并没有产生任何效果 我的问题是如何正确地使kext缓存无效,以便launchd在删除kext对应的plist文件后不会加载kext

我已经为我的驱动程序创建了卸载程序,它将从
/Library/LaunchDaemons
中删除匹配的plist文件,以便在下一个引导周期启动时不会再次加载它。 然而,它似乎没有对我的驱动程序产生任何影响,在启动机器后,驱动程序仍在正常加载

在对这件事做了一些研究之后,我发现
kextcache
是这种行为的原因,为了清除/使其无效,我需要
触摸安装目标卷所在的文件夹。然而,这并没有产生任何效果

我的问题是如何正确地使kext缓存无效,以便launchd在删除kext对应的plist文件后不会加载kext

由于下面的答案,我使kext缓存无效。但是,我希望使用与objective-c中的现有文件夹相同的方法来访问我的卸载程序助手所基于的文件夹

准确地说,下面是我想转换为objective-C的代码:


sudotouch/System/Library/Extensions;sudotouch/Library/Extensions

使kext缓存无效的正确方法是

sudo touch /System/Library/Extensions
或在支持从/库加载扩展的操作系统版本中:

sudo touch /Library/Extensions

执行此操作后,kext缓存将自动重新生成。

使kext缓存无效的正确方法是

sudo touch /System/Library/Extensions
或在支持从/库加载扩展的操作系统版本中:

sudo touch /Library/Extensions

执行此操作后,kext缓存将自动重新生成。

手动键入时,它似乎可以工作,但通过objective-c卸载帮助程序从applescript运行时,我什么也没做。也许您可以告诉我我的代码有什么问题,
NSString*script=[NSString stringWithFormat:@“do shell script\”touch/Library/Extensions/;touch/System/Library/Extensions/”;NSAppleScript*appleScript=[[NSAppleScript new]initWithSource:script]。请注意,我在特权模式下运行它也会很高兴听到如果你有更好的方法从ObjuleC中编写的unSuffer-Help命令,但是如果值得的话,我可以考虑把它改成其他语言。你需要使用绝对路径/Urr/bin /触摸,因为PATH环境变量在该环境中故意为空,以防止helpers作为根用户运行任意代码。如果这没有帮助,请尝试直接使用posix_spawn运行它,例如
pid_t pid=-1;char*args[]={“touch”,“/Library/Extensions”,NULL};posix_spawn(&pid,“/usr/bin/touch”,NULL,NULL,args,NULL)
并查看它返回的内容以及
errno
等于什么。如果使用这种方法,请不要忘记在以后的过程中使用
waitpid()
。当我手动键入它时,它似乎起作用,但当我通过objective-c卸载帮助程序从applescript运行它时,我什么也没做。也许您可以告诉我我的代码有什么问题,
NSString*script=[NSString stringWithFormat:@“do shell script\”touch/Library/Extensions/;touch/System/Library/Extensions/”;NSAppleScript*appleScript=[[NSAppleScript new]initWithSource:script]。请注意,我在特权模式下运行它也会很高兴听到如果你有更好的方法从ObjuleC中编写的unSuffer-Help命令,但是如果值得的话,我可以考虑把它改成其他语言。你需要使用绝对路径/Urr/bin /触摸,因为PATH环境变量在该环境中故意为空,以防止helpers作为根用户运行任意代码。如果这没有帮助,请尝试直接使用posix_spawn运行它,例如
pid_t pid=-1;char*args[]={“touch”,“/Library/Extensions”,NULL};posix_spawn(&pid,“/usr/bin/touch”,NULL,NULL,args,NULL)
并查看它返回的内容以及
errno
等于什么。如果使用这种方法,请不要忘记在以后的过程中使用
waitpid()