【发布时间】:2013-08-26 07:04:53
【问题描述】:
有时,当我尝试删除我的一个进程的 exe 文件时,我从GetLastError 收到以下错误:
Error: 32
The process cannot access the file because it is being used by another process.
有没有办法使用 C++ 和 WinAPI 找出锁定该文件的原因?
【问题讨论】:
-
@Naveen:谢谢。顺便说一句,不错的 CodeProject 文章。我需要阅读它。只是好奇,
Unlocker也是如何使用设备驱动程序解锁文件的吗? -
@c00000fd:您需要设备驱动程序的唯一原因是能够在不死锁的情况下区分普通文件和命名管道。除此之外,这一切都可以从用户模式完成,尽管有一些困难(假设你有正确的权限)。您不需要需要驱动程序来解锁文件——例如,您可以将线程注入到另一个关闭句柄的进程中。或者您可以使用
DuplicateHandle(..., DUPLICATE_CLOSE_SOURCE)。但是驱动程序使事情变得容易得多。 -
@c00000fd:司机并不可怕。 (顺便说一句,这些不是“设备”驱动程序。)您只需说
CreateFile("\\.\DriverObjectName")为他们创建的对象打开一个HANDLE,并使用DeviceIoControl与他们通信。只要您不编写驱动程序(您不需要这样做...... Process Hacker 已经编写好了它,只需使用它提供的驱动程序)这有点容易。您只需要确保适当地调用CreateService等,即可在正确的时间创建/删除/启动/停止驱动程序。 -
对于 Vista 及以上的解决方案,您可以使用Restart Manager。 Raymond Chen 有一篇关于这个主题的博客文章:How do I find out which process has a file open?。