62.根据系统进程快照获得枚举系统进程PROCESSENTRY32、CreateToolhelp32Snapshot、Process32First、Process32Next
程序员文章站
2022-07-05 11:51:26
...
首先要包含头文件,帮助工具函数的头文件
#include <TlHelp32.h>
先说一个结构体,用于保存取得操作系统进程快照的信息
PROCESSENTRY32
typedef struct tagPROCESSENTRY32
{
DWORD dwSize; //结构体大小
DWORD cntUsage; //此进程引用次数计数器,已不再使用,总是0
DWORD th32ProcessID; // 当前进程ID号,进程表示符
ULONG_PTR th32DefaultHeapID; //进程默认堆,已不再使用,总是0
DWORD th32ModuleID; // 进程模块ID
DWORD cntThreads; //此进程开启的线程计数器
DWORD th32ParentProcessID; // 父进程ID号
LONG pcPriClassBase; // 进程优先权
DWORD dwFlags; //标志,已不再使用
CHAR szExeFile[MAX_PATH]; // 进程的文件名
} PROCESSENTRY32;
typedef PROCESSENTRY32 * PPROCESSENTRY32;
typedef PROCESSENTRY32 * LPPROCESSENTRY32;
CreateToolhelp32Snapshot获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照。
HANDLE
WINAPI
CreateToolhelp32Snapshot(
DWORD dwFlags,//指定“快照”中需要返回的对象
DWORD th32ProcessID //指定“快照”中需要返回的对象
);
DWORD dwFlags 返回对象标志说明
// dwFlags
//
#define TH32CS_SNAPHEAPLIST 0x00000001 //在快照中包含在th32ProcessID中指定的进程的所有的堆
#define TH32CS_SNAPPROCESS 0x00000002 //在快照中包含系统中所有的进程
#define TH32CS_SNAPTHREAD 0x00000004 //在快照中包含系统中所有的线程
#define TH32CS_SNAPMODULE 0x00000008 //在快照中包含在th32ProcessID中指定的进程的所有的模块
#define TH32CS_SNAPMODULE32 0x00000010
#define TH32CS_SNAPALL (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE) //返回以上所有信息(进程、线程、堆和模块信息)
#define TH32CS_INHERIT 0x80000000 //声明快照句柄是可继承的
DWORD th32ProcessID参数说明:
指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照
Process32First 是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄
BOOL
WINAPI
Process32First(
HANDLE hSnapshot, //系统快照句柄
LPPROCESSENTRY32 lppe //PROCESSRNTRY32结构体指针
);
根据快照句柄取得第一个进程的PROCESSENTRY32信息
返回值,成功返回TRUE,失败返回FALSE
Process32Next 根据系统快照句柄,获得First之后其他的PROCESSENTRY32进程信息
BOOL
WINAPI
Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
实例如下:
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>
PROCESSENTRY32 peSnap;
int main()
{
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
BOOL bRet = TRUE;
memset(&peSnap,0,sizeof(PROCESSENTRY32));
peSnap.dwSize = sizeof(PROCESSENTRY32);
if(hSnap == INVALID_HANDLE_VALUE)
{
printf("Create snapshot error:%d\n",GetLastError());
return 1;
}
bRet = Process32First(hSnap,&peSnap);
while(bRet)
{
printf("进程号:%6d-->进程名:%s\n",peSnap.th32ProcessID,peSnap.szExeFile);
bRet = bRet && Process32Next(hSnap,&peSnap);
}
system("pause");
return 0;
}