1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-14 22:03:27 +01:00

remove early hook function

This commit is contained in:
FunkyFr3sh 2023-08-02 15:15:44 +02:00
parent 8fe772d385
commit 1452bbe598
7 changed files with 154 additions and 95 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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:

View File

@ -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);
}
}

View File

@ -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)

View File

@ -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);