如何关闭SYSTEM_HANDLE(或其他进程中打开的文件句柄)

3

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

1
可能是重复的问题:删除被另一个进程锁定的文件 - Raymond Chen
我不确定你的评论与关闭处理有什么关系。我认为你应该开启一个新问题。 - Raymond Chen
我认为你把StackOverflow和产品支持渠道混淆了。 - Raymond Chen
已经有反馈渠道可以报告这些问题,请使用它们。我不在客户支持部门工作。 - Raymond Chen
@RaymondChen,这个英特尔管理引擎接口驱动程序会导致Windows无法启动,因此检查Windows 10的引导代码以查明原因并可能发布修复程序可能是一个好主意,因为像这样的驱动程序不应该有停止操作系统的能力,而且也是一种责任。很抱歉我要像这样使用Stack Overflow来联系您,正如您所说的,“支持渠道”,但与少数几个可以解决此问题的人之一取得联系可能是个好主意。我这么做不是为了自己,而是为了其他人。 - Alexandru
显示剩余3条评论
1个回答

1
我应该更好地阅读我的链接,因为wj32明确指出:
(第三步:关闭远程句柄)要关闭其他进程打开的句柄,只需在选项参数中指定DUPLICATE_CLOSE_SOURCE(1)调用DuplicateHandle(它在MSDN页面上有文档,所以去读一下)。您可以将目标进程句柄和目标句柄参数指定为NULL。例如:
DuplicateHandle(handleToTheRemoteProcess,theRemoteHandle,NULL,NULL, 0,FALSE,0x1);
尽管在我的情况下,从代码来看,如果我传递DUPLICATE_CLOSE_SOURCE,NtDuplicateObject也应该起到同样的作用。

刚测试了一下,它可以正常工作:NtDuplicateObject(processHandle, (HANDLE)handle.Handle, 0, 0, 0, 0, 1); - Alexandru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接