DWORD GetModuleBase(const wchar_t * ModuleName, DWORD ProcessId) {
//這個結構包含很多關於模塊的好東西
MODULEENTRY32 ModuleEntry = { 0 };
//獲取指定進程中所有模塊的SnapShot
HANDLE SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
if (!SnapShot)
return NULL;
//你必須初始化大小,否則它將無法工作
ModuleEntry.dwSize = sizeof(ModuleEntry);
//獲取流程中的第一個模塊
if (!Module32First(SnapShot, &ModuleEntry)) {
return NULL;
}
do {
//檢查模塊名稱是否與我們要查找的名稱相匹配
if (!wcscmp(ModuleEntry.szModule, ModuleName)) {
//如果是,請關閉SnapShot句柄並返回基址
CloseHandle(SnapShot);
return (DWORD)ModuleEntry.modBaseAddr;
}
//抓取SnapShot中的下一個模塊
} while (Module32Next(SnapShot, &ModuleEntry));
//我們找不到指定的模塊,所以返回NULL
CloseHandle(SnapShot);
return NULL;
}
搭配的標頭檔 <Windows.h>、<tlhelp32.h>、<tchar.h>
這就是快速又方便的做法