0、思考
1、相关api
TlHelp32.h
CreateToolhelp32Snapshot
TH32CS_SNAPMODULE
MODULEENTRY32
Module32First
Module32Next
CloseHandle
3、api说明
#define MAX_MODULE_NAME32 255
HANDLE
WINAPI
CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
#define TH32CS_SNAPHEAPLIST 0x00000001
#define TH32CS_SNAPPROCESS 0x00000002
#define TH32CS_SNAPTHREAD 0x00000004
#define TH32CS_SNAPMODULE 0x00000008
#define TH32CS_SNAPMODULE32 0x00000010
#define TH32CS_SNAPALL (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
#define TH32CS_INHERIT 0x80000000
typedef struct tagMODULEENTRY32W
{
DWORD dwSize;
DWORD th32ModuleID;
DWORD th32ProcessID;
DWORD GlblcntUsage;
DWORD ProccntUsage;
BYTE * modBaseAddr;
DWORD modBaseSize;
HMODULE hModule;
WCHAR szModule[MAX_MODULE_NAME32 + 1];
WCHAR szExePath[MAX_PATH];
} MODULEENTRY32W;
typedef MODULEENTRY32W * PMODULEENTRY32W;
typedef MODULEENTRY32W * LPMODULEENTRY32W;
BOOL
WINAPI
Module32FirstW(
HANDLE hSnapshot,
LPMODULEENTRY32W lpme
);
BOOL
WINAPI
Module32NextW(
HANDLE hSnapshot,
LPMODULEENTRY32W lpme
);
typedef struct tagMODULEENTRY32
{
DWORD dwSize;
DWORD th32ModuleID;
DWORD th32ProcessID;
DWORD GlblcntUsage;
DWORD ProccntUsage;
BYTE * modBaseAddr;
DWORD modBaseSize;
HMODULE hModule;
char szModule[MAX_MODULE_NAME32 + 1];
char szExePath[MAX_PATH];
} MODULEENTRY32;
typedef MODULEENTRY32 * PMODULEENTRY32;
typedef MODULEENTRY32 * LPMODULEENTRY32;
BOOL
WINAPI
Module32First(
HANDLE hSnapshot,
LPMODULEENTRY32 lpme
);
BOOL
WINAPI
Module32Next(
HANDLE hSnapshot,
LPMODULEENTRY32 lpme
);
#ifdef UNICODE
#define Module32First Module32FirstW
#define Module32Next Module32NextW
#define MODULEENTRY32 MODULEENTRY32W
#define PMODULEENTRY32 PMODULEENTRY32W
#define LPMODULEENTRY32 LPMODULEENTRY32W
#endif // !UNICODE
4、c++封装
5、
6、举个栗子
#include <windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void main ()
{
{
HANDLE hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0);
cout << "CreateToolhelp32Snapshot TH32CS_SNAPMODULE" << endl;
cout << "dwSize \t GlblcntUsage \t hModule \t modBaseAddr \t modBaseSize \t ProccntUsage \t szExePath \t szModule \t th32ModuleID \t th32ProcessID \t" << endl;
MODULEENTRY32 me32 = {sizeof (me32) };
if (Module32First (hSnapshot, &me32)) {
do {
cout << me32.dwSize << "\t";
cout << me32.GlblcntUsage << "\t";
cout << me32.hModule << "\t";
cout << me32.modBaseAddr << "\t";
cout << me32.modBaseSize << "\t";
cout << me32.ProccntUsage << "\t";
_tprintf (_T("%s\t"), me32.szExePath);
_tprintf (_T("%s\t"), me32.szModule);
cout << me32.th32ModuleID << "\t";
cout << me32.th32ProcessID<< "\t";
cout << endl;
}
while (Module32Next (hSnapshot, &me32));
}
CloseHandle (hSnapshot);
cout << endl;
}
{
HANDLE hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE32, 0);
cout << "CreateToolhelp32Snapshot TH32CS_SNAPMODULE32" << endl;
cout << "dwSize \t GlblcntUsage \t hModule \t modBaseAddr \t modBaseSize \t ProccntUsage \t szExePath \t szModule \t th32ModuleID \t th32ProcessID \t" << endl;
MODULEENTRY32 me32 = {sizeof (me32) };
if (Module32First (hSnapshot, &me32)) {
do {
cout << me32.dwSize << "\t";
cout << me32.GlblcntUsage << "\t";
cout << me32.hModule << "\t";
cout << me32.modBaseAddr << "\t";
cout << me32.modBaseSize << "\t";
cout << me32.ProccntUsage << "\t";
_tprintf (_T("%s\t"), me32.szExePath);
_tprintf (_T("%s\t"), me32.szModule);
cout << me32.th32ModuleID << "\t";
cout << me32.th32ProcessID<< "\t";
cout << endl;
}
while (Module32Next (hSnapshot, &me32));
}
CloseHandle (hSnapshot);
cout << endl;
}
}