HMODULE FindModuleHandle(unsigned long ProcessId, const std::wstring ModuleName) { HMODULE hModules[256]; HANDLE hProcess; unsigned long _bytesReturned; unsigned char cTotalModules; wchar_t fileName[256]; std::wstring ModName; std::wstring upperOne, upperTwo; hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId); if (!hProcess) { sConsole.OutError(L"FindModuleHandle: Cannot open process!"); ErrorExit(L"OpenProcess"); } if (EnumProcessModules(hProcess, &hModules[0], sizeof(hModules), &_bytesReturned) == 0) { sConsole.OutError(L"FindModuleHandle: EnumProcessModules has returned 0!"); ErrorExit(L"EnumProcessModules"); } cTotalModules = static_cast((_bytesReturned / 4)); for (unsigned char i = 0; i < cTotalModules; i++) { GetModuleFileNameEx(hProcess, hModules[i], fileName, 128); ModName = fileName; if (ModName.length() > 3 && ModName.find(L"\\")) { ModName = ModName.substr(ModName.find_last_of(L"\\")+1, ModName.length()-1); } upperOne = ModuleName; std::transform(upperOne.begin(), upperOne.end(), upperOne.begin(), ::toupper); upperTwo = ModName; std::transform(upperTwo.begin(), upperTwo.end(), upperTwo.begin(), ::toupper); if (upperOne == upperTwo) { CloseHandle(hProcess); sConsole.OutNormal(L"FindModuleHandle: Found module handle: %s", ModName.c_str()); return hModules[i]; } } sConsole.OutNormal(L"FindModuleHandle: Cannot find module handle."); return NULL; }