进程遍历-CreateToolhelp32Snapshot系统快照

进程遍历-系统快照

1. 相关函数及结构体

1.1 CreateToolhelp32Snapshot

​ 获取指定进程以及这些进程使用的堆、模块和线程的快照。

HANDLE CreateToolhelp32Snapshot(
  [in] DWORD dwFlags,
  [in] DWORD th32ProcessID
);

​ dwFlags 指出在快照中要包含的系统部分

​ th32ProcessID 为 0 遍历当前程序,不为0则创建指定进程的快照进行遍历

1.2 Process32First

​ 检索有关系统快照中遇到的第一个进程的信息。

BOOL Process32First(
  [in]      HANDLE           hSnapshot,
  [in, out] LPPROCESSENTRY32 lppe
);

​ hSnapshot CreateToolhelp32Snapshot 函数返回的句柄

​ lppe 指向 PROCESSENTRY32 结构的指针,它包含进程信息

1.3 Process32Next

​ 检索有关系统快照中记录的下一个进程的信息。

BOOL Process32Next(
  [in]  HANDLE           hSnapshot,
  [out] LPPROCESSENTRY32 lppe
);

​ hSnapshot CreateToolhelp32Snapshot 函数返回的句柄

​ lppe 指向 PROCESSENTRY32 结构的指针,它包含进程信息

1.4 PROCESSENTRY32

​ 描述采用快照时驻留在系统地址空间中的进程的列表中的条目。

typedef struct tagPROCESSENTRY32 {
  DWORD     dwSize;						结构大小(以字节为单位)。 在调用 Process32First 函数之前,请将此成员设置为 sizeof(PROCESSENTRY32)
  DWORD     cntUsage;					始终设置为零
  DWORD     th32ProcessID;				进程标识符
  ULONG_PTR th32DefaultHeapID;			始终设置为零
  DWORD     th32ModuleID;				始终设置为零
  DWORD     cntThreads;					进程启动的执行线程数
  DWORD     th32ParentProcessID;		创建此进程的进程的标识符 (其父进程) 
  LONG      pcPriClassBase;				此进程创建的任何线程的基本优先级
  DWORD     dwFlags;					始终设置为零
  CHAR      szExeFile[MAX_PATH];		进程的可执行文件的名称
} PROCESSENTRY32;

2. 遍历进程

2.1 遍历进程思路分析

  1. 通过CreateToolhelp32Snapshot 创建进程快照
  2. 通过Process32First 遍历第一个发现的进程
  3. 通过Process32Next 依次遍历后续发现的进程
  4. 处理进程信息结构体

2.2 遍历进程具体实现

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
	PROCESSENTRY32 pEntity32 = { 0 };
	pEntity32.dwSize = sizeof(PROCESSENTRY32);
	INT pCount = 0;

	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	BOOL result = Process32First(hSnapshot, &pEntity32);

	while (result) {
		pCount++;
		printf_s("[%d]:[%ws]\n", pEntity32.th32ProcessID, pEntity32.szExeFile);
		result = Process32Next(hSnapshot, &pEntity32);
	}

	CloseHandle(hSnapshot);

	printf_s("There are totally %d process running on the system.", pCount);
	return 1;
}

在这里插入图片描述

参考文献

[1] https://learn.microsoft.com/zh-cn/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot

[2] https://learn.microsoft.com/zh-cn/windows/win32/api/tlhelp32/nf-tlhelp32-process32first

[3] https://learn.microsoft.com/zh-cn/windows/win32/api/tlhelp32/nf-tlhelp32-process32next

[4] https://learn.microsoft.com/zh-cn/windows/win32/api/tlhelp32/ns-tlhelp32-processentry32

关注我们,咱们在安全的路上,扬帆起航

在这里插入图片描述

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: createtoolhelp32snapshotWindows API中的一个函数,用于创建一个系统进程和模块的快照。它的具体用法是通过调用该函数并传递一个指向PROCESSENTRY32结构的指针来创建快照。这个结构体包含有关进程的信息,例如进程ID,父进程ID,进程名称,线程计数等。这个函数可以帮助开发人员获取有关正在运行的进程的信息,从而进行进程管理和监控。 ### 回答2: CreateToolhelp32Snapshot函数是Windows操作系统提供的一个API函数,位于“kernel32.dll”库中。它被用于获取系统中的进程和线程的快照信息。 这个函数的第一个参数dwFlags用于指定快照的类型,可以是TH32CS_SNAPPROCESS或TH32CS_SNAPTHREAD,分别表示获取进程或者线程的快照。 第二个参数th32ProcessID是要获取快照的目标进程进程ID,如果传入0,则表示获取系统中所有进程快照。 使用CreateToolhelp32Snapshot函数可以创建一个系统进程和线程的快照,这个快照包含了这些进程和线程的详细信息,如进程ID、父进程ID、线程ID、模块计数等等。 返回的是一个句柄HANDLE,该句柄可以被Process32First和Process32Next等函数使用,以在快照遍历获取进程或线程的信息。 使用该API可以方便地获取系统当前运行的进程和线程的信息,进而进行一些系统监视、性能分析或者程序调试的工作。 需要注意的是,通过CreateToolhelp32Snapshot获取的快照信息只是一个静态的快照,也就是说获取到的信息在快照创建时的状态,并不会反映后续的实时变化。如果需要获取实时的进程和线程信息,需要结合其他API函数来实现。 ### 回答3: CreateToolhelp32Snapshot 是一个用于获取系统进程和模块信息的函数。它是 Windows API 中的一个函数,可用于遍历系统中的进程列表以及每个进程中加载的模块列表。 这个函数的调用需要传入一个表示要获取的信息类型的参数,可以是 TH32CS_SNAPPROCESS 或 TH32CS_SNAPMODULE。当传入 TH32CS_SNAPPROCESS 时,函数将返回一个快照句柄,该句柄可以用于获取系统中所有正在运行的进程的详细信息。当传入 TH32CS_SNAPMODULE 时,函数将返回一个快照句柄,该句柄可以用于获取某个指定进程中加载的所有模块的详细信息。 使用 CreateToolhelp32Snapshot 函数时,我们可以通过调用 Process32First 和 Process32Next 函数来遍历进程列表,获取每个进程的信息。同样,我们可以通过调用 Module32First 和 Module32Next 函数来遍历某个指定进程的模块列表,获取每个模块的详细信息。 需要注意的是,在调用 CreateToolhelp32Snapshot 函数返回快照句柄后,我们可以通过调用 CloseHandle 函数来关闭句柄,释放系统资源。同时,在遍历进程或模块列表时,我们需要逐个使用 CloseHandle 函数关闭每个句柄。 使用 CreateToolhelp32Snapshot 函数可以方便地获取系统中正在运行的进程和每个进程加载的模块的信息,这对于了解系统状态、进行进程监控和调试等操作非常有用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值