diff --git a/inc/hook.h b/inc/hook.h index a0762a1..71c5714 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -24,6 +24,9 @@ typedef BOOL (WINAPI* ENABLEWINDOWPROC)(HWND, BOOL); typedef HWND (WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); typedef BOOL (WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); +typedef HMODULE (WINAPI* LOADLIBRARYAPROC)(LPCSTR); +typedef HMODULE (WINAPI* LOADLIBRARYWPROC)(LPCWSTR); +typedef HMODULE (WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE (WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); extern GETCURSORPOSPROC real_GetCursorPos; @@ -47,6 +50,9 @@ extern ENABLEWINDOWPROC real_EnableWindow; extern CREATEWINDOWEXAPROC real_CreateWindowExA; extern DESTROYWINDOWPROC real_DestroyWindow; extern GETDEVICECAPSPROC real_GetDeviceCaps; +extern LOADLIBRARYAPROC real_LoadLibraryA; +extern LOADLIBRARYWPROC real_LoadLibraryW; +extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern int HookingMethod; diff --git a/inc/mouse.h b/inc/mouse.h index f4848b5..549bb39 100644 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -26,6 +26,9 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong); BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable); BOOL WINAPI fake_DestroyWindow(HWND hWnd); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); +HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); +HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); +HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, diff --git a/src/hook.c b/src/hook.c index 8f63ce0..484558b 100644 --- a/src/hook.c +++ b/src/hook.c @@ -31,6 +31,9 @@ ENABLEWINDOWPROC real_EnableWindow = EnableWindow; CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; +LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; +LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; +LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; @@ -104,7 +107,7 @@ void Hook_Create(char *moduleName, char *functionName, PROC newFunction, PROC *f DetourTransactionCommit(); } - if (HookingMethod == 3) + if (HookingMethod == 3 || HookingMethod == 4) { WCHAR gameExePath[MAX_PATH] = { 0 }; WCHAR gameDir[MAX_PATH] = { 0 }; @@ -154,7 +157,7 @@ void Hook_Revert(char *moduleName, char *functionName, PROC newFunction, PROC *f DetourTransactionCommit(); } - if (HookingMethod == 3) + if (HookingMethod == 3 || HookingMethod == 4) { WCHAR gameExePath[MAX_PATH] = { 0 }; WCHAR gameDir[MAX_PATH] = { 0 }; @@ -208,7 +211,7 @@ void Hook_Revert(char *moduleName, char *functionName, PROC newFunction, PROC *f void Hook_Init() { - if (!Hook_Active || HookingMethod == 3) + if (!Hook_Active || HookingMethod == 3 || HookingMethod == 4) { if (!Hook_Active && HookingMethod == 3) { @@ -245,7 +248,15 @@ void Hook_Init() Hook_Create("user32.dll", "EnableWindow", (PROC)fake_EnableWindow, (PROC *)&real_EnableWindow); Hook_Create("user32.dll", "CreateWindowExA", (PROC)fake_CreateWindowExA, (PROC *)&real_CreateWindowExA); Hook_Create("user32.dll", "DestroyWindow", (PROC)fake_DestroyWindow, (PROC *)&real_DestroyWindow); - Hook_Create("gdi.dll", "GetDeviceCaps ", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps); + Hook_Create("gdi.dll", "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps); + + if (HookingMethod == 4) + { + Hook_Create("kernel32.dll", "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA); + Hook_Create("kernel32.dll", "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW); + Hook_Create("kernel32.dll", "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA); + Hook_Create("kernel32.dll", "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW); + } } } @@ -284,5 +295,13 @@ void Hook_Exit() Hook_Revert("user32.dll", "CreateWindowExA", (PROC)fake_CreateWindowExA, (PROC *)&real_CreateWindowExA); Hook_Revert("user32.dll", "DestroyWindow", (PROC)fake_DestroyWindow, (PROC *)&real_DestroyWindow); Hook_Revert("gdi.dll", "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps); + + if (HookingMethod == 4) + { + Hook_Revert("kernel32.dll", "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA); + Hook_Revert("kernel32.dll", "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW); + Hook_Revert("kernel32.dll", "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA); + Hook_Revert("kernel32.dll", "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW); + } } } diff --git a/src/mouse.c b/src/mouse.c index eb8e160..7755e12 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -432,6 +432,33 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return real_GetDeviceCaps(hdc, index); } +HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) +{ + HMODULE hMod = real_LoadLibraryA(lpLibFileName); + + Hook_Init(); + + return hMod; +} + +HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) +{ + HMODULE hMod = real_LoadLibraryW(lpLibFileName); + + Hook_Init(); + + return hMod; +} + +HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) +{ + HMODULE hMod = real_LoadLibraryExA(lpLibFileName, hFile, dwFlags); + + Hook_Init(); + + return hMod; +} + HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { HMODULE hMod = real_LoadLibraryExW(lpLibFileName, hFile, dwFlags); diff --git a/src/settings.c b/src/settings.c index d96fb0d..d5fd2f5 100644 --- a/src/settings.c +++ b/src/settings.c @@ -49,9 +49,7 @@ void Settings_Load() WindowRect.left = GetInt("posX", -32000); WindowRect.top = GetInt("posY", -32000); -#ifndef _DEBUG HookingMethod = GetInt("hook", 1); -#endif ddraw->render.maxfps = GetInt("maxfps", 125); @@ -282,7 +280,7 @@ static void CreateSettingsIni() "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" "singlecpu=true\n" "\n" - "; Windows API Hooking, Possible values: 0 = disabled, 1 = IAT Hooking, 2 = Microsoft Detours, 3 = IAT Hooking (All Modules)\n" + "; Windows API Hooking, Possible values: 0 = disabled, 1 = IAT Hooking, 2 = Microsoft Detours, 3 = IAT+Detours Hooking (All Modules), 4 = IAT Hooking (All Modules)\n" "; Note: Can be used to fix issues related to new features added by cnc-ddraw such as windowed mode or stretching\n" "hook=1\n" "\n"