【发布时间】:2014-12-26 01:21:26
【问题描述】:
我正在尝试创建一个关闭其他进程的打开文件句柄的应用程序。除了这会导致应用程序不稳定之外,我还想继续这个练习。我已经成功地枚举了使用this example (download link) 对特定文件具有打开句柄或锁定的进程。简而言之,我只剩下一个 SYSTEM_HANDLE 对象或它的副本(HANDLE 类型):
SYSTEM_HANDLE handle = handleInfo->Handles[i];
HANDLE dupHandle = NULL;
if (!NT_SUCCESS(NtDuplicateObject(processHandle, (HANDLE)handle.Handle, GetCurrentProcess(), &dupHandle, 0, 0, 0)))
{
continue;
}
我尝试关闭SYSTEM_HANDLE,但没有成功:
wcout << "Found " << fullPath << " in process " << process << "." << endl;
if (CloseHandle((HANDLE)handle.Handle))
{
wcout << "Closed handle successfully." << endl;
}
SYSTEM_HANDLE 结构定义为:
typedef struct _SYSTEM_HANDLE
{
ULONG ProcessId;
BYTE ObjectTypeNumber;
BYTE Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;
应用程序对我撒谎,因为它打印出"Closed handle successfully.",但是当我再次枚举它的打开句柄时,这个句柄出现了。例如,如果我使用像LockHunter 这样的应用程序来关闭句柄,如果我再次枚举它,它就不会出现。如何关闭此句柄?
【问题讨论】:
-
@RaymondChen 这个问题太宽泛了,不能重复。标题为“删除被另一个进程锁定的文件”,这是一个非常开放的问题,如果这是 Stack 上这个主题的唯一内容,那么没有多少人会找到他们正在寻找的东西。问题本身是这样写的,“......也许有人以前遇到过这种情况,你可以给我/我们一个关于绕过测试代码锁定的可能方法的例子”;也许只有我一个人,但要绕过锁,你可以做很多事情,比如终止一个锁的过程等等,所以我不能把这个问题看作是一个重复的问题。
-
建议副本中的问题是“如何关闭另一个进程中的句柄?”这也是你想要做的。
-
@RaymondChen 不是那样的措辞。这就是您解释问题的方式。
-
不确定您的 cmets 与关闭手柄有什么关系。我认为你应该开始一个新问题。
标签: c++ .net visual-c++ process handle