#include "luai.h" #include #include "detours.h" #pragma comment(lib, "detours.lib") DWORD WINAPI MyThread(LPVOID); DWORD g_threadID; HMODULE g_hModule; HANDLE Console = GetStdHandle(STD_INPUT_HANDLE); luai luaObj; int (__stdcall* PauseGame)(); int (__stdcall* ResumeGame)(); static int MyPauseGame() { luaObj.PrintConsole("Game paused"); return PauseGame(); } static int MyPauseGame2(lua_State *L) { MyPauseGame(); return 0; } static int MyResumeGame() { luaObj.PrintConsole("Game resumed"); ResumeGame(); return 0; } static int MyResumeGame2(lua_State *L) { MyResumeGame(); return 0; } INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) { switch(Reason) { case DLL_PROCESS_ATTACH: PauseGame = (int (__stdcall*)())DetourFunction((PBYTE)0x0100341C, (PBYTE)MyPauseGame); ResumeGame = (int (__stdcall*)())DetourFunction((PBYTE)0x0100344C, (PBYTE)MyResumeGame); g_hModule = hDLL; DisableThreadLibraryCalls(hDLL); CreateThread(NULL, NULL, &MyThread, NULL, NULL, &g_threadID); luaObj.CreateConsole(); luaObj.LoadLua(); lua_register(luai::L,"PauseGame",MyPauseGame2); lua_register(luai::L,"PauseGame",MyResumeGame2); break; case DLL_THREAD_ATTACH: case DLL_PROCESS_DETACH: //DetourRemove((PBYTE)0x009C630C, (PBYTE)a_chatclear); case DLL_THREAD_DETACH: break; } return TRUE; } DWORD WINAPI MyThread(LPVOID) { while(true) { if(luaObj.isLoaded) { luaObj.RunLuaScript("Thread()"); } } FreeLibraryAndExitThread(g_hModule, 0); return 0; }