/* This file is part of Universal Modding Engine. Universal Modding Engine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Universal Modding Engine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Universal Modding Engine. If not, see . */ #include "uMod_Detour.h" #include "uMod_Main.h" uMod_Detour::uMod_Detour() : NumOfEntries(0), Entries(NULL), Detour_FreeLibrary(5), Detour_LoadLibraryA(5), Detour_LoadLibraryW(5), Detour_LoadLibraryExA(5), Detour_LoadLibraryExW(5) { } uMod_Detour::~uMod_Detour() { if (Entries!=NULL) delete [] Entries; } void uMod_Detour::Init(void) { Detour_FreeLibrary.SetOrigFunction(FreeLibrary); Detour_FreeLibrary.SetTargetFunction(uMod_FreeLibrary); Detour_FreeLibrary.Detour(); Detour_LoadLibraryA.SetOrigFunction(LoadLibraryA); Detour_LoadLibraryA.SetTargetFunction(uMod_LoadLibraryA); Detour_LoadLibraryA.Detour(); Detour_LoadLibraryW.SetOrigFunction(LoadLibraryW); Detour_LoadLibraryW.SetTargetFunction(uMod_LoadLibraryW); Detour_LoadLibraryW.Detour(); Detour_LoadLibraryExA.SetOrigFunction(LoadLibraryExA); Detour_LoadLibraryExA.SetTargetFunction(uMod_LoadLibraryExA); Detour_LoadLibraryExA.Detour(); Detour_LoadLibraryExW.SetOrigFunction(LoadLibraryExW); Detour_LoadLibraryExW.SetTargetFunction(uMod_LoadLibraryExW); Detour_LoadLibraryExW.Detour(); //for (int i=0; iDetour(); } void uMod_Detour::Exit(void) { Detour_FreeLibrary.Retour(); Detour_LoadLibraryA.Retour(); Detour_LoadLibraryW.Retour(); Detour_LoadLibraryExA.Retour(); Detour_LoadLibraryExW.Retour(); //for (int i=0; iRetour(); } int uMod_Detour::AddEntry( uMod_Detour_Entry_Base* entry) { uMod_Detour_Entry_Base** temp = new uMod_Detour_Entry_Base*[NumOfEntries+1]; if (Entries!=NULL) { for (int i=0; iFreeLib( plib); } void uMod_Detour::TestLib(const char* lib_name, HMODULE plib) { Message("uMod_Detour::TestLib( %s, %p )\n", lib_name, plib); if (lib_name==NULL) return; if (plib==NULL) return; for (int i=0; iTestLib( lib_name, plib); } void uMod_Detour::TestLib(const wchar_t* lib_name, HMODULE plib) { Message("uMod_Detour::TestLib( %ls, %p )\n", lib_name, plib); if (lib_name==NULL) return; if (plib==NULL) return; for (int i=0; iTestLib( lib_name, plib); } uMod_Detour GlobalDetour; BOOL WINAPI uMod_FreeLibrary( HMODULE hModule) { GlobalDetour.Detour_FreeLibrary.Retour(); //retour the FreeLibrary function BOOL ret = FreeLibrary( hModule); // now call the original function Message("%d = uMod_FreeLibrary( %p )\n", ret, hModule); GlobalDetour.FreeLib(hModule); // notify all detoured function, that this library was once more freed GlobalDetour.Detour_FreeLibrary.Detour(); // detour again the FreeLibrary function return ret; } HMODULE WINAPI uMod_LoadLibraryA( LPCSTR lpFileName) { GlobalDetour.Detour_LoadLibraryA.Retour(); //retour the LoadLibraryA function HMODULE ret = LoadLibraryA( lpFileName); // now call the original function Message("%p = uMod_LoadLibraryA( %s )\n", ret, lpFileName); GlobalDetour.TestLib( lpFileName, ret); // notify all detoured function, that this library was once more loaded GlobalDetour.Detour_LoadLibraryA.Detour(); // detour again the LoadLibraryA function return ret; } HMODULE WINAPI uMod_LoadLibraryW( LPCWSTR lpFileName) { GlobalDetour.Detour_LoadLibraryW.Retour(); //retour the LoadLibraryW function HMODULE ret = LoadLibraryW( lpFileName); // now call the original function GlobalDetour.TestLib( lpFileName, ret); // notify all detoured function, that this library was once more loaded Message("%p = uMod_LoadLibraryW( %ls )\n", ret, lpFileName); GlobalDetour.Detour_LoadLibraryW.Detour(); // detour again the LoadLibraryW function return ret; } HMODULE WINAPI uMod_LoadLibraryExA( LPCSTR lpFileName, HANDLE hFile, DWORD dwFlags) { GlobalDetour.Detour_LoadLibraryExA.Retour(); //retour the LoadLibraryExA function HMODULE ret = LoadLibraryExA( lpFileName, hFile, dwFlags); // now call the original function Message("%p = uMod_LoadLibraryExA( %s, %p, %d)\n", ret, lpFileName, hFile, dwFlags); if (dwFlags==0) { GlobalDetour.TestLib( lpFileName, ret); // notify all detoured function, that this library was once more loaded } GlobalDetour.Detour_LoadLibraryExA.Detour(); // detour again the LoadLibraryExA function return ret; } HMODULE WINAPI uMod_LoadLibraryExW( LPCWSTR lpFileName, HANDLE hFile, DWORD dwFlags) { GlobalDetour.Detour_LoadLibraryExW.Retour(); //retour the LoadLibraryExA function HMODULE ret = LoadLibraryExW( lpFileName, hFile, dwFlags); // now call the original function Message("%p = uMod_LoadLibraryExW( %ls, %p, %d)\n", ret, lpFileName, hFile, dwFlags); if (dwFlags==0) { GlobalDetour.TestLib( lpFileName, ret); // notify all detoured function, that this library was once more loaded } GlobalDetour.Detour_LoadLibraryExW.Detour(); // detour again the LoadLibraryExA function return ret; }