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

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