| 248 | return FALSE; |
| 249 | } |
| 250 | BOOL GetRemoteModuleBaseAddress(HANDLE hProcess, const wchar_t* moduleName, uintptr_t& baseAddress, DWORD* moduleSize) { |
| 251 | |
| 252 | DWORD szModules = sizeof(HMODULE) * 1024; |
| 253 | HMODULE* hModules = (HMODULE*)malloc(szModules); |
| 254 | DWORD cbNeeded; |
| 255 | |
| 256 | if (hModules == 0 || !EnumProcessModulesEx(hProcess, hModules, szModules, &cbNeeded, LIST_MODULES_ALL)) { |
| 257 | PRINT("EnumProcessModulesEx failed"); |
| 258 | free(hModules); |
| 259 | return FALSE; |
| 260 | } |
| 261 | |
| 262 | for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); ++i) { |
| 263 | wchar_t szModuleName[MAX_PATH]; |
| 264 | if (GetModuleBaseName(hProcess, hModules[i], szModuleName, sizeof(szModuleName) / sizeof(wchar_t)) == 0) { |
| 265 | PRINT("GetModuleBaseName failed"); |
| 266 | continue; |
| 267 | } |
| 268 | if (_wcsicmp(szModuleName, moduleName) == 0) { |
| 269 | MODULEINFO moduleInfo; |
| 270 | if (!GetModuleInformation(hProcess, hModules[i], &moduleInfo, sizeof(moduleInfo))) { |
| 271 | PRINT("GetModuleInformation failed"); |
| 272 | free(hModules); |
| 273 | return FALSE; |
| 274 | } |
| 275 | baseAddress = reinterpret_cast<uintptr_t>(moduleInfo.lpBaseOfDll); |
| 276 | *moduleSize = moduleInfo.SizeOfImage; |
| 277 | free(hModules); |
| 278 | return TRUE; |
| 279 | } |
| 280 | } |
| 281 | free(hModules); |
| 282 | return FALSE; |
| 283 | } |