c++ - 获取特定进程的句柄数
问题描述
不确定是否可以获得此类信息,但我正在搞乱 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 个句柄。到底是怎么回事?
解决方案
首先,GetProcessHandleCount
返回HANDLE
调用进程已打开的 s 数量。其次,它有点不可靠。
GetProcessHandleCount
HANDLE
将在内核初始化对象表并且您的进程启动后返回 s 的数量。对于不同版本的 Windows,已有句柄的数量会有所不同,具体取决于内核的设计方式。其中一些句柄是已知 DLL 目录的句柄HYPORVISOR_SHARED_DATA
,等等。一旦创建了所有“基本”句柄并main
调用了进程,则GetProcessHandleCount
返回从该点打开的句柄数。
因此,进程对象表中的实际HANDLE
s 数量与使用GetProcessHandleCount
. 你得到高于 1 的结果是因为即使在内核初始化对象表之后,它CRT
也会打开文件和内存部分,返回HANDLE
s
我认为你期待 1 因为调用GetCurrentProcess().
But that returns (HANDLE)-1
,这不是真实的HANDLE.
HANDLE's
如果您想要进程数的真实计数,请使用NtQuerySystemInformation
并循环HANDLE's
使用您的进程 ID。(旁注,GetProcessHandleCount
电话NtQueryInformationProcess
。)
推荐阅读
- node.js - 团队扩展引发 UnhandledPromiseRejectionWarning 错误:BotFrameworkAdapter.processActivity():501 错误
- regex - 使用正则表达式检测类似 sql 的查询
- ruby-on-rails - 使用 caprover 将 Rails 应用程序部署到 digitalocean
- javascript - JS/TS 功能仅在为一个用户清除浏览器缓存后才有效,但在刷新页面后它停止工作 - ASP NET MVC 应用程序
- reactjs - Hooks 不支持第二个回调参数
- python - 将对齐输出从 format_alignment (Biopython) 转换为图像
- javascript - AWS - 如何使用 Socket.io 连接到特定端口?
- python - 如何正确(重新)解释编码文本?
- android-studio - Bug NavigationDrawer 和 SlidesTabs
- sql - 使用 SUM 时出错:聚合可能不会出现在 UPDATE 语句的集合列表中