【发布时间】:2018-05-10 11:50:56
【问题描述】:
目前我有一个具有文件过滤驱动程序的软件,在安装软件期间,驱动程序以这种方式作为服务启动:
CreateService(serviceManager, name, displayName,
SERVICE_START | DELETE | SERVICE_QUERY_STATUS | SERVICE_STOP,
SERVICE_FILE_SYSTEM_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
path, NULL, NULL, NULL, NULL, NULL);
路径是C:\Program Files(x86)\TSU\driver\TSUfsd.sys。
我遇到的问题是在卸载软件期间。当软件尝试删除 TSUfsd.sys 文件时,它会拒绝我访问。
我检查了软件如何删除驱动程序,结果发现它使用DeleteService函数将其删除,并等待服务将其状态从SERVICE_STOP_PENDING更改为SERVICE_STOPPED,如果之后没有发生一段时间后,它会获取服务PID 并使用ProcessTerminate 将其杀死,然后尝试使用rmdir /S /Q C:\Program Files(x86)\TSU\ 删除该文件。
我试图找到可能拥有文件句柄的进程(使用进程资源管理器)但找不到任何文件。然后我想也许服务还活着,所以我输入了sc query TSUfsd,但服务也消失了。
我也尝试更改权限并向我的用户授予完全权限,但仍然出现同样的错误。
所以我的问题是:
还有其他方法可以检查哪个进程(或其他任何东西)可以持有文件吗?
我还注意到,每当我尝试使用 Cygwin(
rm TSUfsd.sys) 删除文件时,它都会毫无问题地删除文件。用 cmd(del /f <filename>) 和 cygwin 删除文件有什么区别?
【问题讨论】:
-
Mark Russinovich 有一个名为
hanlde.exe的不错的实用程序。除了你想在代码中自己做,那么你可以枚举所有进程并检查它们的句柄? -
在 Windows 10 中 - 系统保留已加载的驱动程序,在卸载驱动程序之前不要删除它
标签: c windows winapi cmd cygwin