首页 > 解决方案 > 获取特定进程的句柄数

问题描述

不确定是否可以获得此类信息,但我正在搞乱 WinAPI 文档,试图找出一种方法来获取我的进程打开的句柄数量。首先,我创建了一个控制台应用程序来检索当前进程拥有的句柄数,然后我创建了另一个控制台应用程序,它通过 OpenProcess 调用获取第一个应用程序的句柄。第一个应用程序中使用的代码如下:

auto hProcess = GetCurrentProcess();
while (true)
{
    DWORD Handles = 0;
    if (GetProcessHandleCount(hProcess, &Handles))
    {
        std::cout << Handles << '\n';
    }
    Sleep(2000);
}

我期待第一个应用程序打印 1,但是当我在我的 Windows 10 PC 上运行时我得到了 50,当我以提升的权限运行它时得到了 58。此外,当我在带有 Windows 7 的虚拟机中运行上述代码时,打印了 11 个句柄。到底是怎么回事?

标签: c++windowswinapi

解决方案


首先,GetProcessHandleCount返回HANDLE调用进程已打开的 s 数量。其次,它有点不可靠。

GetProcessHandleCountHANDLE将在内核初始化对象表并且您的进程启动后返回 s 的数量。对于不同版本的 Windows,已有句柄的数量会有所不同,具体取决于内核的设计方式。其中一些句柄是已知 DLL 目录的句柄HYPORVISOR_SHARED_DATA,等等。一旦创建了所有“基本”句柄并main调用了进程,则GetProcessHandleCount返回从该点打开的句柄数。

因此,进程对象表中的实际HANDLEs 数量与使用GetProcessHandleCount. 你得到高于 1 的结果是因为即使在内核初始化对象表之后,它CRT也会打开文件和内存部分,返回HANDLEs

我认为你期待 1 因为调用GetCurrentProcess().But that returns (HANDLE)-1,这不是真实的HANDLE.

HANDLE's如果您想要进程数的真实计数,请使用NtQuerySystemInformation并循环HANDLE's使用您的进程 ID。(旁注,GetProcessHandleCount电话NtQueryInformationProcess。)


推荐阅读