Windows系统编程 - 进程遍历
文章目录
- 前言
- 进程的遍历
- CreateToolhelp32Snapshot
- Process32First
- Process32Next
- 进程遍历
- 总结
前言
- 各位师傅好,我是qmx_07,今天给大家讲解进程遍历的相关知识点
进程的遍历
- 快照:使用vmware虚拟机的时候,经常需要配置环境服务,拍照保存,以防以后 环境崩溃,又需要重新配置
- 思路:进程遍历 通过快照的方式,把当前系统的进程信息创建一份快照,浏览相关信息.
CreateToolhelp32Snapshot
- 介绍:用于创建系统快照,包含 进程、线程、模块相关信息,需要引用<tlhelp32.h>
HANDLE CreateToolhelp32Snapshot(
[in] DWORD dwFlags,//保存快照的类型
[in] DWORD th32ProcessID//创建快照的进程ID
);
- dwFlags 取值:
TH32CS_SNAPPROCESS:创建包含当前运行进程的快照。
TH32CS_SNAPTHREAD:创建包含当前运行线程的快照。
TH32CS_SNAPMODULE:创建包含当前加载模块的快照。
TH32CS_SNAPMODULE32:创建包含当前加载模块的快照,返回32位模块结构。
TH32CS_SNAPALL:创建包含当前运行进程、线程和模块的快照。
- th32ProcessID:创建快照的进程ID,0表示当前进程
通常用于获取系统中运行的进程和模块的信息,例如获取进程列表、查找特定进程、遍历模块信息等。通过遍历系统快照,可以获得进程、线程和模块的详细信息,进而进行相应的操作和分析
Process32First
介绍:通过CreateToolhelp32Snapshot函数创建的进程快照中获取第一个进程的信息
BOOL Process32First(
[in] HANDLE hSnapshot,//快照句柄
[in, out] LPPROCESSENTRY32 lppe//指向PROCESSENTRY32的指针,用于接收进程的相关信息
);
PROCESSENTRY32结构定义如下:
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;//进程ID
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;//模块ID
DWORD cntThreads;//线程数
DWORD th32ParentProcessID;//父进程ID
LONG pcPriClassBase;//进程优先级
DWORD dwFlags;
CHAR szExeFile[MAX_PATH];//进程名称
} PROCESSENTRY32;
结构包含了进程的各种信息,包括进程ID、父进程ID、线程数量、进程优先级等
Process32First函数通常与Process32Next函数一起使用,用于遍历进程快照中的所有进程
Process32Next
- 介绍:通过CreateToolhelp32Snapshot函数创建的进程快照中获取下一个进程的信息
BOOL Process32Next(
[in] HANDLE hSnapshot,/快照句柄
[out] LPPROCESSENTRY32 lppe//指向LPPROCESSENTRY32的指针
);
注意:使用Process32Next函数之前,必须先调用一次Process32First函数来获取第一个进程的信息
进程遍历
#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>
#include <stdio.h>
using namespace::std;
int main()
{
HANDLE hProcessSnap = NULL;
//创建,获取进程的信息
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
//结构体
PROCESSENTRY32 pe32 = { 0 };
//填写结构体中的第一个成员
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
//First成功之后,进入循环
//循环的时候调一下next,通过xxx拿一下进程的信息
do
{
printf("pid:%d\t name:%s\r\n", pe32.th32ProcessID, pe32.szExeFile);
} while (Process32Next(hProcessSnap, &pe32));
}
CloseHandle(hProcessSnap);
}
- 这边拿到的进程ID 基本与任务管理器一致,但是HACKER Process能拿到更多,包含内核的进程
总结
- 介绍了快照的基本概念,CreateToolhelp32Snapshot创建快照,LPPROCESSENTRY32结构,以及ProcessFirst,ProcessNext遍历进程