Windows编程之进程遍历(C++实现)
Windows编程之进程遍历
PS: 主要扣代码使用,直接滑动到最下面使用.
遍历进程需要几个API,和一个结构体
1.创建进程快照
2.遍历首次进程
3.继续下次遍历
4.进程信息结构体
API 分别是:
1.创建进程快照
HANDLE WINAPI CreateToolhelp32Snapshot( 进程快照API
DWORD dwFlags, 遍历的标志,表示你要遍历什么(进程,模块,堆...)
DWORD th32ProcessID 遍历的进程ID,如果为0,则是当前进程,如果不为0,则是创建指定进程的快照进行遍历
);
注意,创建进程快照需要包含头文件 Tlhelp32.h
返回值:
成功返回快照句柄
失败返回 INVALID_HANDLE_VALUE
2.遍历首次进程.
BOOL WINAPI Process32First(
HANDLE hSnapshot, 进程快照句柄
LPPROCESSENTRY32 lppe 传入进程信息结构体,系统帮你填写.
);
进程信息结构体
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; 进程信息结构体大小,首次调用之前必须初始化
DWORD cntUsage; 引用进程的次数,引用次数为0时,则进程结束
DWORD th32ProcessID; 进程的ID
ULONG_PTR th32DefaultHeapID; 进程默认堆的标识符,除工具使用对我们没用
DWORD th32ModuleID; 进程模块的标识符
DWORD cntThreads; 进程启动的执行线程数
DWORD th32ParentProcessID; 父进程ID
LONG pcPriClassBase; 进程线程的基本优先级
DWORD dwFlags; 保留
TCHAR szExeFile[MAX_PATH]; 进程的路径
} PROCESSENTRY32;
typedef PROCESSENTRY32 *PPROCESSENTRY32;
对我们有用的就是
dwSize 初始化结构体的大小
th32ProcessId 进程ID
szExeFile[MAX_PATH] 进程路径 3.遍历下一次进程
BOOL WINAPI Process32Next(
HANDLE hSnapshot, 进程句柄
LPPROCESSENTRY32 lppe 进程信息结构体
);
兼容代码
#include <windows.h>
#include <Tlhelp32.h>
int main(int argc, char* argv[])
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
BOOL bRet = Process32First(hSnapshot,&pi);
while (bRet)
{
/*
循环遍历添加自己的额外代码
*/
bRet = Process32Next(hSnapshot,&pi);
}
return ;
}
自己写的测试输出代码.
#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
int main(int argc, char* argv[])
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
BOOL bRet = Process32First(hSnapshot,&pi);
while (bRet)
{
/*
循环遍历添加自己的额外代码
*/
printf("进程ID = %d ,进程路径 = %s\r\n",pi.th32ProcessID,pi.szExeFile);
bRet = Process32Next(hSnapshot,&pi);
}
return ;
}
输出内容

常用代码之根据进程名返回对应PID
DWORD PsLookupProcessIdByProcessName(string CompareFile)
{ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
BOOL bRet = Process32First(hSnapshot, &pi);
while (bRet)
{
string TempFile = pi.szExeFile;
if (TempFile.find(CompareFile) != TempFile.npos)
{
return pi.th32ProcessID;
} bRet = Process32Next(hSnapshot, &pi);
}
return ;
}
常用代码之根据PID 返回进程名
string PsLookupProcessNameByProcessId(DWORD dwPid)
{ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
BOOL bRet = Process32First(hSnapshot, &pi);
while (bRet)
{ if (dwPid == pi.th32ProcessID)
{
return pi.szExeFile;
} bRet = Process32Next(hSnapshot, &pi);
}
return ;
}
Windows编程之进程遍历(C++实现)的更多相关文章
- Windows编程之模块遍历(C++实现)
Windows编程之模块遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历模块需要几个API,和一个结构体 1.创建进程快照 2.遍历首次模块 3.继续下次遍历 4.模块信息结构体 API 分 ...
- windows编程 进程的创建销毁和分析
Windows程序设计:进程 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,在Windows编程环境下,主要由两大元素组成: • 一个是操作系统用来管理进程的内核对象.操作系统使用内 ...
- 操作系统,windows编程,网络,socket
首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改. 这十几天学了点关于操作系统.windows编程和网络,主要 ...
- 【转】浅析Windows编程的剪贴板
摘要: 本文对Windows剪贴板机制作了深入.全面的阐述,具体内容包括:文本.位图.DSP.自定义格式剪贴板的使用和多数据项和延迟提交技术. 关键词: VC++6.0: 剪贴板机制:数据格式:延迟提 ...
- 《Windows编程零基础学》第零节
首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...
- powershell脚本之windows服务与进程
powershell脚本之windows服务与进程 服务与进程的区别: Windows服务是指系统自动完成的,不需要和用户交互的过程,可长时间运行的可执行应用程序 进程是程序运行的实例,系统会给运行中 ...
- Windows编程的本质
既然Windows API编程是与Windows操作系统进行交互,所以就必须对Windows操作系统如何运行应用程序的原理搞清楚. 1.保护模式 操作系统是依附于cpu硬件的,所以操作系统所具备的功能 ...
- MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)
为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题 ...
- windows编程经典书籍
本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好.驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家发 ...
随机推荐
- [最短路]P1462 通往奥格瑞玛的道路
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...
- 分布式监控系统Zabbix3.2跳坑指南
zabbix是什么在此就不多作介绍了,可以参考之前的文章 零代码如何打造自己的实时监控预警系统 ,这篇主要介绍安装及注意事项. 主要分为服务端和客户端安装,客户端又分为Linux.Windows. 服 ...
- Less 编译工具
Less 编译工具 虽然你可以选择在浏览器端使用Less,直接在页面中嵌入一个 Less.js 文件,你也可以选择在服务器端使用Less,使用命令行将Less文件编译成最终的CSS文件. 然而,这两种 ...
- python利用scrapy框架爬取起点
先上自己做完之后回顾细节和思路的东西,之后代码一起上. 1.Mongodb 建立一个叫QiDian的库,然后建立了一个叫Novelclass(小说类别表)Novelclass(可以把一级类别二级类别都 ...
- mysql分区分表
为毛要分表和分区,,,,所有数据库的通病,文件越大,性能越低...那问题就来了.数据越多文件越大...无解?哎,所以说知道 为毛要分区了吧!那分表又是毛线?分表就是把一张表拆分成若干表,,,根据情况常 ...
- [Docker基础]Docker安装教程
Install Docker Docker支持几乎所有的Linux发行版,也支持Mac和Windows. 各操作系统的安装方法可参考Docker官网. 安装环境 ubuntu 16.04 Docker ...
- javascript设计模式——模板方法模式
前面的话 在javascript开发中用到继承的场景其实并不是很多,很多时候喜欢用mix-in的方式给对象扩展属性.但这不代表继承在javascript里没有用武之地,虽然没有真正的类和继承机制,但可 ...
- JAVA实现同域单点登录
所用技术: SSM MySQL Maven Tomcat8.0 同域单点登录详细步骤如下: 1.首先写一个登录界面(隐藏域为暂存地址) 2.判断用户密码是否正确,正确则添加cookie,否则返回错误页 ...
- java web学习笔记 servlet
关于java web web.xml中一般配置的都是与servlet先关的可以配置servlet filter listener context-param用来配置web应用的启动参数,可用通过Ser ...
- ettercap的中间人欺骗+sslstrip过滤掉https协议
环境准备:kali系统 因为kali系统自带ettercap,比较方便, 不需要安装 ifcofing命令查看当前网关 ,当前的IP是: 172.16.42.1 查找局域网所有主机 通过netdisc ...