相關 struct
typedef struct tagMODULEENTRY32 {
DWORD dwSize; // struct 大小
DWORD th32ModuleID; // 不用,設0
DWORD th32ProcessID; // 使用此 module 之 process ID
DWORD GlblcntUsage; // 通常 = 0xffff
DWORD ProccntUsage; // 與 GlblcntUsage 同
BYTE *modBaseAddr; // 此 module 於 process 之起始位置
DWORD modBaseSize; // module 大小, bytes
HMODULE hModule; // module's handle
TCHAR szModule[MAX_MODULE_NAME32 + 1]; // module 名
TCHAR szExePath[MAX_PATH]; // module 全名
} MODULEENTRY32, *PMODULEENTRY32;
原始碼
// ==================================
// filename: ListModules1.cpp
// compiler: vs2008
// author : EdisonX (Edison.Shih.)
//
// **** all rights reserve ****
// ==================================
#include <windows.h>
#include <stdio.h>
#include <TlHelp32.h>
BOOL ListModule(DWORD PID)
{
DWORD x;
HANDLE hModules;
MODULEENTRY32 mEntry;
hModules = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
if(hModules==INVALID_HANDLE_VALUE){
printf("CreateToolhelp32 fail: %d\n", GetLastError());
return FALSE;
}
mEntry.dwSize = sizeof(mEntry);
if(!Module32First(hModules, &mEntry)){
printf("Module32First fail: %d\n", GetLastError());
CloseHandle(hModules);
return FALSE;
}
do{
// ===========================================
printf("\n===================================\n");
printf("Module Name:%s\n", mEntry.szModule);
printf("Full Path :%s\n", mEntry.szExePath);
printf("process ID :%lu\n", mEntry.th32ProcessID);
printf("Modules ID: %lu\n", mEntry.th32ModuleID);
printf("Module BaseAddr:%08x\n", mEntry.modBaseAddr);
printf("Moduel Size: %d\n", mEntry.modBaseSize);
/*
for(x=0; x<mEntry.modBaseSize; x++){
printf("%02x ", mEntry.modBaseAddr[x]);
}
*/
}while(Module32Next(hModules, &mEntry));
CloseHandle(hModules);
return TRUE;
}
int main()
{
DWORD pid = GetCurrentProcessId();
ListModule(pid);
return 0;
}