当前位置: 首页 > article >正文

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遍历进程

http://www.kler.cn/a/401425.html

相关文章:

  • OSRM docker环境启动
  • vue 常用特性 ( 计算属性 | 侦听器 | 过滤器 )
  • nodejs入门(1):nodejs的前后端分离
  • 百度智能云 VectorDB 优势数量 TOP 1
  • 通过华为鲲鹏认证发行上市的集成平台产品推荐
  • 【gitlab】gitlabrunner部署
  • 力扣hot100-->二分查找
  • 【HBase】【大数据技术基础】实验五 HBase基础编程实验
  • 华为VPN技术
  • 12万字 | 企业智慧数字化运营平台重构建设项目实施技术方案
  • 【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器
  • 淘宝商品爬虫:Python实战指南
  • PMC要接受什么培训?
  • 【K8S系列】Kubernetes Pod节点ImagePullBackOff 状态及解决方案详解【已解决】
  • CentOS 9 无法启动急救方法
  • 前端框架主要做些什么工作
  • WPF中的登录界面
  • FastDDS之进程内通信
  • 统计学习模型相关知识简记
  • 基于springboot健康医院门诊在线挂号系统源码和论文
  • 2024山西省网络建设运维第十八届职业院校技能大赛解析答案(3. ansible 服务)
  • 计算机网络 (2)计算机网络的类别
  • Java-04 深入浅出 MyBatis - SqlSessionFactory 与 SqlSession DAO与Mapper 代理模式
  • Kubernetes部署Grafana详细教程
  • SpringBoot线程池的使用
  • H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解