mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-15 06:04:49 +01:00
IAT Hooking for all game modules (Without Detours)
This commit is contained in:
parent
9b2a0701e4
commit
62d1451885
@ -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;
|
||||
|
@ -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,
|
||||
|
27
src/hook.c
27
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
27
src/mouse.c
27
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);
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user