From 1452bbe5989847599c55ced122356972e9faf900 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 15:15:44 +0200 Subject: [PATCH] remove early hook function --- inc/hook.h | 3 +- src/config.c | 1 - src/directinput.c | 11 ++-- src/dllmain.c | 3 +- src/hook.c | 95 ++++++++++++++++---------------- src/mouse.c | 4 +- src/winapi_hooks.c | 132 ++++++++++++++++++++++++++++++++------------- 7 files changed, 154 insertions(+), 95 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 3f3cb82..d42bef9 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -9,7 +9,7 @@ #define SKIP_HOOK3 0x00000002l 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* CLIPCURSORPROC)(const RECT*); @@ -103,7 +103,6 @@ extern BOOL g_hook_dinput; extern BOOL g_hook_active; void hook_init(); -void hook_early_init(); void hook_exit(); 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); diff --git a/src/config.c b/src/config.c index 809a772..4272f84 100644 --- a/src/config.c +++ b/src/config.c @@ -76,7 +76,6 @@ void cfg_load() 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_ddraw->render.maxfps = cfg_get_int("maxfps", -1); diff --git a/src/directinput.c b/src/directinput.c index 86be466..047a2f1 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -195,7 +195,7 @@ HRESULT WINAPI fake_DirectInputCreateA( 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 = (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); - if (SUCCEEDED(result) && !real_di_CreateDevice) + if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) { real_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); - if (SUCCEEDED(result) && !real_di_CreateDevice) + if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); @@ -273,7 +273,8 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (SUCCEEDED(result) && !real_di_CreateDeviceEx && 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 = (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); - if (SUCCEEDED(result) && !real_di_CreateDevice) + if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); diff --git a/src/dllmain.c b/src/dllmain.c index 9aadbbe..b084ecc 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -101,7 +101,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } timeBeginPeriod(1); - hook_early_init(); + g_hook_method = cfg_get_int("hook", 4); + hook_init(); break; } case DLL_PROCESS_DETACH: diff --git a/src/hook.c b/src/hook.c index 11b9ea7..a8d4e37 100644 --- a/src/hook.c +++ b/src/hook.c @@ -90,6 +90,30 @@ static HOOKLIST g_hooks[] = { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 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 } } }, @@ -110,6 +134,7 @@ static HOOKLIST g_hooks[] = { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, 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 }, + { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, SKIP_HOOK2 | SKIP_HOOK3 }, { "", NULL, NULL, 0 } } }, @@ -400,7 +425,10 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) 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); @@ -515,7 +543,7 @@ void hook_init() BOOL initial_hook = !g_hook_active; #ifdef _MSC_VER - if (initial_hook && g_hook_dinput) + if (initial_hook && cfg_get_bool("dinputhook", FALSE)) { real_DirectInputCreateA = (DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA"); @@ -563,41 +591,29 @@ void hook_init() } #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; 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() { if (g_hook_active) @@ -605,7 +621,7 @@ void hook_exit() g_hook_active = FALSE; #ifdef _MSC_VER - if (g_hook_dinput) + if (cfg_get_bool("dinputhook", FALSE)) { if (real_DirectInputCreateA) { @@ -655,20 +671,5 @@ void hook_exit() real_SetUnhandledExceptionFilter(g_dbg_exception_filter); #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(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); - } } diff --git a/src/mouse.c b/src/mouse.c index e54438d..1a805da 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -11,7 +11,7 @@ HOOKPROC g_mouse_proc; void mouse_lock() { - if (g_ddraw->devmode || g_ddraw->bnet_active) + if (g_ddraw->devmode || g_ddraw->bnet_active || !g_ddraw->hwnd) return; if (g_hook_active && !g_mouse_locked && !IsIconic(g_ddraw->hwnd)) @@ -53,7 +53,7 @@ void mouse_lock() void mouse_unlock() { - if (g_ddraw->devmode || !g_hook_active) + if (g_ddraw->devmode || !g_hook_active || !g_ddraw->hwnd) return; if (g_mouse_locked) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 191a4c0..f3dfb38 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -16,9 +16,12 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { + if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width) + return real_GetCursorPos(lpPoint); + POINT pt, realpt; - if (!real_GetCursorPos(&pt) || !g_ddraw) + if (!real_GetCursorPos(&pt)) return FALSE; realpt.x = pt.x; @@ -130,7 +133,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) BOOL WINAPI fake_ClipCursor(const RECT* lpRect) { - if (g_ddraw) + if (g_ddraw && g_ddraw->hwnd && g_ddraw->width) { RECT dst_rc = { 0, @@ -176,7 +179,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) int WINAPI fake_ShowCursor(BOOL bShow) { - if (g_ddraw) + if (g_ddraw && g_ddraw->hwnd) { if (g_mouse_locked || g_ddraw->devmode) { @@ -197,7 +200,7 @@ int WINAPI fake_ShowCursor(BOOL bShow) 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); @@ -260,7 +263,10 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) 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 TRUE; @@ -268,7 +274,10 @@ BOOL WINAPI fake_ClientToScreen(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 TRUE; @@ -276,35 +285,41 @@ BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint) 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; 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 += g_ddraw->mouse.x_adjust; - pt.y += g_ddraw->mouse.y_adjust; + pt.x = (LONG)(roundf(pt.x * g_ddraw->render.scale_w)); + pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h)); } - 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) { + if (!g_ddraw || !g_ddraw->hwnd) + return real_WindowFromPoint(Point); + 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) { - if (lpRect && g_ddraw) + if (!g_ddraw || !g_ddraw->width) + return real_GetClipCursor(lpRect); + + if (lpRect) { lpRect->bottom = g_ddraw->height; lpRect->left = 0; @@ -319,12 +334,15 @@ BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) 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) { - if (g_ddraw) + if (g_ddraw && g_ddraw->width) { if (nIndex == SM_CXSCREEN) 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) { - 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 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); } - 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; } @@ -471,7 +492,7 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) 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) { @@ -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); - if (result && g_ddraw && g_ddraw->hook_peekmessage) + if (result && g_ddraw && g_ddraw->width && g_ddraw->hook_peekmessage) { switch (lpMsg->message) { @@ -882,6 +903,14 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR 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(); return hmod; @@ -891,6 +920,14 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR 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(); return hmod; @@ -900,6 +937,14 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF { 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(); return hmod; @@ -909,6 +954,14 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw { 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(); return hmod; @@ -1008,12 +1061,12 @@ HWND WINAPI fake_CreateWindowExA( int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { /* 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; } - 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) { @@ -1080,18 +1133,23 @@ HWND WINAPI fake_CreateWindowExA( 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) || - IsEqualGUID(&IID_IDirectDraw4, riid) || - IsEqualGUID(&IID_IDirectDraw7, riid)) + TRACE("CoCreateInstance rclsid = %08X, riid = %08X, \n", ((GUID*)rclsid)->Data1, ((GUID*)riid)->Data1); + + if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)) { - return dd_CreateEx(NULL, ppv, riid, NULL); - } - else - { - return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL); - } + if (IsEqualGUID(&IID_IDirectDraw2, riid) || + IsEqualGUID(&IID_IDirectDraw4, riid) || + IsEqualGUID(&IID_IDirectDraw7, riid)) + { + return dd_CreateEx(NULL, ppv, riid, NULL); + } + else + { + return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL); + } + } } return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);