如何关闭SYSTEM_HANDLE(或另一个进程中的一些打开文件句柄)

时间:2014-10-30 05:15:43

标签: c++ .net visual-c++ process handle

我正在尝试创建一个关闭其他进程的打开文件句柄的应用程序。除了这会导致应用程序不稳定这一事实外,我还想继续这项工作。我已成功使用this exampledownload 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这样的应用程序关闭句柄,如果我再次枚举它,它就不会显示出来。我该如何关闭这个句柄?

1 个答案:

答案 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应该做同样的技巧。