int hackpoints_error_function_not_found(const char *func_name, int retval) { log_printf("ERROR: function '%s' not found! " #ifdef _DEBUG "(implementation not exported or still missing?)" #else "(outdated or corrupt %s installation, maybe?)" #endif "\n", func_name, PROJECT_NAME_SHORT() ); return retval; }
int WaitUntilEntryPoint(HANDLE hProcess, HANDLE hThread, const char *module) { // Try to get the entry point by various means, sorted by both efficiency // and probability of them working. void *entry_addr = NULL; /** * Method 1: Initial value of EAX * After creating a process in suspended state, EAX is guaranteed to contain * the correct address of the entry point, even when the executable has the * DYNAMICBASE flag activated in its header. * * (Works on Windows, but not on Wine) */ if(!(entry_addr = entry_from_context(hThread))) { HMODULE module_base; /** * Method 2: EnumProcessModules, then parse the PE header. * * (Works on Wine, but not on Windows immediately after the target process * was created in suspended state.) */ if(!(module_base = GetRemoteModuleHandle(hProcess, module))) { /** * Method 3: Guessing 0x400000 * This is the default value in many compilers and should thus work for * most non-ASLR Windows applications. */ module_base = (HMODULE)0x400000; } entry_addr = GetRemoteModuleEntryPoint(hProcess, module_base); } if(entry_addr) { return ThreadWaitUntil(hProcess, hThread, entry_addr); } else { log_mboxf(NULL, MB_OK | MB_ICONEXCLAMATION, "Couldn't determine the entry point of %s!\n" "\n" "Seems as if %s won't work with this game on your system.\n", PathFindFileNameA(module), PROJECT_NAME_SHORT() ); return 1; } }