我正在尝试创建一个关闭其他进程打开的文件句柄的应用程序。除了这会导致应用程序不稳定外,我想继续进行这个练习。使用此示例(下载链接),我已成功枚举具有对特定文件打开的句柄或锁定的进程。简而言之,我只剩下一个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;
这个应用程序欺骗了我,因为它打印出“成功关闭句柄”,但当我再次枚举它的打开句柄时,该句柄会显示出来。例如,如果我使用像 LockHunter这样的应用程序来关闭句柄,则再次枚举它时,它不会显示出来。我该如何关闭此句柄?