Пример #1
0
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;
}
Пример #2
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;
}