mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-20 16:09:12 +01:00
289 lines
12 KiB
C
289 lines
12 KiB
C
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include "main.h"
|
|
#include "mouse.h"
|
|
#include "hook.h"
|
|
|
|
#ifdef _MSC_VER
|
|
#include "detours.h"
|
|
#endif
|
|
|
|
BOOL Hook_Active;
|
|
int HookingMethod = 1;
|
|
GETCURSORPOSPROC real_GetCursorPos = GetCursorPos;
|
|
CLIPCURSORPROC real_ClipCursor = ClipCursor;
|
|
SHOWCURSORPROC real_ShowCursor = ShowCursor;
|
|
SETCURSORPROC real_SetCursor = SetCursor;
|
|
GETWINDOWRECTPROC real_GetWindowRect = GetWindowRect;
|
|
GETCLIENTRECTPROC real_GetClientRect = GetClientRect;
|
|
CLIENTTOSCREENPROC real_ClientToScreen = ClientToScreen;
|
|
SCREENTOCLIENTPROC real_ScreenToClient = ScreenToClient;
|
|
SETCURSORPOSPROC real_SetCursorPos = SetCursorPos;
|
|
WINDOWFROMPOINTPROC real_WindowFromPoint = WindowFromPoint;
|
|
GETCLIPCURSORPROC real_GetClipCursor = GetClipCursor;
|
|
GETCURSORINFOPROC real_GetCursorInfo = GetCursorInfo;
|
|
GETSYSTEMMETRICSPROC real_GetSystemMetrics = GetSystemMetrics;
|
|
SETWINDOWPOSPROC real_SetWindowPos = SetWindowPos;
|
|
MOVEWINDOWPROC real_MoveWindow = MoveWindow;
|
|
SENDMESSAGEAPROC real_SendMessageA = SendMessageA;
|
|
SETWINDOWLONGAPROC real_SetWindowLongA = SetWindowLongA;
|
|
ENABLEWINDOWPROC real_EnableWindow = EnableWindow;
|
|
CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA;
|
|
DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow;
|
|
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
|
|
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
|
|
|
|
|
|
void Hook_PatchIAT(HMODULE hMod, char *moduleName, char *functionName, PROC newFunction)
|
|
{
|
|
if (!hMod || hMod == INVALID_HANDLE_VALUE || !newFunction)
|
|
return;
|
|
|
|
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hMod;
|
|
if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
|
|
return;
|
|
|
|
PIMAGE_NT_HEADERS pNTHeaders = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew);
|
|
if (pNTHeaders->Signature != IMAGE_NT_SIGNATURE)
|
|
return;
|
|
|
|
PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)pDosHeader +
|
|
(DWORD)(pNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
|
|
|
|
if (pImportDescriptor == (PIMAGE_IMPORT_DESCRIPTOR)pNTHeaders)
|
|
return;
|
|
|
|
while (pImportDescriptor->FirstThunk)
|
|
{
|
|
char *impModuleName = (char *)((DWORD)pDosHeader + (DWORD)(pImportDescriptor->Name));
|
|
|
|
if (_stricmp(impModuleName, moduleName) == 0)
|
|
{
|
|
PIMAGE_THUNK_DATA pFirstThunk =
|
|
(PIMAGE_THUNK_DATA)((DWORD)pDosHeader + (DWORD)pImportDescriptor->FirstThunk);
|
|
|
|
PIMAGE_THUNK_DATA pOrigFirstThunk =
|
|
(PIMAGE_THUNK_DATA)((DWORD)pDosHeader + (DWORD)pImportDescriptor->OriginalFirstThunk);
|
|
|
|
while (pFirstThunk->u1.Function && pOrigFirstThunk->u1.AddressOfData)
|
|
{
|
|
PIMAGE_IMPORT_BY_NAME pImport =
|
|
(PIMAGE_IMPORT_BY_NAME)((DWORD)pDosHeader + pOrigFirstThunk->u1.AddressOfData);
|
|
|
|
if ((pOrigFirstThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0 &&
|
|
_stricmp((const char *)pImport->Name, functionName) == 0)
|
|
{
|
|
DWORD oldProtect;
|
|
|
|
if (VirtualProtect(&pFirstThunk->u1.Function, sizeof(DWORD), PAGE_READWRITE, &oldProtect))
|
|
{
|
|
pFirstThunk->u1.Function = (DWORD)newFunction;
|
|
VirtualProtect(&pFirstThunk->u1.Function, sizeof(DWORD), oldProtect, &oldProtect);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
pFirstThunk++;
|
|
pOrigFirstThunk++;
|
|
}
|
|
}
|
|
|
|
pImportDescriptor++;
|
|
}
|
|
}
|
|
|
|
void Hook_Create(char *moduleName, char *functionName, PROC newFunction, PROC *function)
|
|
{
|
|
#ifdef _MSC_VER
|
|
if (HookingMethod == 2)
|
|
{
|
|
DetourTransactionBegin();
|
|
DetourUpdateThread(GetCurrentThread());
|
|
DetourAttach((PVOID *)function, (PVOID)newFunction);
|
|
DetourTransactionCommit();
|
|
}
|
|
|
|
if (HookingMethod == 3)
|
|
{
|
|
WCHAR gameExePath[MAX_PATH] = { 0 };
|
|
WCHAR gameDir[MAX_PATH] = { 0 };
|
|
|
|
if (GetModuleFileNameW(NULL, gameExePath, MAX_PATH))
|
|
{
|
|
_wsplitpath(gameExePath, NULL, gameDir, NULL, NULL);
|
|
|
|
WCHAR modPath[MAX_PATH] = { 0 };
|
|
WCHAR modDir[MAX_PATH] = { 0 };
|
|
HMODULE hMod = NULL;
|
|
|
|
while (hMod = DetourEnumerateModules(hMod))
|
|
{
|
|
if (hMod == DDrawModule)
|
|
continue;
|
|
|
|
if (GetModuleFileNameW(hMod, modPath, MAX_PATH))
|
|
{
|
|
_wsplitpath(modPath, NULL, modDir, NULL, NULL);
|
|
|
|
if (_wcsnicmp(gameDir, modDir, wcslen(gameDir)) == 0)
|
|
{
|
|
Hook_PatchIAT(hMod, moduleName, functionName, newFunction);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (HookingMethod == 1)
|
|
{
|
|
Hook_PatchIAT(GetModuleHandle(NULL), moduleName, functionName, newFunction);
|
|
Hook_PatchIAT(GetModuleHandle("storm.dll"), moduleName, functionName, newFunction);
|
|
}
|
|
}
|
|
|
|
void Hook_Revert(char *moduleName, char *functionName, PROC newFunction, PROC *function)
|
|
{
|
|
#ifdef _MSC_VER
|
|
if (HookingMethod == 2)
|
|
{
|
|
DetourTransactionBegin();
|
|
DetourUpdateThread(GetCurrentThread());
|
|
DetourDetach((PVOID *)function, (PVOID)newFunction);
|
|
DetourTransactionCommit();
|
|
}
|
|
|
|
if (HookingMethod == 3)
|
|
{
|
|
WCHAR gameExePath[MAX_PATH] = { 0 };
|
|
WCHAR gameDir[MAX_PATH] = { 0 };
|
|
|
|
if (GetModuleFileNameW(NULL, gameExePath, MAX_PATH))
|
|
{
|
|
_wsplitpath(gameExePath, NULL, gameDir, NULL, NULL);
|
|
|
|
WCHAR modPath[MAX_PATH] = { 0 };
|
|
WCHAR modDir[MAX_PATH] = { 0 };
|
|
HMODULE hMod = NULL;
|
|
|
|
while (hMod = DetourEnumerateModules(hMod))
|
|
{
|
|
if (hMod == DDrawModule)
|
|
continue;
|
|
|
|
if (GetModuleFileNameW(hMod, modPath, MAX_PATH))
|
|
{
|
|
_wsplitpath(modPath, NULL, modDir, NULL, NULL);
|
|
|
|
if (_wcsnicmp(gameDir, modDir, wcslen(gameDir)) == 0)
|
|
{
|
|
Hook_PatchIAT(
|
|
hMod,
|
|
moduleName,
|
|
functionName,
|
|
GetProcAddress(GetModuleHandle(moduleName), functionName));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (HookingMethod == 1)
|
|
{
|
|
Hook_PatchIAT(
|
|
GetModuleHandle(NULL),
|
|
moduleName,
|
|
functionName,
|
|
GetProcAddress(GetModuleHandle(moduleName), functionName));
|
|
|
|
Hook_PatchIAT(
|
|
GetModuleHandle("storm.dll"),
|
|
moduleName,
|
|
functionName,
|
|
GetProcAddress(GetModuleHandle(moduleName), functionName));
|
|
}
|
|
}
|
|
|
|
void Hook_Init()
|
|
{
|
|
if (!Hook_Active || HookingMethod == 3)
|
|
{
|
|
if (!Hook_Active && HookingMethod == 3)
|
|
{
|
|
FARPROC proc = GetProcAddress(GetModuleHandle("kernelbase.dll"), "LoadLibraryExW");
|
|
|
|
if (proc)
|
|
real_LoadLibraryExW = proc;
|
|
|
|
DetourTransactionBegin();
|
|
DetourUpdateThread(GetCurrentThread());
|
|
DetourAttach((PVOID*)&real_LoadLibraryExW, (PVOID)fake_LoadLibraryExW);
|
|
DetourTransactionCommit();
|
|
}
|
|
|
|
Hook_Active = TRUE;
|
|
|
|
Hook_Create("user32.dll", "GetCursorPos", (PROC)fake_GetCursorPos, (PROC *)&real_GetCursorPos);
|
|
Hook_Create("user32.dll", "ClipCursor", (PROC)fake_ClipCursor, (PROC *)&real_ClipCursor);
|
|
Hook_Create("user32.dll", "ShowCursor", (PROC)fake_ShowCursor, (PROC *)&real_ShowCursor);
|
|
Hook_Create("user32.dll", "SetCursor", (PROC)fake_SetCursor, (PROC *)&real_SetCursor);
|
|
Hook_Create("user32.dll", "GetWindowRect", (PROC)fake_GetWindowRect, (PROC *)&real_GetWindowRect);
|
|
Hook_Create("user32.dll", "GetClientRect", (PROC)fake_GetClientRect, (PROC *)&real_GetClientRect);
|
|
Hook_Create("user32.dll", "ClientToScreen", (PROC)fake_ClientToScreen, (PROC *)&real_ClientToScreen);
|
|
Hook_Create("user32.dll", "ScreenToClient", (PROC)fake_ScreenToClient, (PROC *)&real_ScreenToClient);
|
|
Hook_Create("user32.dll", "SetCursorPos", (PROC)fake_SetCursorPos, (PROC *)&real_SetCursorPos);
|
|
Hook_Create("user32.dll", "GetClipCursor", (PROC)fake_GetClipCursor, (PROC *)&real_GetClipCursor);
|
|
Hook_Create("user32.dll", "WindowFromPoint", (PROC)fake_WindowFromPoint, (PROC *)&real_WindowFromPoint);
|
|
Hook_Create("user32.dll", "GetCursorInfo", (PROC)fake_GetCursorInfo, (PROC *)&real_GetCursorInfo);
|
|
Hook_Create("user32.dll", "GetSystemMetrics", (PROC)fake_GetSystemMetrics, (PROC *)&real_GetSystemMetrics);
|
|
Hook_Create("user32.dll", "SetWindowPos", (PROC)fake_SetWindowPos, (PROC *)&real_SetWindowPos);
|
|
Hook_Create("user32.dll", "MoveWindow", (PROC)fake_MoveWindow, (PROC *)&real_MoveWindow);
|
|
Hook_Create("user32.dll", "SendMessageA", (PROC)fake_SendMessageA, (PROC *)&real_SendMessageA);
|
|
Hook_Create("user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA, (PROC *)&real_SetWindowLongA);
|
|
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);
|
|
}
|
|
}
|
|
|
|
void Hook_Exit()
|
|
{
|
|
if (Hook_Active)
|
|
{
|
|
Hook_Active = FALSE;
|
|
|
|
if (HookingMethod == 3)
|
|
{
|
|
DetourTransactionBegin();
|
|
DetourUpdateThread(GetCurrentThread());
|
|
DetourDetach((PVOID*)&real_LoadLibraryExW, (PVOID)fake_LoadLibraryExW);
|
|
DetourTransactionCommit();
|
|
}
|
|
|
|
Hook_Revert("user32.dll", "GetCursorPos", (PROC)fake_GetCursorPos, (PROC *)&real_GetCursorPos);
|
|
Hook_Revert("user32.dll", "ClipCursor", (PROC)fake_ClipCursor, (PROC *)&real_ClipCursor);
|
|
Hook_Revert("user32.dll", "ShowCursor", (PROC)fake_ShowCursor, (PROC *)&real_ShowCursor);
|
|
Hook_Revert("user32.dll", "SetCursor", (PROC)fake_SetCursor, (PROC *)&real_SetCursor);
|
|
Hook_Revert("user32.dll", "GetWindowRect", (PROC)fake_GetWindowRect, (PROC *)&real_GetWindowRect);
|
|
Hook_Revert("user32.dll", "GetClientRect", (PROC)fake_GetClientRect, (PROC *)&real_GetClientRect);
|
|
Hook_Revert("user32.dll", "ClientToScreen", (PROC)fake_ClientToScreen, (PROC *)&real_ClientToScreen);
|
|
Hook_Revert("user32.dll", "ScreenToClient", (PROC)fake_ScreenToClient, (PROC *)&real_ScreenToClient);
|
|
Hook_Revert("user32.dll", "SetCursorPos", (PROC)fake_SetCursorPos, (PROC *)&real_SetCursorPos);
|
|
Hook_Revert("user32.dll", "GetClipCursor", (PROC)fake_GetClipCursor, (PROC *)&real_GetClipCursor);
|
|
Hook_Revert("user32.dll", "WindowFromPoint", (PROC)fake_WindowFromPoint, (PROC *)&real_WindowFromPoint);
|
|
Hook_Revert("user32.dll", "GetCursorInfo", (PROC)fake_GetCursorInfo, (PROC *)&real_GetCursorInfo);
|
|
Hook_Revert("user32.dll", "GetSystemMetrics", (PROC)fake_GetSystemMetrics, (PROC *)&real_GetSystemMetrics);
|
|
Hook_Revert("user32.dll", "SetWindowPos", (PROC)fake_SetWindowPos, (PROC *)&real_SetWindowPos);
|
|
Hook_Revert("user32.dll", "MoveWindow", (PROC)fake_MoveWindow, (PROC *)&real_MoveWindow);
|
|
Hook_Revert("user32.dll", "SendMessageA", (PROC)fake_SendMessageA, (PROC *)&real_SendMessageA);
|
|
Hook_Revert("user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA, (PROC *)&real_SetWindowLongA);
|
|
Hook_Revert("user32.dll", "EnableWindow", (PROC)fake_EnableWindow, (PROC *)&real_EnableWindow);
|
|
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);
|
|
}
|
|
}
|