基本概念

CreateToolhelp32SnapshotWindows系统中Tool Help Library(工具帮助库)提供的核心API函数,用于创建系统 “快照”(Snapshot)—— 即捕获系统中当前进程、线程、模块或堆的瞬时状态,以便后续枚举、查询这些系统对象的详细信息。
生成一个包含系统中指定类型对象(进程、线程、模块、堆)的 “快照” 句柄,通过该句柄可进一步枚举这些对象的详细信息。

基本语法

1
2
3
4
HANDLE CreateToolhelp32Snapshot(
[in] DWORD dwFlags, //快照类型(指定要捕获的对象类型)
[in] DWORD th32ProcessID //进程ID(仅对模块/堆快照有效,其他情况设为0)
);

dwFlags
快照类型,通过位或(|)组合指定需要捕获的对象,常用取值:
常量 含义 说明
TH32CS_SNAPPROCESS 进程快照 捕获系统中所有进程的信息
TH32CS_SNAPTHREAD 线程快照 捕获系统中所有线程的信息
TH32CS_SNAPMODULE 模块快照 捕获th32ProcessID指定进程加载的模块
TH32CS_SNAPHEAPLIST 堆列表快照 捕获th32ProcessID指定进程的堆信息
TH32CS_INHERIT 继承快照句柄 快照句柄可被子进程继承
TH32CS_SNAPALL 所有类型快照 等价于TH32CS_SNAPPROCESS、TH32CS_SNAPTHREAD、TH32CS_SNAPMODULE、TH32CS_SNAPHEAPLIST

th32ProcessID
dwFlags包含TH32CS_SNAPMODULETH32CS_SNAPHEAPLIST时,需指定目标进程的ID(用于获取该进程的模块或堆);
其他情况(如进程、线程快照)设为0,表示捕获系统中所有相关对象。

返回值

成功:返回一个快照句柄(HANDLE),用于后续枚举操作(如Process32First)。
失败:返回INVALID_HANDLE_VALUE(宏定义为-1),可通过GetLastError()获取错误码。

简单示例

枚举系统中所有进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

int main() {
// 1. 创建进程快照(TH32CS_SNAPPROCESS 表示捕获所有进程)
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) {
printf("创建快照失败!错误码:%lu\n", GetLastError());
return 1;
}

// 2. 初始化进程信息结构体(必须设置dwSize)
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);

// 3. 获取第一个进程信息
if (!Process32First(hSnapshot, &pe32)) {
printf("获取进程信息失败!错误码:%lu\n", GetLastError());
CloseHandle(hSnapshot); // 关闭快照句柄,避免资源泄漏
return 1;
}

// 4. 遍历所有进程(Process32Next返回FALSE时结束)
printf("=== 系统进程列表 ===\n");
do {
// 打印进程ID和可执行文件名
printf("PID: %6lu | 父PID: %6lu | 进程名: %s\n",
pe32.th32ProcessID,
pe32.th32ParentProcessID,
pe32.szExeFile);
} while (Process32Next(hSnapshot, &pe32));

// 5. 关闭快照句柄(必须释放资源)
CloseHandle(hSnapshot);
return 0;
}