遍历进程
1. 获取系统快照
- CreateToolhelp32Snapshot
- 定义
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
- 参数
dwFlags | 描述 |
---|---|
TH32CS_INHERIT | 进程的创建者可以访问进程的子进程 |
TH32CS_SNAPALL | 在快照中包含系统中的所有进程和线程 |
TH32CS_SNAPHEAPLIST | 在快照中包含在th32ProcessID中指定的进程的所有的堆 |
TH32CS_SNAPMODULE | 在快照中包含在th32ProcessID中指定的进程的所有的模块 |
TH32CS_SNAPPROCESS | 在快照中包含系统中所有的进程 |
TH32CS_SNAPTHREAD | 在快照中包含系统中所有的线程 |
- 返回值 如果成功,则返回一个进程快照的句柄;如果失败,则返回INVALID_HANDLE_VALUE
2. 遍历进程信息
在调用 CreateToolhelp32Snapshot
创建系统快照后,首先需要用 Process32First
函数获取快照中的第一个进程信息
然后用 Process32Next
函数依次获取快照中的下一个进程信息,直到没有更多的进程信息为止
- Process32First和Process32Next
- 定义
BOOL WINAPI Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
BOOL WINAPI Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
-
参数
参数 描述 hSnapshot 进程快照的句柄 lppe 指向PROCESSENTRY32结构的指针,用于接收进程信息 -
返回值 如果成功,则返回TRUE;如果失败,则返回FALSE
-
PROCESSENTRY32结构 PROCESSENTRY32结构用于保存有关系统中单个进程的快照信息。它定义在头文件 <tlhelp32.h> 中,是使用 ToolHelp32 API(如 CreateToolhelp32Snapshot、Process32First、Process32Next 等)遍历系统进程时的重要数据结构。 PROCESSENTRY32结构包含以下成员,可以使用
.成员名
访问这些成员。
- dwSize 描述: 表示结构体的大小(以字节为单位)。在使用前必须设置为 sizeof(PROCESSENTRY32)。 用途: 告诉系统传入的结构体有多大,帮助 API 校验数据缓冲区的大小,确保数据写入安全和正确。
- cntUsage 描述: 该字段记录了该进程条目的使用计数。 用途: 虽然具体用途较少在应用层代码中使用,但它可能与进程计数或资源管理有关,用于表示该进程被工具或系统引用的次数。
- th32ProcessID
描述: 保存进程的唯一标识符(PID)。 用途: 这是定位、操作和管理进程最常用的信息,因为大部分 API 调用都需要提供进程 ID。 - th32DefaultHeapID 描述: 表示进程默认堆的标识符,通常是一个句柄。 用途: 虽然在很多应用中可能用不到该字段,但它可用于内存管理及分析进程堆使用情况。
- th32ModuleID 描述: 该字段存储与进程相关的模块 ID。 用途: 在一些早期版本的 Windows 中用于标识进程的主模块信息,现在一般情况下不常用或保留供系统内部使用。
- cntThreads 描述: 表示进程中当前运行的线程数量。 用途: 这个字段有助于了解进程的并发度和资源占用情况,在监控和调试时尤其有用。
- th32ParentProcessID 描述: 指示当前进程的父进程 ID。 用途: 用于追踪进程树、确定进程的启动者以及理解进程间的父子关系。
- pcPriClassBase 描述: 记录该进程内所有线程的基本优先级。 用途: 在需要进行优先级调整或分析进程调度时,这个信息提供了初始的优先级参考。
- dwFlags 描述: 保留字段,当前通常为 0。 用途: 虽然定义在结构体中,但目前大部分文档中没有说明特定用途,多为内部保留使用。
- szExeFile 描述: 一个字符数组,存储该进程对应的可执行文件的名称(例如 “notepad.exe”)。 用途: 常用于进程过滤与定位,比如通过比较 szExeFile 的值来确定是否找到了目标进程。
- 疑问
- 为什么要用结构体而不是数组?
- 数组只能保存固定数量的元素,而结构体可以保存任意数量的元素,而且可以根据需要动态分配内存。
- pe32.dwSize = sizeof(PROCESSENTRY32); 为什么要设置这个值?
- 在文档PROCESSENTRY32结构指出
-
在调用 Process32First 函数之前,请将此成员设置为 sizeof(PROCESSENTRY32)。 如果未初始化 dwSize, 则 Process32First 将失败。
-
- 在文档PROCESSENTRY32结构指出
- 为什么要用结构体而不是数组?
遍历线程
THREADENTRY32结构
THREADENTRY32结构用于保存有关系统中单个线程的快照信息。它定义在头文件 <tlhelp32.h> 中,是使用 ToolHelp32 API(如 CreateToolhelp32Snapshot、Thread32First、Thread32Next 等)遍历系统线程时的重要数据结构。
THREADENTRY32结构包含以下成员,可以使用.成员名
访问这些成员。
- dwSize 描述: 表示结构体的大小(以字节为单位)。在使用前必须设置为 sizeof(THREADENTRY32)。 用途: 告诉系统传入的结构体有多大,帮助 API 校验数据缓冲区的大小,确保数据写入安全和正确。
- cntUsage 描述: 该字段记录了该线程条目的使用计数。 用途: 虽然具体用途较少在应用层代码中使用,但它可能与线程计数或资源管理有关,用于表示该线程被工具或系统引用的次数。
- th32ThreadID
描述: 保存线程的唯一标识符(TID)。 用途: 这是定位、操作和管理线程最常用的信息,因为大部分 API 调用都需要提供线程 ID。 - th32OwnerProcessID 描述: 指示线程所属进程的 ID。 用途: 用于追踪线程树、确定线程的启动者以及理解线程间的父子关系。
- tpBasePri 描述: 记录线程的基本优先级。 用途: 在需要进行优先级调整或分析线程调度时,这个信息提供了初始的优先级参考。
- tpDeltaPri 描述: 记录线程的增量优先级。 用途: 在需要进行优先级调整或分析线程调度时,这个信息提供了增量的优先级参考。
- dwFlags 描述: 保留字段,当前通常为 0。 用途: 虽然定义在结构体中,但目前大部分文档中没有说明特定用途,多为内部保留使用。