欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}
相关标签: win32 API