遍历进程有多种方法,我是用的是 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);</