枚举当前系统进程--CreateToolhelp32Snapshot

这篇博文使用 用EnumProcesses()枚举进程 


要对当前系统所有已开启的进程进行枚举,就必须首先获得那些加载到内存的进程当前相关状态信息。在Windows操作系统下,这些进程的当前状态信息不能直接从进程本身获取,系统已为所有保存在系统内存中的进程、线程以及模块等的当前状态的信息制作了一个只读副本--系统快照,用户可以通过对系统快照的访问完成对进程当前状态的检测。在具体实现时,系统快照句柄的获取是通过Win32 API函数CreateToolhelp32Snapshot()来完成的,通过该函数不仅可以获取进程快照,而且对于堆、模块和线程的系统快照同样可以获取。

使用这个函数前必须在头文件里包含tlhelp32.h头文件。
CreateToolhelp32Snapshot函数为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。
HANDLE WINAPI CreateToolhelp32Snapshot(
      DWORD dwFlags,
      DWORD th32ProcessID
);
参数:其中,参数dwFlags:指定将要创建包含哪一类系统信息的快照句柄,本程序中只需要检索系统进程信息,因此可将其设置为TH32CS_SNAPPROCESS;函数第二个参数th32ProcessID`则指定了进程的标识号,当设置为0时指定当前进程。
dwFlags
[输入]指定快照中包含的系统内容,这个参数能够使用下列数值(变量)中的一个。
TH32CS_INHERIT - 声明快照句柄是可继承的。
TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
th32ProcessID
[输入]指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或TH32CS_SNAPMOUDLE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。
返回值:调用成功,返回快照的句柄,调用失败,返回INVAID_HANDLE_VALUE。
备注:使用GetLastError函数查找该函数产生的错误状态码。
要删除快照,使用CloseHandle函数。 在得到快照句柄之后只能以只读的方式对其进行访问。至于对系统快照句柄的使用同普通对象句柄的使用并没有什么太大区别,在使用完之后也需要通过CloseHandle()函数将其销毁。

BOOL Process32First()函数
参数:HANDLE hSnapshot 传入的Snapshot句柄
参数:LPPROCESSENTRY32 lppe 指向PROCESSENTRY32结构的指针
作用:从Snapshot得到第一个进程记录信息

BOOL Process32Next()函数
参数:HANDLE hSnapshot 传入的Snapshot句柄
参数:LPPROCESSENTRY32 lppe 指向PROCESSENTRY32结构的指针
作用:从Snapshot得到下一个进程记录信息

BOOL Module32First()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
作用:从Snapshot得到第一个Module记录信息

BOOL Module32Next()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
作用:从Snapshot得到下一个Module记录信息

BOOL Thread32First()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPTHREADENTRY32 lpte指向一个 THREADENTRY32结构的指针
作用:从Snapshot得到第一个Thread记录信息

BOOL Thread32Next()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPTHREADENTRY32 lpte指向一个 THREADENTRY32结构的指针
作用:从Snapshot得到下一个Thread记录信息

HANDLE OpenProcess()函数
参数:DWORD dwDesiredAccess 权限描叙信息
这里我用到了PROCESS_ALL_ACCESS功能是具有所有权限
参数:BOOL bInheritHandle 确定该句柄是否可以被程继承
参数:dwPrcessID 进程ID号
作用:打开一个存在的进程对象

列举进程
在得到系统的快照句柄后,就可以对当前进程的标识号进行枚举了,通过这些枚举出的进程标识号可以很方便的对进程进行管理。进程标识号通过函数Process32First() 和 Process32Next()而得到,这两个函数可以枚举出系统当前所有开启的进程,并且可以得到相关的进程信息。这两个函数原型声明如下:
BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
BOOL WINAPI Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);
以上两个函数分别用于获得系统快照中第一个和下一个进程的信息,并将获取得到的信息保存在指针lppe所指向的PROCESSENTRY32结构中。函数第一个参数hSnapshot为由CreateToolhelp32Snapshot()函数返回得到的系统快照句柄;第二个参数lppe为指向结构PROCESSENTRY32的指针,PROCESSENTRY32结构可对进程作一个较为全面的描述,其定义如下:
typedef struct tagPROCESSENTRY32 {
	DWORD dwSize; // 结构大小;
	DWORD cntUsage; // 此进程的引用计数;
	DWORD th32ProcessID; // 进程ID;
	DWORD th32DefaultHeapID; // 进程默认堆ID;
	DWORD th32ModuleID; // 进程模块ID;
	DWORD cntThreads; // 此进程开启的线程计数;
	DWORD th32ParentProcessID; // 父进程ID;
	LONG pcPriClassBase; // 线程优先权;
	DWORD dwFlags; // 保留;
	char szExeFile[MAX_PATH]; // 进程全名;
} PROCESSENTRY32;

以上三个API函数均在头文件tlhelp32.h中声明,运行时需要有kernel32.lib库的支持。通过这三个函数可以枚举出当前系统已开启的所有进程,并可获取到进程的各相关信息。

#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>

int main()
{
	PROCESSENTRY32 pe32;

	pe32.dwSize = sizeof(PROCESSENTRY32);
	HANDLE hProcessSanp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if(hProcessSanp == INVALID_HANDLE_VALUE)
	{
		printf("Error Get the Process SnapShot\n");
		return -1;
	}
	BOOL bMore = Process32First(hProcessSanp,&pe32);
	while(bMore)
	{
		printf("Process Name: %s\t\tProcess ID: %d\n",pe32.szExeFile,pe32.th32ProcessID);
		bMore = Process32Next(hProcessSanp,&pe32);
	}
	CloseHandle(hProcessSanp);
	getchar();
	return 0;
}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iot-genius

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值