mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-25 01:57:47 +01:00
remove early hook function
This commit is contained in:
parent
8fe772d385
commit
1452bbe598
@ -9,7 +9,7 @@
|
|||||||
#define SKIP_HOOK3 0x00000002l
|
#define SKIP_HOOK3 0x00000002l
|
||||||
|
|
||||||
typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA;
|
typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA;
|
||||||
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[28]; } HOOKLIST;
|
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST;
|
||||||
|
|
||||||
typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT);
|
typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT);
|
||||||
typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
|
typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
|
||||||
@ -103,7 +103,6 @@ extern BOOL g_hook_dinput;
|
|||||||
extern BOOL g_hook_active;
|
extern BOOL g_hook_active;
|
||||||
|
|
||||||
void hook_init();
|
void hook_init();
|
||||||
void hook_early_init();
|
|
||||||
void hook_exit();
|
void hook_exit();
|
||||||
void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function);
|
void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function);
|
||||||
void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks);
|
void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks);
|
||||||
|
@ -76,7 +76,6 @@ void cfg_load()
|
|||||||
|
|
||||||
g_config.save_settings = cfg_get_int("savesettings", 1);
|
g_config.save_settings = cfg_get_int("savesettings", 1);
|
||||||
|
|
||||||
g_hook_method = cfg_get_int("hook", 4);
|
|
||||||
g_hook_dinput = cfg_get_bool("dinputhook", FALSE);
|
g_hook_dinput = cfg_get_bool("dinputhook", FALSE);
|
||||||
|
|
||||||
g_ddraw->render.maxfps = cfg_get_int("maxfps", -1);
|
g_ddraw->render.maxfps = cfg_get_int("maxfps", -1);
|
||||||
|
@ -195,7 +195,7 @@ HRESULT WINAPI fake_DirectInputCreateA(
|
|||||||
|
|
||||||
HRESULT result = real_DirectInputCreateA(hinst, dwVersion, lplpDirectInput, punkOuter);
|
HRESULT result = real_DirectInputCreateA(hinst, dwVersion, lplpDirectInput, punkOuter);
|
||||||
|
|
||||||
if (SUCCEEDED(result) && !real_di_CreateDevice)
|
if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE))
|
||||||
{
|
{
|
||||||
real_di_CreateDevice =
|
real_di_CreateDevice =
|
||||||
(DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
(DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
||||||
@ -229,7 +229,7 @@ HRESULT WINAPI fake_DirectInputCreateW(
|
|||||||
|
|
||||||
HRESULT result = real_DirectInputCreateW(hinst, dwVersion, lplpDirectInput, punkOuter);
|
HRESULT result = real_DirectInputCreateW(hinst, dwVersion, lplpDirectInput, punkOuter);
|
||||||
|
|
||||||
if (SUCCEEDED(result) && !real_di_CreateDevice)
|
if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE))
|
||||||
{
|
{
|
||||||
real_di_CreateDevice =
|
real_di_CreateDevice =
|
||||||
(DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
(DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
||||||
@ -264,7 +264,7 @@ HRESULT WINAPI fake_DirectInputCreateEx(
|
|||||||
|
|
||||||
HRESULT result = real_DirectInputCreateEx(hinst, dwVersion, riidltf, ppvOut, punkOuter);
|
HRESULT result = real_DirectInputCreateEx(hinst, dwVersion, riidltf, ppvOut, punkOuter);
|
||||||
|
|
||||||
if (SUCCEEDED(result) && !real_di_CreateDevice)
|
if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE))
|
||||||
{
|
{
|
||||||
real_di_CreateDevice =
|
real_di_CreateDevice =
|
||||||
(DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
(DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
||||||
@ -273,7 +273,8 @@ HRESULT WINAPI fake_DirectInputCreateEx(
|
|||||||
if (SUCCEEDED(result) &&
|
if (SUCCEEDED(result) &&
|
||||||
!real_di_CreateDeviceEx &&
|
!real_di_CreateDeviceEx &&
|
||||||
riidltf &&
|
riidltf &&
|
||||||
(IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)))
|
(IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf))
|
||||||
|
&& !cfg_get_bool("no_dinput_hook", FALSE))
|
||||||
{
|
{
|
||||||
real_di_CreateDeviceEx =
|
real_di_CreateDeviceEx =
|
||||||
(DICREATEDEVICEEXPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx, (PROC)fake_di_CreateDeviceEx);
|
(DICREATEDEVICEEXPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx, (PROC)fake_di_CreateDeviceEx);
|
||||||
@ -308,7 +309,7 @@ HRESULT WINAPI fake_DirectInput8Create(
|
|||||||
|
|
||||||
HRESULT result = real_DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter);
|
HRESULT result = real_DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter);
|
||||||
|
|
||||||
if (SUCCEEDED(result) && !real_di_CreateDevice)
|
if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE))
|
||||||
{
|
{
|
||||||
real_di_CreateDevice =
|
real_di_CreateDevice =
|
||||||
(DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
(DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
||||||
|
@ -101,7 +101,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|||||||
}
|
}
|
||||||
|
|
||||||
timeBeginPeriod(1);
|
timeBeginPeriod(1);
|
||||||
hook_early_init();
|
g_hook_method = cfg_get_int("hook", 4);
|
||||||
|
hook_init();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DLL_PROCESS_DETACH:
|
case DLL_PROCESS_DETACH:
|
||||||
|
95
src/hook.c
95
src/hook.c
@ -90,6 +90,30 @@ static HOOKLIST g_hooks[] =
|
|||||||
{ "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 },
|
{ "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 },
|
||||||
{ "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 },
|
{ "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 },
|
||||||
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
|
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
|
||||||
|
{ "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 },
|
||||||
|
{ "", NULL, NULL, 0 }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ole32.dll",
|
||||||
|
{
|
||||||
|
{ "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
|
{ "", NULL, NULL, 0 }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dinput.dll",
|
||||||
|
{
|
||||||
|
{ "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
|
{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
|
{ "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
|
{ "", NULL, NULL, 0 }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dinput8.dll",
|
||||||
|
{
|
||||||
|
{ "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
{ "", NULL, NULL, 0 }
|
{ "", NULL, NULL, 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -110,6 +134,7 @@ static HOOKLIST g_hooks[] =
|
|||||||
{ "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 | SKIP_HOOK3 },
|
{ "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
{ "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 | SKIP_HOOK3 },
|
{ "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
{ "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 | SKIP_HOOK3 },
|
{ "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
|
{ "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||||
{ "", NULL, NULL, 0 }
|
{ "", NULL, NULL, 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -400,7 +425,10 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook)
|
|||||||
|
|
||||||
if (GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
if (GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
||||||
{
|
{
|
||||||
TRACE_EXT("Module %s = %p\n", mod_path, hmod);
|
if (initial_hook)
|
||||||
|
{
|
||||||
|
TRACE_EXT("Module %s = %p\n", mod_path, hmod);
|
||||||
|
}
|
||||||
|
|
||||||
_splitpath(mod_path, NULL, mod_dir, mod_filename, NULL);
|
_splitpath(mod_path, NULL, mod_dir, mod_filename, NULL);
|
||||||
|
|
||||||
@ -515,7 +543,7 @@ void hook_init()
|
|||||||
BOOL initial_hook = !g_hook_active;
|
BOOL initial_hook = !g_hook_active;
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
if (initial_hook && g_hook_dinput)
|
if (initial_hook && cfg_get_bool("dinputhook", FALSE))
|
||||||
{
|
{
|
||||||
real_DirectInputCreateA =
|
real_DirectInputCreateA =
|
||||||
(DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA");
|
(DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA");
|
||||||
@ -563,41 +591,29 @@ void hook_init()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_DEBUG) && defined(_MSC_VER)
|
||||||
|
if (initial_hook)
|
||||||
|
{
|
||||||
|
hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter);
|
||||||
|
|
||||||
|
DetourTransactionBegin();
|
||||||
|
DetourUpdateThread(GetCurrentThread());
|
||||||
|
DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter);
|
||||||
|
DetourTransactionCommit();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (initial_hook)
|
||||||
|
{
|
||||||
|
hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
||||||
|
}
|
||||||
|
|
||||||
g_hook_active = TRUE;
|
g_hook_active = TRUE;
|
||||||
|
|
||||||
hook_create((HOOKLIST*)&g_hooks, initial_hook);
|
hook_create((HOOKLIST*)&g_hooks, initial_hook);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void hook_early_init()
|
|
||||||
{
|
|
||||||
#if defined(_DEBUG) && defined(_MSC_VER)
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter);
|
|
||||||
|
|
||||||
DetourTransactionBegin();
|
|
||||||
DetourUpdateThread(GetCurrentThread());
|
|
||||||
DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter);
|
|
||||||
DetourTransactionCommit();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance);
|
|
||||||
hook_patch_iat(GetModuleHandle("XIIIGame.dll"), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA); //BALDR FORCE EXE
|
|
||||||
hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA);
|
|
||||||
|
|
||||||
if (!cfg_get_bool("no_dinput_hook", FALSE))
|
|
||||||
{
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void hook_exit()
|
void hook_exit()
|
||||||
{
|
{
|
||||||
if (g_hook_active)
|
if (g_hook_active)
|
||||||
@ -605,7 +621,7 @@ void hook_exit()
|
|||||||
g_hook_active = FALSE;
|
g_hook_active = FALSE;
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
if (g_hook_dinput)
|
if (cfg_get_bool("dinputhook", FALSE))
|
||||||
{
|
{
|
||||||
if (real_DirectInputCreateA)
|
if (real_DirectInputCreateA)
|
||||||
{
|
{
|
||||||
@ -655,20 +671,5 @@ void hook_exit()
|
|||||||
real_SetUnhandledExceptionFilter(g_dbg_exception_filter);
|
real_SetUnhandledExceptionFilter(g_dbg_exception_filter);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance);
|
|
||||||
hook_patch_iat(GetModuleHandle("XIIIGame.dll"), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA); //BALDR FORCE EXE
|
|
||||||
hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA);
|
|
||||||
|
|
||||||
if (!cfg_get_bool("no_dinput_hook", FALSE))
|
|
||||||
{
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx);
|
|
||||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ HOOKPROC g_mouse_proc;
|
|||||||
|
|
||||||
void mouse_lock()
|
void mouse_lock()
|
||||||
{
|
{
|
||||||
if (g_ddraw->devmode || g_ddraw->bnet_active)
|
if (g_ddraw->devmode || g_ddraw->bnet_active || !g_ddraw->hwnd)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (g_hook_active && !g_mouse_locked && !IsIconic(g_ddraw->hwnd))
|
if (g_hook_active && !g_mouse_locked && !IsIconic(g_ddraw->hwnd))
|
||||||
@ -53,7 +53,7 @@ void mouse_lock()
|
|||||||
|
|
||||||
void mouse_unlock()
|
void mouse_unlock()
|
||||||
{
|
{
|
||||||
if (g_ddraw->devmode || !g_hook_active)
|
if (g_ddraw->devmode || !g_hook_active || !g_ddraw->hwnd)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (g_mouse_locked)
|
if (g_mouse_locked)
|
||||||
|
@ -16,9 +16,12 @@
|
|||||||
|
|
||||||
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
||||||
{
|
{
|
||||||
|
if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width)
|
||||||
|
return real_GetCursorPos(lpPoint);
|
||||||
|
|
||||||
POINT pt, realpt;
|
POINT pt, realpt;
|
||||||
|
|
||||||
if (!real_GetCursorPos(&pt) || !g_ddraw)
|
if (!real_GetCursorPos(&pt))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
realpt.x = pt.x;
|
realpt.x = pt.x;
|
||||||
@ -130,7 +133,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
|||||||
|
|
||||||
BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
||||||
{
|
{
|
||||||
if (g_ddraw)
|
if (g_ddraw && g_ddraw->hwnd && g_ddraw->width)
|
||||||
{
|
{
|
||||||
RECT dst_rc = {
|
RECT dst_rc = {
|
||||||
0,
|
0,
|
||||||
@ -176,7 +179,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
|||||||
|
|
||||||
int WINAPI fake_ShowCursor(BOOL bShow)
|
int WINAPI fake_ShowCursor(BOOL bShow)
|
||||||
{
|
{
|
||||||
if (g_ddraw)
|
if (g_ddraw && g_ddraw->hwnd)
|
||||||
{
|
{
|
||||||
if (g_mouse_locked || g_ddraw->devmode)
|
if (g_mouse_locked || g_ddraw->devmode)
|
||||||
{
|
{
|
||||||
@ -197,7 +200,7 @@ int WINAPI fake_ShowCursor(BOOL bShow)
|
|||||||
|
|
||||||
HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
|
HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
|
||||||
{
|
{
|
||||||
if (g_ddraw)
|
if (g_ddraw && g_ddraw->hwnd)
|
||||||
{
|
{
|
||||||
HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor);
|
HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor);
|
||||||
|
|
||||||
@ -260,7 +263,10 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect)
|
|||||||
|
|
||||||
BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint)
|
BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd != hWnd)
|
if (!g_ddraw || !g_ddraw->hwnd)
|
||||||
|
return real_ClientToScreen(hWnd, lpPoint);
|
||||||
|
|
||||||
|
if (g_ddraw->hwnd != hWnd)
|
||||||
return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw->hwnd, lpPoint);
|
return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw->hwnd, lpPoint);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -268,7 +274,10 @@ BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint)
|
|||||||
|
|
||||||
BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint)
|
BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd != hWnd)
|
if (!g_ddraw || !g_ddraw->hwnd)
|
||||||
|
return real_ScreenToClient(hWnd, lpPoint);
|
||||||
|
|
||||||
|
if (g_ddraw->hwnd != hWnd)
|
||||||
return real_ClientToScreen(g_ddraw->hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint);
|
return real_ClientToScreen(g_ddraw->hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -276,35 +285,41 @@ BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint)
|
|||||||
|
|
||||||
BOOL WINAPI fake_SetCursorPos(int X, int Y)
|
BOOL WINAPI fake_SetCursorPos(int X, int Y)
|
||||||
{
|
{
|
||||||
if (g_ddraw && !g_mouse_locked && !g_ddraw->devmode)
|
if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width)
|
||||||
|
return real_SetCursorPos(X, Y);
|
||||||
|
|
||||||
|
if (!g_mouse_locked && !g_ddraw->devmode)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
POINT pt = { X, Y };
|
POINT pt = { X, Y };
|
||||||
|
|
||||||
if (g_ddraw)
|
if (g_ddraw->adjmouse)
|
||||||
{
|
{
|
||||||
if (g_ddraw->adjmouse)
|
pt.x = (LONG)(roundf(pt.x * g_ddraw->render.scale_w));
|
||||||
{
|
pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h));
|
||||||
pt.x = (LONG)(roundf(pt.x * g_ddraw->render.scale_w));
|
|
||||||
pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h));
|
|
||||||
}
|
|
||||||
|
|
||||||
pt.x += g_ddraw->mouse.x_adjust;
|
|
||||||
pt.y += g_ddraw->mouse.y_adjust;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y);
|
pt.x += g_ddraw->mouse.x_adjust;
|
||||||
|
pt.y += g_ddraw->mouse.y_adjust;
|
||||||
|
|
||||||
|
return real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
HWND WINAPI fake_WindowFromPoint(POINT Point)
|
HWND WINAPI fake_WindowFromPoint(POINT Point)
|
||||||
{
|
{
|
||||||
|
if (!g_ddraw || !g_ddraw->hwnd)
|
||||||
|
return real_WindowFromPoint(Point);
|
||||||
|
|
||||||
POINT pt = { Point.x, Point.y };
|
POINT pt = { Point.x, Point.y };
|
||||||
return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) ? real_WindowFromPoint(pt) : NULL;
|
return real_ClientToScreen(g_ddraw->hwnd, &pt) ? real_WindowFromPoint(pt) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI fake_GetClipCursor(LPRECT lpRect)
|
BOOL WINAPI fake_GetClipCursor(LPRECT lpRect)
|
||||||
{
|
{
|
||||||
if (lpRect && g_ddraw)
|
if (!g_ddraw || !g_ddraw->width)
|
||||||
|
return real_GetClipCursor(lpRect);
|
||||||
|
|
||||||
|
if (lpRect)
|
||||||
{
|
{
|
||||||
lpRect->bottom = g_ddraw->height;
|
lpRect->bottom = g_ddraw->height;
|
||||||
lpRect->left = 0;
|
lpRect->left = 0;
|
||||||
@ -319,12 +334,15 @@ BOOL WINAPI fake_GetClipCursor(LPRECT lpRect)
|
|||||||
|
|
||||||
BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci)
|
BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci)
|
||||||
{
|
{
|
||||||
return pci && g_ddraw && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw->hwnd, &pci->ptScreenPos);
|
if (!g_ddraw || !g_ddraw->hwnd)
|
||||||
|
return real_GetCursorInfo(pci);
|
||||||
|
|
||||||
|
return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw->hwnd, &pci->ptScreenPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
int WINAPI fake_GetSystemMetrics(int nIndex)
|
int WINAPI fake_GetSystemMetrics(int nIndex)
|
||||||
{
|
{
|
||||||
if (g_ddraw)
|
if (g_ddraw && g_ddraw->width)
|
||||||
{
|
{
|
||||||
if (nIndex == SM_CXSCREEN)
|
if (nIndex == SM_CXSCREEN)
|
||||||
return g_ddraw->width;
|
return g_ddraw->width;
|
||||||
@ -396,7 +414,10 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO
|
|||||||
|
|
||||||
LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd == hWnd && Msg == WM_MOUSEMOVE)
|
if (!g_ddraw || !g_ddraw->hwnd)
|
||||||
|
return real_SendMessageA(hWnd, Msg, wParam, lParam);
|
||||||
|
|
||||||
|
if (g_ddraw->hwnd == hWnd && Msg == WM_MOUSEMOVE)
|
||||||
{
|
{
|
||||||
int x = GET_X_LPARAM(lParam);
|
int x = GET_X_LPARAM(lParam);
|
||||||
int y = GET_Y_LPARAM(lParam);
|
int y = GET_Y_LPARAM(lParam);
|
||||||
@ -410,7 +431,7 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar
|
|||||||
lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust);
|
lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw && g_ddraw->hwnd == hWnd && Msg == WM_SIZE && (g_hook_method != 2 && g_hook_method != 3))
|
if (g_ddraw->hwnd == hWnd && Msg == WM_SIZE && (g_hook_method != 2 && g_hook_method != 3))
|
||||||
{
|
{
|
||||||
Msg = WM_SIZE_DDRAW;
|
Msg = WM_SIZE_DDRAW;
|
||||||
}
|
}
|
||||||
@ -471,7 +492,7 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable)
|
|||||||
|
|
||||||
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints)
|
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints)
|
||||||
{
|
{
|
||||||
if (g_ddraw)
|
if (g_ddraw && g_ddraw->hwnd)
|
||||||
{
|
{
|
||||||
if (hWndTo == HWND_DESKTOP)
|
if (hWndTo == HWND_DESKTOP)
|
||||||
{
|
{
|
||||||
@ -570,7 +591,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w
|
|||||||
{
|
{
|
||||||
BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
|
BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
|
||||||
|
|
||||||
if (result && g_ddraw && g_ddraw->hook_peekmessage)
|
if (result && g_ddraw && g_ddraw->width && g_ddraw->hook_peekmessage)
|
||||||
{
|
{
|
||||||
switch (lpMsg->message)
|
switch (lpMsg->message)
|
||||||
{
|
{
|
||||||
@ -882,6 +903,14 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName)
|
|||||||
{
|
{
|
||||||
HMODULE hmod = real_LoadLibraryA(lpLibFileName);
|
HMODULE hmod = real_LoadLibraryA(lpLibFileName);
|
||||||
|
|
||||||
|
#ifdef _DEBUG_X
|
||||||
|
char mod_path[MAX_PATH] = { 0 };
|
||||||
|
if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
||||||
|
{
|
||||||
|
TRACE_EXT("LoadLibraryA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
hook_init();
|
hook_init();
|
||||||
|
|
||||||
return hmod;
|
return hmod;
|
||||||
@ -891,6 +920,14 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName)
|
|||||||
{
|
{
|
||||||
HMODULE hmod = real_LoadLibraryW(lpLibFileName);
|
HMODULE hmod = real_LoadLibraryW(lpLibFileName);
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
char mod_path[MAX_PATH] = { 0 };
|
||||||
|
if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
||||||
|
{
|
||||||
|
TRACE("LoadLibraryW Module %s = %p\n", mod_path, hmod);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
hook_init();
|
hook_init();
|
||||||
|
|
||||||
return hmod;
|
return hmod;
|
||||||
@ -900,6 +937,14 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF
|
|||||||
{
|
{
|
||||||
HMODULE hmod = real_LoadLibraryExA(lpLibFileName, hFile, dwFlags);
|
HMODULE hmod = real_LoadLibraryExA(lpLibFileName, hFile, dwFlags);
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
char mod_path[MAX_PATH] = { 0 };
|
||||||
|
if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
||||||
|
{
|
||||||
|
TRACE("LoadLibraryExA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
hook_init();
|
hook_init();
|
||||||
|
|
||||||
return hmod;
|
return hmod;
|
||||||
@ -909,6 +954,14 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw
|
|||||||
{
|
{
|
||||||
HMODULE hmod = real_LoadLibraryExW(lpLibFileName, hFile, dwFlags);
|
HMODULE hmod = real_LoadLibraryExW(lpLibFileName, hFile, dwFlags);
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
char mod_path[MAX_PATH] = { 0 };
|
||||||
|
if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
||||||
|
{
|
||||||
|
TRACE("LoadLibraryExW Module %s = %p\n", mod_path, hmod);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
hook_init();
|
hook_init();
|
||||||
|
|
||||||
return hmod;
|
return hmod;
|
||||||
@ -1008,12 +1061,12 @@ HWND WINAPI fake_CreateWindowExA(
|
|||||||
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
|
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
|
||||||
{
|
{
|
||||||
/* Fix for SMACKW32.DLL creating another window that steals the focus */
|
/* Fix for SMACKW32.DLL creating another window that steals the focus */
|
||||||
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw)
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw && g_ddraw->hwnd)
|
||||||
{
|
{
|
||||||
dwStyle &= ~WS_VISIBLE;
|
dwStyle &= ~WS_VISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw)
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw && g_ddraw->hwnd)
|
||||||
{
|
{
|
||||||
if (!g_ddraw->bnet_active)
|
if (!g_ddraw->bnet_active)
|
||||||
{
|
{
|
||||||
@ -1080,18 +1133,23 @@ HWND WINAPI fake_CreateWindowExA(
|
|||||||
|
|
||||||
HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv)
|
HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv)
|
||||||
{
|
{
|
||||||
if (rclsid && riid && (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)))
|
if (rclsid && riid)
|
||||||
{
|
{
|
||||||
if (IsEqualGUID(&IID_IDirectDraw2, riid) ||
|
TRACE("CoCreateInstance rclsid = %08X, riid = %08X, \n", ((GUID*)rclsid)->Data1, ((GUID*)riid)->Data1);
|
||||||
IsEqualGUID(&IID_IDirectDraw4, riid) ||
|
|
||||||
IsEqualGUID(&IID_IDirectDraw7, riid))
|
if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid))
|
||||||
{
|
{
|
||||||
return dd_CreateEx(NULL, ppv, riid, NULL);
|
if (IsEqualGUID(&IID_IDirectDraw2, riid) ||
|
||||||
}
|
IsEqualGUID(&IID_IDirectDraw4, riid) ||
|
||||||
else
|
IsEqualGUID(&IID_IDirectDraw7, riid))
|
||||||
{
|
{
|
||||||
return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL);
|
return dd_CreateEx(NULL, ppv, riid, NULL);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);
|
return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user