遍历进程+遍历模块

这篇博客介绍了如何通过CreateToolhelp32Snapshot获取进程快照以及使用Process Status Helper(psapi)库的EnumProcessModules函数遍历进程模块。作者提供了适用于32位VC6或Visual Studio的代码,能够遍历32/64位进程,但仅能枚举32位进程模块。为枚举64位模块,需要对代码进行修改,主要涉及指针转换的部分。
摘要由CSDN通过智能技术生成

遍历进程有多种方法,我是用的是 CreateToolhelp32Snapshot 进程快照的方式;遍历模块我用的是 Process Status Helper 的函数,VC6需要下载 psapi.h 和相应的静态库文件,我已经上传好了。
https://pan.baidu.com/s/1AY-6J1rZ0nM4QGIy4uSVkQ
提取码:ord2

我下面的代码可以用32位的VC6或者visual studio编译,可以遍历32/64位进程,但是只能遍历32位进程的模块,因为32位编译的 EnumProcessModules 函数只能枚举32位进程的模块。如果程序是64位的,则可以枚举64位进程的模块,如果需要使程序能枚举64位进程模块,可以自行修改(要改的地方应该蛮多的,涉及指针强转的都要改)。

程序运行结果是这样的:
打印了程序和子模块的 ImageBase 和 SizeOfImage

在这里插入图片描述

代码

// EnumProcessAndModules.cpp : Defines the entry point for the console application.
//

#include "StdAfx.h"
#include <stdio.h>
#include <MALLOC.H>
#include <windows.h>
#include <LOCALE.h>
#include <TLHELP32.H>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")

#include <vector>

#ifdef _UNICODE
#define _tprintf wprintf
#else
#define _tprintf printf
#endif



struct ModuleInfo
{
   
	TCHAR szExeFile[MAX_PATH];	// 模块文件名
	DWORD ImageBase;
	DWORD SizeOfImage;
};

struct ProcessInfo
{
   
	ModuleInfo MainModuleInfo;	// 主模块信息
	DWORD dwPID;				// 进程ID
	ModuleInfo *modules;		// 子模块数组
	DWORD dwModules;			// 子模块数量

// 	~ProcessInfo()
// 	{
   
// 		free(modules);
// 	}
};

DWORD TakeProcessSnapshot(std::vector<ProcessInfo> &processInfos);
DWORD EnumModulesHandle(HANDLE hProcess, HMODULE **lpModule);</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值