我正在尝试创建一个关闭其他进程的打开文件句柄的应用程序。除了这会导致应用程序不稳定这一事实外,我还想继续这项工作。我已成功使用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这样的应用程序关闭句柄,如果我再次枚举它,它就不会显示出来。我该如何关闭这个句柄?
答案 0 :(得分:1)
我应该更好地阅读自己的链接,因为wj32明确指出:
(步骤3:关闭远程手柄)关闭其他人打开的手柄 进程,您只需使用DUPLICATE_CLOSE_SOURCE调用DuplicateHandle (1)在options参数中指定(它在MSDN上记录) DuplicateHandle的页面,请继续阅读)。您可以为。指定NULL 目标进程句柄和目标句柄参数。例如:
DuplicateHandle(handleToTheRemoteProcess,theRemoteHandle,NULL,NULL, 0,FALSE,0x1);
虽然在我的情况下,从代码判断,如果我传入DUPLICATE_CLOSE_SOURCE,NtDuplicateObject应该做同样的技巧。