static int hook_sdl12(const char *hook_type, const char *hook_method) { HMODULE hMod; // if((hMod = GetModuleHandle("SDL.dll")) == NULL) { if((hMod = LoadLibrary("SDL.dll")) == NULL) { ga_error("Load SDL.dll failed.\n"); return -1; } } // //load_hook_function(hMod, t_SDL_Init, old_SDL_Init, "SDL_Init"); load_hook_function(hMod, t_SDL_Init, old_SDL_Init, "SDL_Init"); load_hook_function(hMod, t_SDL_SetVideoMode, old_SDL_SetVideoMode, "SDL_SetVideoMode"); load_hook_function(hMod, t_SDL_UpperBlit, old_SDL_UpperBlit, "SDL_UpperBlit"); // XXX: BlitSurface == UpperBlit load_hook_function(hMod, t_SDL_BlitSurface, old_SDL_BlitSurface, "SDL_UpperBlit"); load_hook_function(hMod, t_SDL_Flip, old_SDL_Flip, "SDL_Flip"); load_hook_function(hMod, t_SDL_UpdateRect, old_SDL_UpdateRect, "SDL_UpdateRect"); load_hook_function(hMod, t_SDL_UpdateRects, old_SDL_UpdateRects, "SDL_UpdateRects"); load_hook_function(hMod, t_SDL_GL_SwapBuffers, old_SDL_GL_SwapBuffers, "SDL_GL_SwapBuffers"); load_hook_function(hMod, t_SDL_PollEvent, old_SDL_PollEvent, "SDL_PollEvent"); load_hook_function(hMod, t_SDL_WaitEvent, old_SDL_WaitEvent, "SDL_WaitEvent"); load_hook_function(hMod, t_SDL_PeepEvents, old_SDL_PeepEvents, "SDL_PeepEvents"); load_hook_function(hMod, t_SDL_OpenAudio, old_SDL_OpenAudio, "SDL_OpenAudio"); load_hook_function(hMod, t_SDL_PauseAudio, old_SDL_PauseAudio, "SDL_PauseAudio"); load_hook_function(hMod, t_SDL_CloseAudio, old_SDL_CloseAudio, "SDL_CloseAudio"); // for internal use load_hook_function(hMod, t_SDL_CreateRGBSurface, old_SDL_CreateRGBSurface, "SDL_CreateRGBSurface"); load_hook_function(hMod, t_SDL_FreeSurface, old_SDL_FreeSurface, "SDL_FreeSurface"); load_hook_function(hMod, t_SDL_PushEvent, old_SDL_PushEvent, "SDL_PushEvent"); // #define SDL_DO_HOOK(name) \ DetourTransactionBegin(); \ DetourUpdateThread(GetCurrentThread()); \ DetourAttach(&(PVOID&)old_##name, hook_##name); \ DetourTransactionCommit(); //SDL_DO_HOOK(SDL_Init); SDL_DO_HOOK(SDL_SetVideoMode); SDL_DO_HOOK(SDL_UpperBlit); SDL_DO_HOOK(SDL_Flip); SDL_DO_HOOK(SDL_UpdateRect); SDL_DO_HOOK(SDL_UpdateRects); //SDL_DO_HOOK(SDL_GL_SwapBuffers); //SDL_DO_HOOK(SDL_PollEvent); SDL_DO_HOOK(SDL_WaitEvent); SDL_DO_HOOK(SDL_PeepEvents); SDL_DO_HOOK(SDL_OpenAudio); SDL_DO_HOOK(SDL_PauseAudio); SDL_DO_HOOK(SDL_CloseAudio); // DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)old_SDL_GL_SwapBuffers, hook_SDL_GL_SwapBuffers); DetourTransactionCommit(); // DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)old_SDL_PollEvent, hook_SDL_PollEvent); DetourTransactionCommit(); #undef SDL_DO_HOOK ga_error("hook_sdl12: done\n"); // return 0; }
static int hook_sdl12(const char *hook_type, const char *hook_method) { HMODULE hMod; char audio_type[64] = ""; const char *sdlpath = getenv("LIBSDL_SO"); const char *def_sdlpath = "SDL.dll"; if(sdlpath == NULL) sdlpath = def_sdlpath; // if((hMod = GetModuleHandle(sdlpath)) == NULL) { if((hMod = LoadLibrary(sdlpath)) == NULL) { ga_error("Load %s failed.\n", sdlpath); return -1; } } if(ga_conf_readv("hook-audio", audio_type, sizeof(audio_type)) == NULL) audio_type[0] = '\0'; // //load_hook_function(hMod, t_SDL_Init, old_SDL_Init, "SDL_Init"); load_hook_function(hMod, t_SDL_Init, old_SDL_Init, "SDL_Init"); load_hook_function(hMod, t_SDL_SetVideoMode, old_SDL_SetVideoMode, "SDL_SetVideoMode"); load_hook_function(hMod, t_SDL_UpperBlit, old_SDL_UpperBlit, "SDL_UpperBlit"); // XXX: BlitSurface == UpperBlit load_hook_function(hMod, t_SDL_BlitSurface, old_SDL_BlitSurface, "SDL_UpperBlit"); load_hook_function(hMod, t_SDL_Flip, old_SDL_Flip, "SDL_Flip"); load_hook_function(hMod, t_SDL_UpdateRect, old_SDL_UpdateRect, "SDL_UpdateRect"); load_hook_function(hMod, t_SDL_UpdateRects, old_SDL_UpdateRects, "SDL_UpdateRects"); load_hook_function(hMod, t_SDL_GL_SwapBuffers, old_SDL_GL_SwapBuffers, "SDL_GL_SwapBuffers"); load_hook_function(hMod, t_SDL_PollEvent, old_SDL_PollEvent, "SDL_PollEvent"); load_hook_function(hMod, t_SDL_WaitEvent, old_SDL_WaitEvent, "SDL_WaitEvent"); load_hook_function(hMod, t_SDL_PeepEvents, old_SDL_PeepEvents, "SDL_PeepEvents"); load_hook_function(hMod, t_SDL_SetEventFilter, old_SDL_SetEventFilter, "SDL_SetEventFilter"); if(strcmp("sdlaudio", audio_type) == 0) { ///////////////////////////////////////// load_hook_function(hMod, t_SDL_OpenAudio, old_SDL_OpenAudio, "SDL_OpenAudio"); load_hook_function(hMod, t_SDL_PauseAudio, old_SDL_PauseAudio, "SDL_PauseAudio"); load_hook_function(hMod, t_SDL_CloseAudio, old_SDL_CloseAudio, "SDL_CloseAudio"); ga_error("hook: sdlaudio enabled.\n"); ///////////////////////////////////////// } // for internal use load_hook_function(hMod, t_SDL_CreateRGBSurface, old_SDL_CreateRGBSurface, "SDL_CreateRGBSurface"); load_hook_function(hMod, t_SDL_FreeSurface, old_SDL_FreeSurface, "SDL_FreeSurface"); load_hook_function(hMod, t_SDL_PushEvent, old_SDL_PushEvent, "SDL_PushEvent"); // #define SDL_DO_HOOK(name) \ DetourTransactionBegin(); \ DetourUpdateThread(GetCurrentThread()); \ DetourAttach(&(PVOID&)old_##name, hook_##name); \ DetourTransactionCommit(); //SDL_DO_HOOK(SDL_Init); SDL_DO_HOOK(SDL_SetVideoMode); SDL_DO_HOOK(SDL_UpperBlit); SDL_DO_HOOK(SDL_Flip); SDL_DO_HOOK(SDL_UpdateRect); SDL_DO_HOOK(SDL_UpdateRects); SDL_DO_HOOK(SDL_WaitEvent); SDL_DO_HOOK(SDL_PeepEvents); SDL_DO_HOOK(SDL_SetEventFilter); if(strcmp("sdlaudio", audio_type) == 0) { ///////////////////////////////////////// SDL_DO_HOOK(SDL_OpenAudio); SDL_DO_HOOK(SDL_PauseAudio); SDL_DO_HOOK(SDL_CloseAudio); ///////////////////////////////////////// } #if 1 SDL_DO_HOOK(SDL_GL_SwapBuffers); SDL_DO_HOOK(SDL_PollEvent); #else DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)old_SDL_GL_SwapBuffers, hook_SDL_GL_SwapBuffers); DetourTransactionCommit(); // DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)old_SDL_PollEvent, hook_SDL_PollEvent); DetourTransactionCommit(); #endif #undef SDL_DO_HOOK ga_error("hook_sdl12: done\n"); // return 0; }