c++ 进程快照 c++ windows下如何创建其他进程的快照

浅晨吖_1425

浅晨吖_1425

2026-03-21

824人浏览

原创

createtoolhelp32snapshot 是 windows api 函数,用于获取进程等系统对象的只读快照句柄,需配合 process32first/next 遍历,返回信息仅含 pid、映像名等元数据,不含完整路径或内存状态,且须显式关闭句柄并注意权限与架构匹配。

c++ 进程快照 c++ windows下如何创建其他进程的快照

GetProcessSnapshot 不存在,得用 CreateToolhelp32Snapshot

Windows 下没有叫 GetProcessSnapshot 或类似名字的 C++ 标准函数。真正在用的是 Windows API 的 CreateToolhelp32Snapshot,它返回一个“快照句柄”,不是进程内存镜像,而是当前时刻系统中进程、线程、模块等信息的只读副本。

常见错误是以为它能抓取目标进程的内存状态(比如寄存器、堆栈),其实不能——它只提供静态元数据:PID、父 PID、映像名、创建时间等。

  • CreateToolhelp32Snapshot 必须搭配 Process32First / Process32Next 遍历,不能直接读取
  • 调用前需确保有 SE_DEBUG_NAME 权限(否则可能看不到系统进程或被拒绝访问)
  • 快照句柄必须用 CloseHandle 显式关闭,否则泄漏内核对象
  • 快照本身不实时更新,后续进程变化不会反映在已获取的快照中

遍历进程时 PROCESSENTRY32 的 szExeFile 只有文件名,不含路径

很多人想靠快照拿到某个进程的完整路径(比如判断是不是 C:\App\evil.exe),但 PROCESSENTRY32.szExeFile 字段只存进程映像名(如 notepad.exe),不是全路径。这是设计限制,不是 bug。

若真需要路径,得额外调用 OpenProcess + QueryFullProcessImageName(Win7+)或 GetModuleFileNameEx(需 Psapi.lib),且要求有足够权限。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • QueryFullProcessImageName 第二个参数传 0 表示获取 Win32 路径;传 1 是 NT 内部路径(\Device\HarddiskVolume1\...)
  • 即使开了 SE_DEBUG_NAME,某些保护进程(如杀软、Edge renderer 进程)仍会拒绝打开,OpenProcess 返回 NULL
  • 32 位程序调用 QueryFullProcessImageName 获取 64 位进程路径会失败,需匹配架构或用 Wow64DisableWow64FsRedirection

权限不够时 CreateToolhelp32Snapshot 不报错,但遍历不到进程

CreateToolhelp32Snapshot 即使没权限也会成功返回句柄,只是后续 Process32First 可能返回 FALSE,且 GetLastError() 是 ERROR_PARTIAL_COPY 或更隐蔽的 ERROR_ACCESS_DENIED —— 很多人忽略检查错误码,以为“没进程”。

典型场景:普通用户运行程序去扫 svchost.exe 或 lsass.exe,句柄看着正常,但循环一次就停了。

  • 务必在 Process32First 后立刻检查返回值,再调 GetLastError()
  • 提升权限不是加个 manifest 就行,还得实际以管理员身份运行(UAC 弹窗确认)
  • 有些进程即使管理员也没法读(如受 HVCI 或 Credential Guard 保护的 lsass.exe),这时连 OpenProcess 都会被拦截

别用快照替代实时监控,它本质是“拍照片”

快照适合做一次性枚举(比如任务管理器启动时列进程),不适合监听进程启停。有人试图每 100ms 重打快照对比 PID 列表来“监控”,这既低效又不可靠:进程 PID 可能复用,快照间隙里进程可能已启停多次。

真要响应进程创建/退出,得用 WTSRegisterSessionNotification + WM_WTSSESSION_CHANGE(粗粒度)、或驱动级 ETW/Event Log 订阅(精确但复杂),再或者用 PsSetCreateProcessNotifyRoutine(仅驱动)。

  • 频繁调用 CreateToolhelp32Snapshot 会触发内核锁竞争,尤其在多核高负载下性能抖动明显
  • 快照句柄本身占用内核资源,短生命周期也要 CloseHandle,否则累积后系统变慢
  • 64 位系统上,32 位进程快照看不到 64 位进程的完整信息(如某些字段为 0),这不是 bug,是 WoW64 层的裁剪行为
事情说清了就结束

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.21

2922

5

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.05

2574

4

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

2025.04.24

2992

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1678

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5647

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2448

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5647

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2448

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习