2020-10-13 09:20:52 +02:00
|
|
|
#include <windows.h>
|
2021-04-02 00:25:31 +02:00
|
|
|
#include <windowsx.h>
|
2021-06-17 05:13:29 +02:00
|
|
|
#include <math.h>
|
2021-06-02 18:24:25 +02:00
|
|
|
#include "debug.h"
|
2021-09-16 02:25:22 +02:00
|
|
|
#include "config.h"
|
2020-10-13 09:20:52 +02:00
|
|
|
#include "dd.h"
|
2021-08-02 17:27:19 +02:00
|
|
|
#include "ddraw.h"
|
2020-10-13 09:20:52 +02:00
|
|
|
#include "hook.h"
|
|
|
|
#include "config.h"
|
|
|
|
#include "utils.h"
|
|
|
|
#include "mouse.h"
|
|
|
|
#include "wndproc.h"
|
2021-05-16 04:32:35 +02:00
|
|
|
#include "render_gdi.h"
|
2024-05-28 22:23:47 +02:00
|
|
|
#include "render_d3d9.h"
|
2024-07-22 09:02:31 +02:00
|
|
|
#include "render_ogl.h"
|
2023-08-02 17:09:01 +02:00
|
|
|
#include "directinput.h"
|
2022-10-02 18:41:06 +02:00
|
|
|
#include "ddsurface.h"
|
2023-08-10 11:32:43 +02:00
|
|
|
#include "ddclipper.h"
|
2023-08-02 17:09:01 +02:00
|
|
|
#include "dllmain.h"
|
2023-08-06 09:09:38 +02:00
|
|
|
#include "hook.h"
|
2023-11-04 05:09:06 +01:00
|
|
|
#include "directinput.h"
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
|
|
|
|
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width)
|
2023-08-02 15:15:44 +02:00
|
|
|
return real_GetCursorPos(lpPoint);
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
POINT pt, realpt;
|
2021-06-11 20:30:43 +02:00
|
|
|
|
2023-08-02 15:15:44 +02:00
|
|
|
if (!real_GetCursorPos(&pt))
|
2020-10-13 09:20:52 +02:00
|
|
|
return FALSE;
|
2021-06-11 20:30:43 +02:00
|
|
|
|
2024-05-30 23:55:30 +02:00
|
|
|
realpt = pt;
|
2021-06-11 20:30:43 +02:00
|
|
|
|
2024-05-30 23:55:30 +02:00
|
|
|
if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) &&
|
|
|
|
(!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt)))
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-05-30 23:55:30 +02:00
|
|
|
int x = max(pt.x - g_ddraw.mouse.x_adjust, 0);
|
|
|
|
int y = max(pt.y - g_ddraw.mouse.y_adjust, 0);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-06-01 02:20:21 +02:00
|
|
|
if (g_config.adjmouse && !g_ddraw.child_window_exists)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-05-30 23:55:30 +02:00
|
|
|
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
|
|
|
|
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
2024-05-30 23:55:30 +02:00
|
|
|
x = min(x, g_ddraw.width - 1);
|
|
|
|
y = min(y, g_ddraw.height - 1);
|
|
|
|
|
|
|
|
if (g_config.vhack &&
|
|
|
|
!g_ddraw.isworms2 &&
|
|
|
|
!g_config.devmode &&
|
|
|
|
!g_ddraw.bnet_active &&
|
|
|
|
InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0))
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-05-30 23:55:30 +02:00
|
|
|
int diffx = 0;
|
|
|
|
int diffy = 0;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (x > g_ddraw.upscale_hack_width)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
diffx = x - g_ddraw.upscale_hack_width;
|
|
|
|
x = g_ddraw.upscale_hack_width;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (y > g_ddraw.upscale_hack_height)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
diffy = y - g_ddraw.upscale_hack_height;
|
|
|
|
y = g_ddraw.upscale_hack_height;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (diffx || diffy)
|
|
|
|
real_SetCursorPos(realpt.x - diffx, realpt.y - diffy);
|
|
|
|
}
|
2021-06-17 06:13:16 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
|
|
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
2021-06-17 06:13:16 +02:00
|
|
|
|
|
|
|
if (lpPoint)
|
|
|
|
{
|
|
|
|
lpPoint->x = x;
|
|
|
|
lpPoint->y = y;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (lpPoint)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
|
|
|
lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-09-19 03:04:45 +02:00
|
|
|
RECT dst_rc = {
|
|
|
|
0,
|
|
|
|
0,
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.width,
|
|
|
|
g_ddraw.height
|
2021-09-19 03:04:45 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
if (lpRect)
|
|
|
|
CopyRect(&dst_rc, lpRect);
|
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_config.adjmouse)
|
2021-06-21 01:45:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw.render.scale_w));
|
|
|
|
dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw.render.scale_h));
|
|
|
|
dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw.render.scale_h));
|
|
|
|
dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw.render.scale_w));
|
2021-09-19 03:04:45 +02:00
|
|
|
}
|
2021-06-21 01:45:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width;
|
|
|
|
int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height;
|
2021-09-19 03:04:45 +02:00
|
|
|
|
|
|
|
dst_rc.bottom = min(dst_rc.bottom, max_height);
|
|
|
|
dst_rc.right = min(dst_rc.right, max_width);
|
|
|
|
|
|
|
|
OffsetRect(
|
|
|
|
&dst_rc,
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.mouse.x_adjust,
|
|
|
|
g_ddraw.mouse.y_adjust);
|
2021-09-19 03:04:45 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
CopyRect(&g_ddraw.mouse.rc, &dst_rc);
|
2021-09-19 03:04:45 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_mouse_locked && !util_is_minimized(g_ddraw.hwnd))
|
2021-09-19 03:04:45 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2);
|
2021-09-19 03:04:45 +02:00
|
|
|
|
|
|
|
return real_ClipCursor(&dst_rc);
|
2021-06-21 01:45:52 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-09-19 03:04:45 +02:00
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
int WINAPI fake_ShowCursor(BOOL bShow)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
2021-06-17 04:12:05 +02:00
|
|
|
{
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_mouse_locked || g_config.devmode)
|
2021-06-17 04:12:05 +02:00
|
|
|
{
|
|
|
|
int count = real_ShowCursor(bShow);
|
2024-03-22 22:27:00 +01:00
|
|
|
InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, count);
|
2021-06-17 04:12:05 +02:00
|
|
|
return count;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return bShow ?
|
2024-03-22 22:27:00 +01:00
|
|
|
InterlockedIncrement((LONG*)&g_ddraw.show_cursor_count) :
|
|
|
|
InterlockedDecrement((LONG*)&g_ddraw.show_cursor_count);
|
2021-06-17 04:12:05 +02:00
|
|
|
}
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-17 04:12:05 +02:00
|
|
|
return real_ShowCursor(bShow);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
2021-06-17 04:12:05 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)hCursor);
|
2021-06-12 05:57:45 +02:00
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (!g_mouse_locked && !g_config.devmode)
|
2021-06-19 04:28:15 +02:00
|
|
|
return cursor;
|
2021-06-17 04:12:05 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
2021-06-19 04:28:15 +02:00
|
|
|
return real_SetCursor(hCursor);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect)
|
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (lpRect &&
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.ref &&
|
|
|
|
g_ddraw.hwnd &&
|
2024-05-29 23:30:49 +02:00
|
|
|
g_ddraw.width &&
|
2024-03-22 22:27:00 +01:00
|
|
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-05-29 23:30:49 +02:00
|
|
|
if (hWnd == g_ddraw.hwnd || hWnd == GetDesktopWindow())
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
lpRect->bottom = g_ddraw.height;
|
2020-10-13 09:20:52 +02:00
|
|
|
lpRect->left = 0;
|
2024-03-22 22:27:00 +01:00
|
|
|
lpRect->right = g_ddraw.width;
|
2020-10-13 09:20:52 +02:00
|
|
|
lpRect->top = 0;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (real_GetWindowRect(hWnd, lpRect))
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)lpRect, 2);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return real_GetWindowRect(hWnd, lpRect);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect)
|
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (lpRect &&
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.ref &&
|
2024-05-29 23:30:49 +02:00
|
|
|
g_ddraw.width &&
|
|
|
|
(g_ddraw.hwnd == hWnd || hWnd == GetDesktopWindow()) &&
|
2024-03-22 22:27:00 +01:00
|
|
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
lpRect->bottom = g_ddraw.height;
|
2020-10-13 09:20:52 +02:00
|
|
|
lpRect->left = 0;
|
2024-03-22 22:27:00 +01:00
|
|
|
lpRect->right = g_ddraw.width;
|
2020-10-13 09:20:52 +02:00
|
|
|
lpRect->top = 0;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return real_GetClientRect(hWnd, lpRect);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
2023-08-02 15:15:44 +02:00
|
|
|
return real_ClientToScreen(hWnd, lpPoint);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.hwnd != hWnd)
|
|
|
|
return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw.hwnd, lpPoint);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
2023-08-02 15:15:44 +02:00
|
|
|
return real_ScreenToClient(hWnd, lpPoint);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.hwnd != hWnd)
|
|
|
|
return real_ClientToScreen(g_ddraw.hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_SetCursorPos(int X, int Y)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width)
|
2023-08-02 15:15:44 +02:00
|
|
|
return real_SetCursorPos(X, Y);
|
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (!g_mouse_locked && !g_config.devmode)
|
2021-02-20 07:30:14 +01:00
|
|
|
return TRUE;
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
POINT pt = { X, Y };
|
2020-11-05 22:45:40 +01:00
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_config.adjmouse)
|
2020-11-05 22:45:40 +01:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
pt.x = (LONG)(roundf(pt.x * g_ddraw.mouse.scale_x));
|
|
|
|
pt.y = (LONG)(roundf(pt.y * g_ddraw.mouse.scale_y));
|
2020-11-05 22:45:40 +01:00
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
pt.x += g_ddraw.mouse.x_adjust;
|
|
|
|
pt.y += g_ddraw.mouse.y_adjust;
|
2023-08-02 15:15:44 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
return real_ClientToScreen(g_ddraw.hwnd, &pt) && real_SetCursorPos(pt.x, pt.y);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
HWND WINAPI fake_WindowFromPoint(POINT Point)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
2023-08-02 15:15:44 +02:00
|
|
|
return real_WindowFromPoint(Point);
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
POINT pt = { Point.x, Point.y };
|
2024-03-22 22:27:00 +01:00
|
|
|
return real_ClientToScreen(g_ddraw.hwnd, &pt) ? real_WindowFromPoint(pt) : NULL;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_GetClipCursor(LPRECT lpRect)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.ref || !g_ddraw.width)
|
2023-08-02 15:15:44 +02:00
|
|
|
return real_GetClipCursor(lpRect);
|
|
|
|
|
|
|
|
if (lpRect)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
lpRect->bottom = g_ddraw.height;
|
2020-10-13 09:20:52 +02:00
|
|
|
lpRect->left = 0;
|
2024-03-22 22:27:00 +01:00
|
|
|
lpRect->right = g_ddraw.width;
|
2020-10-13 09:20:52 +02:00
|
|
|
lpRect->top = 0;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
2023-08-02 15:15:44 +02:00
|
|
|
return real_GetCursorInfo(pci);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw.hwnd, &pci->ptScreenPos);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int WINAPI fake_GetSystemMetrics(int nIndex)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.width)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
|
|
|
if (nIndex == SM_CXSCREEN)
|
2024-03-22 22:27:00 +01:00
|
|
|
return g_ddraw.width;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
if (nIndex == SM_CYSCREEN)
|
2024-03-22 22:27:00 +01:00
|
|
|
return g_ddraw.height;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return real_GetSystemMetrics(nIndex);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
2021-06-09 04:51:29 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.hwnd == hWnd)
|
2021-06-09 04:51:29 +02:00
|
|
|
{
|
|
|
|
UINT req_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-09 04:51:29 +02:00
|
|
|
if ((uFlags & req_flags) != req_flags)
|
|
|
|
return TRUE;
|
|
|
|
}
|
2024-03-22 22:27:00 +01:00
|
|
|
else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD))
|
2021-06-09 04:51:29 +02:00
|
|
|
{
|
|
|
|
POINT pt = { 0, 0 };
|
2024-03-22 22:27:00 +01:00
|
|
|
if (real_ClientToScreen(g_ddraw.hwnd, &pt))
|
2021-06-09 04:51:29 +02:00
|
|
|
{
|
|
|
|
X += pt.x;
|
|
|
|
Y += pt.y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return real_SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, uFlags);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
2021-06-09 04:51:29 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.hwnd == hWnd)
|
2021-06-09 04:51:29 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.width && g_ddraw.height && (nWidth != g_ddraw.width || nHeight != g_ddraw.height))
|
2023-07-11 02:13:30 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
//real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y));
|
2023-07-11 02:13:30 +02:00
|
|
|
|
|
|
|
real_SendMessageA(
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.hwnd,
|
2023-07-11 02:13:30 +02:00
|
|
|
WM_SIZE_DDRAW,
|
|
|
|
0,
|
2024-03-22 22:27:00 +01:00
|
|
|
MAKELPARAM(min(nWidth, g_ddraw.width), min(nHeight, g_ddraw.height)));
|
2023-07-11 02:13:30 +02:00
|
|
|
}
|
2023-07-10 23:55:44 +02:00
|
|
|
|
2021-06-09 04:51:29 +02:00
|
|
|
return TRUE;
|
|
|
|
}
|
2024-03-22 22:27:00 +01:00
|
|
|
else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD))
|
2021-06-09 04:51:29 +02:00
|
|
|
{
|
|
|
|
POINT pt = { 0, 0 };
|
2024-03-22 22:27:00 +01:00
|
|
|
if (real_ClientToScreen(g_ddraw.hwnd, &pt))
|
2021-06-09 04:51:29 +02:00
|
|
|
{
|
|
|
|
X += pt.x;
|
|
|
|
Y += pt.y;
|
|
|
|
}
|
|
|
|
}
|
2024-07-14 07:21:07 +02:00
|
|
|
else if (hWnd == g_ddraw.textbox.hwnd && IsWindow(hWnd) && GetParent(hWnd) == g_ddraw.hwnd && g_ddraw.width)
|
|
|
|
{
|
2024-07-14 07:59:39 +02:00
|
|
|
/* Age Of Empires 2 textbox align */
|
2024-07-14 07:21:07 +02:00
|
|
|
char class_name[MAX_PATH] = { 0 };
|
|
|
|
GetClassNameA(hWnd, class_name, sizeof(class_name) - 1);
|
|
|
|
|
|
|
|
if (_strcmpi(class_name, "Edit") == 0)
|
|
|
|
{
|
|
|
|
g_ddraw.textbox.x = X;
|
|
|
|
g_ddraw.textbox.y = Y;
|
|
|
|
|
2024-07-18 01:50:31 +02:00
|
|
|
X = (int)(g_ddraw.render.viewport.x + (X * g_ddraw.render.scale_w));
|
|
|
|
Y = (int)(g_ddraw.render.viewport.y + (Y * g_ddraw.render.scale_h));
|
2024-07-14 07:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2021-06-09 04:51:29 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return real_MoveWindow(hWnd, X, Y, nWidth, nHeight, bRepaint);
|
|
|
|
}
|
|
|
|
|
|
|
|
LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
2023-08-02 15:15:44 +02:00
|
|
|
return real_SendMessageA(hWnd, Msg, wParam, lParam);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.hwnd == hWnd && Msg == WM_MOUSEMOVE)
|
2021-04-02 00:25:31 +02:00
|
|
|
{
|
2021-06-16 05:57:19 +02:00
|
|
|
int x = GET_X_LPARAM(lParam);
|
|
|
|
int y = GET_Y_LPARAM(lParam);
|
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_config.adjmouse)
|
2021-06-16 05:57:19 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
x = (int)(roundf(x * g_ddraw.mouse.scale_x));
|
|
|
|
y = (int)(roundf(y * g_ddraw.mouse.scale_y));
|
2021-06-16 05:57:19 +02:00
|
|
|
}
|
2021-04-02 00:25:31 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
lParam = MAKELPARAM(x + g_ddraw.mouse.x_adjust, y + g_ddraw.mouse.y_adjust);
|
2021-04-02 00:25:31 +02:00
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2)
|
2021-06-10 02:18:15 +02:00
|
|
|
{
|
|
|
|
Msg = WM_SIZE_DDRAW;
|
|
|
|
}
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
LRESULT result = real_SendMessageA(hWnd, Msg, wParam, lParam);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (result && g_ddraw.ref && Msg == CB_GETDROPPEDCONTROLRECT)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
RECT* rc = (RECT*)lParam;
|
2020-10-13 09:20:52 +02:00
|
|
|
if (rc)
|
2024-03-22 22:27:00 +01:00
|
|
|
real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)rc, 2);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd == hWnd)
|
2021-06-02 14:29:25 +02:00
|
|
|
{
|
|
|
|
if (nIndex == GWL_STYLE)
|
|
|
|
return 0;
|
|
|
|
|
2023-07-31 07:33:57 +02:00
|
|
|
if (nIndex == GWL_WNDPROC)
|
2021-06-02 14:29:25 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
WNDPROC old = g_ddraw.wndproc;
|
|
|
|
g_ddraw.wndproc = (WNDPROC)dwNewLong;
|
2021-06-04 22:46:15 +02:00
|
|
|
|
2023-07-31 07:33:57 +02:00
|
|
|
return (LONG)old;
|
2021-06-02 14:29:25 +02:00
|
|
|
}
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return real_SetWindowLongA(hWnd, nIndex, dwNewLong);
|
|
|
|
}
|
|
|
|
|
2021-06-04 22:46:15 +02:00
|
|
|
LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd == hWnd)
|
2021-06-04 22:46:15 +02:00
|
|
|
{
|
2023-07-31 07:33:57 +02:00
|
|
|
if (nIndex == GWL_WNDPROC)
|
2021-06-04 22:46:15 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
return (LONG)g_ddraw.wndproc;
|
2021-06-04 22:46:15 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return real_GetWindowLongA(hWnd, nIndex);
|
|
|
|
}
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd == hWnd)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return real_EnableWindow(hWnd, bEnable);
|
|
|
|
}
|
|
|
|
|
2021-05-29 21:40:21 +02:00
|
|
|
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
2021-05-29 21:40:21 +02:00
|
|
|
{
|
2021-06-25 14:35:22 +02:00
|
|
|
if (hWndTo == HWND_DESKTOP)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (hWndFrom == g_ddraw.hwnd)
|
2021-06-25 14:35:22 +02:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2024-06-02 08:17:57 +02:00
|
|
|
real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints);
|
|
|
|
return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints);
|
2021-06-25 14:35:22 +02:00
|
|
|
}
|
|
|
|
}
|
2021-05-29 21:40:21 +02:00
|
|
|
|
2021-06-25 14:35:22 +02:00
|
|
|
if (hWndFrom == HWND_DESKTOP)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (hWndTo == g_ddraw.hwnd)
|
2021-06-25 14:35:22 +02:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2024-06-02 08:17:57 +02:00
|
|
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints);
|
|
|
|
return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints);
|
2021-06-25 14:35:22 +02:00
|
|
|
}
|
|
|
|
}
|
2021-05-29 21:40:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints);
|
|
|
|
}
|
|
|
|
|
2021-08-04 15:24:16 +02:00
|
|
|
BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow)
|
|
|
|
{
|
2024-05-29 05:54:28 +02:00
|
|
|
/* Don't hide the taskbar (Some of The Learning Company games) */
|
|
|
|
if (nCmdShow == SW_HIDE && hWnd && hWnd != g_ddraw.hwnd && hWnd == FindWindowA("Shell_TrayWnd", NULL))
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd == hWnd)
|
2021-08-04 15:24:16 +02:00
|
|
|
{
|
2024-05-29 04:28:05 +02:00
|
|
|
/* Make sure we got close/move menu items (Almost all of the The Learning Company games) */
|
|
|
|
HMENU menu = GetSystemMenu(hWnd, FALSE);
|
|
|
|
if (!menu || GetMenuState(menu, SC_CLOSE, MF_BYCOMMAND) == -1 || GetMenuState(menu, SC_MOVE, MF_BYCOMMAND) == -1)
|
|
|
|
{
|
|
|
|
GetSystemMenu(hWnd, TRUE);
|
|
|
|
}
|
|
|
|
|
2021-08-04 15:24:16 +02:00
|
|
|
if (nCmdShow == SW_SHOWMAXIMIZED)
|
|
|
|
nCmdShow = SW_SHOWNORMAL;
|
|
|
|
|
|
|
|
if (nCmdShow == SW_MAXIMIZE)
|
|
|
|
nCmdShow = SW_NORMAL;
|
2021-09-14 05:37:08 +02:00
|
|
|
|
2024-06-01 04:08:14 +02:00
|
|
|
if (nCmdShow == SW_MINIMIZE && g_config.hook != 2 && !g_config.tlc_hack)
|
2021-09-14 05:37:08 +02:00
|
|
|
return TRUE;
|
2021-08-04 15:24:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return real_ShowWindow(hWnd, nCmdShow);
|
|
|
|
}
|
|
|
|
|
2022-10-18 22:21:42 +02:00
|
|
|
HWND WINAPI fake_GetTopWindow(HWND hWnd)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd && !hWnd)
|
2022-10-18 22:21:42 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
return g_ddraw.hwnd;
|
2022-10-18 22:21:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return real_GetTopWindow(hWnd);
|
|
|
|
}
|
|
|
|
|
2022-10-19 05:08:22 +02:00
|
|
|
HWND WINAPI fake_GetForegroundWindow()
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd)
|
2022-10-19 05:08:22 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
return g_ddraw.hwnd;
|
2022-10-19 05:08:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return real_GetForegroundWindow();
|
|
|
|
}
|
|
|
|
|
2023-04-09 20:06:51 +02:00
|
|
|
BOOL WINAPI fake_SetForegroundWindow(HWND hWnd)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.bnet_active)
|
2023-04-09 20:06:51 +02:00
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return real_SetForegroundWindow(hWnd);
|
|
|
|
}
|
|
|
|
|
2021-06-06 19:03:38 +02:00
|
|
|
HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId)
|
|
|
|
{
|
2024-06-16 05:37:11 +02:00
|
|
|
TRACE(
|
|
|
|
"SetWindowsHookExA(idHook=%d, lpfn=%p, hmod=%p, dwThreadId=%d) [%p]\n",
|
|
|
|
idHook,
|
|
|
|
lpfn,
|
|
|
|
hmod,
|
|
|
|
dwThreadId,
|
|
|
|
_ReturnAddress());
|
2023-08-04 10:00:38 +02:00
|
|
|
|
2021-06-06 19:03:38 +02:00
|
|
|
if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && g_config.fixmousehook)
|
2021-09-09 03:49:54 +02:00
|
|
|
{
|
|
|
|
g_mouse_proc = lpfn;
|
|
|
|
return g_mouse_hook = real_SetWindowsHookExA(idHook, mouse_hook_proc, hmod, dwThreadId);
|
|
|
|
}
|
|
|
|
|
2021-06-06 19:03:38 +02:00
|
|
|
return real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId);
|
|
|
|
}
|
|
|
|
|
2023-10-07 09:03:11 +02:00
|
|
|
BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
|
2023-02-27 18:25:28 +01:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.width)
|
2023-02-27 18:25:28 +01:00
|
|
|
{
|
|
|
|
switch (lpMsg->message)
|
|
|
|
{
|
|
|
|
case WM_LBUTTONUP:
|
|
|
|
case WM_RBUTTONUP:
|
|
|
|
case WM_MBUTTONUP:
|
|
|
|
{
|
2023-09-22 00:38:42 +02:00
|
|
|
if (!g_config.devmode && !g_mouse_locked)
|
2023-02-27 18:25:28 +01:00
|
|
|
{
|
|
|
|
int x = GET_X_LPARAM(lpMsg->lParam);
|
|
|
|
int y = GET_Y_LPARAM(lpMsg->lParam);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width ||
|
|
|
|
x < g_ddraw.render.viewport.x ||
|
|
|
|
y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height ||
|
|
|
|
y < g_ddraw.render.viewport.y)
|
2023-02-27 18:25:28 +01:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
x = g_ddraw.width / 2;
|
|
|
|
y = g_ddraw.height / 2;
|
2023-02-27 18:25:28 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
|
|
|
|
y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
|
2023-02-27 18:25:28 +01:00
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
|
|
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
2023-02-27 18:25:28 +01:00
|
|
|
|
|
|
|
mouse_lock();
|
2023-03-06 03:55:10 +01:00
|
|
|
//return FALSE;
|
2023-02-27 18:25:28 +01:00
|
|
|
}
|
|
|
|
/* fall through for lParam */
|
|
|
|
}
|
|
|
|
/* down messages are ignored if we have no cursor lock */
|
|
|
|
case WM_XBUTTONDBLCLK:
|
|
|
|
case WM_XBUTTONDOWN:
|
|
|
|
case WM_XBUTTONUP:
|
|
|
|
case WM_MOUSEWHEEL:
|
|
|
|
case WM_MOUSEHOVER:
|
|
|
|
case WM_LBUTTONDBLCLK:
|
|
|
|
case WM_MBUTTONDBLCLK:
|
|
|
|
case WM_RBUTTONDBLCLK:
|
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
case WM_RBUTTONDOWN:
|
|
|
|
case WM_MBUTTONDOWN:
|
|
|
|
case WM_MOUSEMOVE:
|
|
|
|
{
|
2023-09-22 00:38:42 +02:00
|
|
|
if (!g_config.devmode && !g_mouse_locked)
|
2023-02-27 18:25:28 +01:00
|
|
|
{
|
2023-03-06 03:48:50 +01:00
|
|
|
// Does not work with 'New Robinson'
|
|
|
|
//return FALSE;
|
2023-02-27 18:25:28 +01:00
|
|
|
}
|
|
|
|
|
2023-10-05 02:17:01 +02:00
|
|
|
if (lpMsg->message == WM_MOUSEWHEEL)
|
|
|
|
{
|
|
|
|
POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) };
|
2024-03-22 22:27:00 +01:00
|
|
|
real_ScreenToClient(g_ddraw.hwnd, &pt);
|
2023-10-05 02:17:01 +02:00
|
|
|
lpMsg->lParam = MAKELPARAM(pt.x, pt.y);
|
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw.mouse.x_adjust, 0);
|
|
|
|
int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw.mouse.y_adjust, 0);
|
2023-02-27 18:25:28 +01:00
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_config.adjmouse)
|
2023-02-27 18:25:28 +01:00
|
|
|
{
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_config.vhack && !g_config.devmode)
|
2023-02-27 18:25:28 +01:00
|
|
|
{
|
|
|
|
POINT pt = { 0, 0 };
|
|
|
|
fake_GetCursorPos(&pt);
|
|
|
|
|
|
|
|
x = pt.x;
|
|
|
|
y = pt.y;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
|
|
|
|
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
|
2023-02-27 18:25:28 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
x = min(x, g_ddraw.width - 1);
|
|
|
|
y = min(y, g_ddraw.height - 1);
|
2023-02-27 18:25:28 +01:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
|
|
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
2023-02-27 18:25:28 +01:00
|
|
|
|
|
|
|
lpMsg->lParam = MAKELPARAM(x, y);
|
2024-05-30 21:32:02 +02:00
|
|
|
|
|
|
|
lpMsg->pt.x = x;
|
|
|
|
lpMsg->pt.y = y;
|
2023-02-27 18:25:28 +01:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
2023-10-07 09:03:11 +02:00
|
|
|
|
2023-02-27 18:25:28 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-07 09:03:11 +02:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
|
|
|
|
{
|
|
|
|
BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
|
|
|
|
|
2024-05-31 02:23:30 +02:00
|
|
|
if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook)
|
2024-05-30 21:32:02 +02:00
|
|
|
{
|
2024-05-31 01:49:43 +02:00
|
|
|
if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))
|
2024-05-30 21:32:02 +02:00
|
|
|
{
|
|
|
|
int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0);
|
|
|
|
int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0);
|
|
|
|
|
|
|
|
if (g_config.adjmouse)
|
|
|
|
{
|
|
|
|
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
|
|
|
|
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
|
|
|
|
}
|
|
|
|
|
|
|
|
lpMsg->pt.x = min(x, g_ddraw.width - 1);
|
|
|
|
lpMsg->pt.y = min(y, g_ddraw.height - 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
|
|
|
lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
|
|
|
}
|
2024-05-30 23:55:30 +02:00
|
|
|
|
|
|
|
if (g_config.hook_getmessage)
|
|
|
|
{
|
|
|
|
HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
|
|
|
|
}
|
2024-05-30 21:32:02 +02:00
|
|
|
}
|
2023-10-07 09:03:11 +02:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)
|
|
|
|
{
|
|
|
|
BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
|
|
|
|
|
2024-05-31 02:23:30 +02:00
|
|
|
if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook)
|
2024-05-30 21:32:02 +02:00
|
|
|
{
|
2024-05-31 01:49:43 +02:00
|
|
|
if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))
|
2024-05-30 21:32:02 +02:00
|
|
|
{
|
|
|
|
int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0);
|
|
|
|
int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0);
|
|
|
|
|
|
|
|
if (g_config.adjmouse)
|
|
|
|
{
|
|
|
|
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
|
|
|
|
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
|
|
|
|
}
|
|
|
|
|
|
|
|
lpMsg->pt.x = min(x, g_ddraw.width - 1);
|
|
|
|
lpMsg->pt.y = min(y, g_ddraw.height - 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
|
|
|
lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
|
|
|
}
|
2024-05-30 23:55:30 +02:00
|
|
|
|
|
|
|
if (g_config.hook_peekmessage)
|
|
|
|
{
|
|
|
|
HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
|
|
|
|
}
|
2024-05-30 21:32:02 +02:00
|
|
|
}
|
2023-10-07 09:03:11 +02:00
|
|
|
|
2023-02-27 18:25:28 +01:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2024-05-30 03:00:23 +02:00
|
|
|
BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl)
|
|
|
|
{
|
|
|
|
BOOL result = real_GetWindowPlacement(hWnd, lpwndpl);
|
|
|
|
|
|
|
|
if (result &&
|
|
|
|
lpwndpl &&
|
|
|
|
g_ddraw.ref &&
|
|
|
|
g_ddraw.hwnd &&
|
|
|
|
g_ddraw.width &&
|
|
|
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
|
|
|
{
|
|
|
|
if (hWnd == g_ddraw.hwnd || hWnd == GetDesktopWindow())
|
|
|
|
{
|
|
|
|
lpwndpl->rcNormalPosition.bottom = g_ddraw.height;
|
|
|
|
lpwndpl->rcNormalPosition.left = 0;
|
|
|
|
lpwndpl->rcNormalPosition.right = g_ddraw.width;
|
|
|
|
lpwndpl->rcNormalPosition.top = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&lpwndpl->rcNormalPosition, 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2024-06-10 00:02:39 +02:00
|
|
|
BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode)
|
|
|
|
{
|
|
|
|
BOOL result = real_EnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode);
|
|
|
|
|
|
|
|
if (result && !lpszDeviceName && lpDevMode && iModeNum == ENUM_CURRENT_SETTINGS)
|
|
|
|
{
|
|
|
|
if (g_ddraw.ref && g_ddraw.width)
|
|
|
|
{
|
|
|
|
lpDevMode->dmPelsWidth = g_ddraw.width;
|
|
|
|
lpDevMode->dmPelsHeight = g_ddraw.height;
|
|
|
|
lpDevMode->dmBitsPerPel = g_ddraw.bpp;
|
|
|
|
}
|
|
|
|
else if (g_config.fake_mode[0])
|
|
|
|
{
|
|
|
|
char* e = &g_config.fake_mode[0];
|
|
|
|
|
|
|
|
lpDevMode->dmPelsWidth = strtoul(e, &e, 0);
|
|
|
|
lpDevMode->dmPelsHeight = strtoul(e + 1, &e, 0);
|
|
|
|
lpDevMode->dmBitsPerPel = strtoul(e + 1, &e, 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
lpDevMode->dmPelsWidth = 1024;
|
|
|
|
lpDevMode->dmPelsHeight = 768;
|
|
|
|
lpDevMode->dmBitsPerPel = 16;
|
|
|
|
}
|
|
|
|
|
|
|
|
lpDevMode->dmDisplayFrequency = 60;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2024-07-27 09:42:18 +02:00
|
|
|
BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect)
|
|
|
|
{
|
|
|
|
if (!g_ddraw.ref || !g_ddraw.width || !g_ddraw.hwnd || hWnd != g_ddraw.hwnd || !lpRect)
|
|
|
|
return real_ValidateRect(hWnd, lpRect);
|
|
|
|
|
|
|
|
RECT dst_rc;
|
|
|
|
|
|
|
|
dst_rc.left = (LONG)(roundf(lpRect->left * g_ddraw.render.scale_w));
|
|
|
|
dst_rc.top = (LONG)(roundf(lpRect->top * g_ddraw.render.scale_h));
|
|
|
|
dst_rc.bottom = (LONG)(roundf(lpRect->bottom * g_ddraw.render.scale_h));
|
|
|
|
dst_rc.right = (LONG)(roundf(lpRect->right * g_ddraw.render.scale_w));
|
|
|
|
|
|
|
|
OffsetRect(
|
|
|
|
&dst_rc,
|
|
|
|
g_ddraw.render.viewport.x,
|
|
|
|
g_ddraw.render.viewport.y);
|
|
|
|
|
2024-07-27 09:52:08 +02:00
|
|
|
return real_ValidateRect(hWnd, &dst_rc);
|
2024-07-27 09:42:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase)
|
|
|
|
{
|
|
|
|
if (!g_ddraw.ref || !g_ddraw.width || !g_ddraw.hwnd || hWnd != g_ddraw.hwnd || !lpRect)
|
|
|
|
return real_InvalidateRect(hWnd, lpRect, bErase);
|
|
|
|
|
|
|
|
RECT dst_rc;
|
|
|
|
|
|
|
|
dst_rc.left = (LONG)(roundf(lpRect->left * g_ddraw.render.scale_w));
|
|
|
|
dst_rc.top = (LONG)(roundf(lpRect->top * g_ddraw.render.scale_h));
|
|
|
|
dst_rc.bottom = (LONG)(roundf(lpRect->bottom * g_ddraw.render.scale_h));
|
|
|
|
dst_rc.right = (LONG)(roundf(lpRect->right * g_ddraw.render.scale_w));
|
|
|
|
|
|
|
|
OffsetRect(
|
|
|
|
&dst_rc,
|
|
|
|
g_ddraw.render.viewport.x,
|
|
|
|
g_ddraw.render.viewport.y);
|
|
|
|
|
|
|
|
return real_InvalidateRect(hWnd, &dst_rc, bErase);
|
|
|
|
}
|
|
|
|
|
2024-03-20 05:35:36 +01:00
|
|
|
SHORT WINAPI fake_GetKeyState(int nVirtKey)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())
|
2024-03-20 05:35:36 +01:00
|
|
|
{
|
2024-03-20 21:31:05 +01:00
|
|
|
return 0;
|
2024-03-20 05:35:36 +01:00
|
|
|
}
|
|
|
|
|
2024-03-20 05:41:42 +01:00
|
|
|
return real_GetKeyState(nVirtKey);
|
2024-03-20 05:35:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SHORT WINAPI fake_GetAsyncKeyState(int vKey)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())
|
2024-03-20 05:35:36 +01:00
|
|
|
{
|
2024-03-20 21:31:05 +01:00
|
|
|
return 0;
|
2024-03-20 05:35:36 +01:00
|
|
|
}
|
|
|
|
|
2024-03-20 05:41:42 +01:00
|
|
|
return real_GetAsyncKeyState(vKey);
|
2024-03-20 05:35:36 +01:00
|
|
|
}
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
int WINAPI fake_GetDeviceCaps(HDC hdc, int index)
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref &&
|
|
|
|
g_ddraw.bpp &&
|
2021-06-11 20:30:43 +02:00
|
|
|
index == BITSPIXEL &&
|
2024-03-22 22:27:00 +01:00
|
|
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
return g_ddraw.bpp;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2023-03-03 22:29:35 +01:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref &&
|
|
|
|
g_ddraw.bpp == 8 &&
|
2023-03-03 22:29:35 +01:00
|
|
|
index == RASTERCAPS &&
|
2024-03-22 22:27:00 +01:00
|
|
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
2023-03-03 22:29:35 +01:00
|
|
|
{
|
|
|
|
return RC_PALETTE | real_GetDeviceCaps(hdc, index);
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return real_GetDeviceCaps(hdc, index);
|
|
|
|
}
|
|
|
|
|
2022-10-02 18:41:06 +02:00
|
|
|
BOOL WINAPI fake_StretchBlt(
|
|
|
|
HDC hdcDest,
|
|
|
|
int xDest,
|
|
|
|
int yDest,
|
|
|
|
int wDest,
|
|
|
|
int hDest,
|
|
|
|
HDC hdcSrc,
|
|
|
|
int xSrc,
|
|
|
|
int ySrc,
|
|
|
|
int wSrc,
|
|
|
|
int hSrc,
|
|
|
|
DWORD rop)
|
|
|
|
{
|
2022-10-03 01:43:54 +02:00
|
|
|
HWND hwnd = WindowFromDC(hdcDest);
|
|
|
|
|
2022-10-07 01:05:27 +02:00
|
|
|
char class_name[MAX_PATH] = { 0 };
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd)
|
2022-10-07 01:05:27 +02:00
|
|
|
{
|
|
|
|
GetClassNameA(hwnd, class_name, sizeof(class_name) - 1);
|
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd &&
|
|
|
|
(hwnd == g_ddraw.hwnd ||
|
|
|
|
(g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) &&
|
2023-09-22 00:38:42 +02:00
|
|
|
(g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
|
2024-06-04 03:40:29 +02:00
|
|
|
strcmp(class_name, "VideoRenderer") == 0 ||
|
2024-04-26 01:13:50 +02:00
|
|
|
strcmp(class_name, "AVI Window") == 0 ||
|
2024-02-17 23:18:42 +01:00
|
|
|
strcmp(class_name, "MCIAVI") == 0 ||
|
2022-10-07 01:05:27 +02:00
|
|
|
strcmp(class_name, "AVIWnd32") == 0 ||
|
|
|
|
strcmp(class_name, "MCIWndClass") == 0))))
|
2022-10-02 18:41:06 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette))
|
2022-10-02 18:41:06 +02:00
|
|
|
{
|
2022-10-02 20:55:20 +02:00
|
|
|
HDC primary_dc;
|
2024-03-22 22:27:00 +01:00
|
|
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
2022-10-02 20:55:20 +02:00
|
|
|
|
|
|
|
if (primary_dc)
|
|
|
|
{
|
2024-06-04 03:40:29 +02:00
|
|
|
POINT pt = { 0 };
|
|
|
|
real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1);
|
|
|
|
|
2024-06-06 02:29:48 +02:00
|
|
|
int org_mode = SetStretchBltMode(hdcDest, COLORONCOLOR);
|
|
|
|
SetStretchBltMode(hdcDest, org_mode);
|
|
|
|
|
|
|
|
int mode = SetStretchBltMode(primary_dc, org_mode);
|
|
|
|
|
2022-10-07 01:05:27 +02:00
|
|
|
BOOL result =
|
2024-06-04 03:40:29 +02:00
|
|
|
real_StretchBlt(
|
|
|
|
primary_dc,
|
|
|
|
xDest + pt.x,
|
|
|
|
yDest + pt.y,
|
|
|
|
wDest,
|
|
|
|
hDest,
|
|
|
|
hdcSrc,
|
|
|
|
xSrc,
|
|
|
|
ySrc,
|
|
|
|
wSrc,
|
|
|
|
hSrc,
|
|
|
|
rop);
|
2022-10-02 18:41:06 +02:00
|
|
|
|
2024-06-06 02:29:48 +02:00
|
|
|
SetStretchBltMode(primary_dc, mode);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
dds_ReleaseDC(g_ddraw.primary, primary_dc);
|
2022-10-02 18:41:06 +02:00
|
|
|
|
2022-10-02 20:55:20 +02:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
2024-03-22 22:27:00 +01:00
|
|
|
else if (g_ddraw.width > 0 && g_ddraw.render.hdc)
|
2022-10-02 20:55:20 +02:00
|
|
|
{
|
|
|
|
return real_StretchBlt(
|
2024-05-28 03:08:25 +02:00
|
|
|
hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc,
|
2024-06-02 09:44:34 +02:00
|
|
|
(int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x,
|
|
|
|
(int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y,
|
|
|
|
(int)(roundf(wDest * g_ddraw.render.scale_w)),
|
|
|
|
(int)(roundf(hDest * g_ddraw.render.scale_h)),
|
2022-10-07 01:05:27 +02:00
|
|
|
hdcSrc,
|
|
|
|
xSrc,
|
|
|
|
ySrc,
|
|
|
|
wSrc,
|
|
|
|
hSrc,
|
2022-10-02 20:55:20 +02:00
|
|
|
rop);
|
2022-10-02 18:41:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop);
|
|
|
|
}
|
|
|
|
|
2024-05-27 01:15:30 +02:00
|
|
|
BOOL WINAPI fake_WinGStretchBlt(
|
|
|
|
HDC hdcDest,
|
|
|
|
int xDest,
|
|
|
|
int yDest,
|
|
|
|
int wDest,
|
|
|
|
int hDest,
|
|
|
|
HDC hdcSrc,
|
|
|
|
int xSrc,
|
|
|
|
int ySrc,
|
|
|
|
int wSrc,
|
|
|
|
int hSrc)
|
|
|
|
{
|
2024-05-27 04:02:48 +02:00
|
|
|
int mode = SetStretchBltMode(hdcDest, COLORONCOLOR);
|
|
|
|
BOOL result = fake_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, SRCCOPY);
|
|
|
|
SetStretchBltMode(hdcDest, mode);
|
|
|
|
|
|
|
|
return result;
|
2024-05-27 01:15:30 +02:00
|
|
|
}
|
|
|
|
|
2024-05-25 07:29:30 +02:00
|
|
|
BOOL WINAPI fake_BitBlt(
|
|
|
|
HDC hdc,
|
|
|
|
int x,
|
|
|
|
int y,
|
|
|
|
int cx,
|
|
|
|
int cy,
|
|
|
|
HDC hdcSrc,
|
|
|
|
int x1,
|
|
|
|
int y1,
|
|
|
|
DWORD rop)
|
|
|
|
{
|
2024-05-28 03:08:25 +02:00
|
|
|
HWND hwnd = WindowFromDC(hdc);
|
|
|
|
|
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd)
|
2024-05-25 07:29:30 +02:00
|
|
|
{
|
|
|
|
if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette))
|
|
|
|
{
|
|
|
|
HDC primary_dc;
|
|
|
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
|
|
|
|
|
|
|
if (primary_dc)
|
|
|
|
{
|
|
|
|
int result =
|
|
|
|
real_BitBlt(
|
|
|
|
primary_dc,
|
|
|
|
x,
|
|
|
|
y,
|
|
|
|
cx,
|
|
|
|
cy,
|
|
|
|
hdcSrc,
|
|
|
|
x1,
|
|
|
|
y1,
|
|
|
|
rop);
|
|
|
|
|
|
|
|
dds_ReleaseDC(g_ddraw.primary, primary_dc);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
2024-05-27 01:15:30 +02:00
|
|
|
else if (g_ddraw.width > 0 && g_ddraw.render.hdc)
|
|
|
|
{
|
|
|
|
return real_StretchBlt(
|
2024-05-28 03:08:25 +02:00
|
|
|
hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc,
|
2024-06-02 09:44:34 +02:00
|
|
|
(int)(roundf(x * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x,
|
|
|
|
(int)(roundf(y * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y,
|
|
|
|
(int)(roundf(cx * g_ddraw.render.scale_w)),
|
|
|
|
(int)(roundf(cy * g_ddraw.render.scale_h)),
|
2024-05-27 01:15:30 +02:00
|
|
|
hdcSrc,
|
|
|
|
x1,
|
|
|
|
y1,
|
|
|
|
cx,
|
|
|
|
cy,
|
|
|
|
rop);
|
|
|
|
}
|
2024-05-25 07:29:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return real_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, rop);
|
|
|
|
}
|
|
|
|
|
2024-05-27 01:15:30 +02:00
|
|
|
BOOL WINAPI fake_WinGBitBlt(
|
|
|
|
HDC hdc,
|
|
|
|
int x,
|
|
|
|
int y,
|
|
|
|
int cx,
|
|
|
|
int cy,
|
|
|
|
HDC hdcSrc,
|
|
|
|
int x1,
|
|
|
|
int y1)
|
|
|
|
{
|
|
|
|
return fake_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, SRCCOPY);
|
|
|
|
}
|
|
|
|
|
2022-10-03 12:19:15 +02:00
|
|
|
int WINAPI fake_SetDIBitsToDevice(
|
|
|
|
HDC hdc,
|
|
|
|
int xDest,
|
|
|
|
int yDest,
|
|
|
|
DWORD w,
|
|
|
|
DWORD h,
|
|
|
|
int xSrc,
|
|
|
|
int ySrc,
|
|
|
|
UINT StartScan,
|
|
|
|
UINT cLines,
|
|
|
|
const VOID* lpvBits,
|
|
|
|
const BITMAPINFO* lpbmi,
|
|
|
|
UINT ColorUse)
|
|
|
|
{
|
2024-06-04 03:55:40 +02:00
|
|
|
HWND hwnd = WindowFromDC(hdc);
|
|
|
|
|
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd)
|
2022-10-03 12:19:15 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette))
|
2022-10-03 12:19:15 +02:00
|
|
|
{
|
|
|
|
HDC primary_dc;
|
2024-03-22 22:27:00 +01:00
|
|
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
2022-10-03 12:19:15 +02:00
|
|
|
|
|
|
|
if (primary_dc)
|
|
|
|
{
|
2022-10-05 23:08:14 +02:00
|
|
|
int result =
|
2022-10-03 12:19:15 +02:00
|
|
|
real_SetDIBitsToDevice(
|
|
|
|
primary_dc,
|
|
|
|
xDest,
|
|
|
|
yDest,
|
|
|
|
w,
|
|
|
|
h,
|
|
|
|
xSrc,
|
|
|
|
ySrc,
|
|
|
|
StartScan,
|
|
|
|
cLines,
|
|
|
|
lpvBits,
|
|
|
|
lpbmi,
|
|
|
|
ColorUse);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
dds_ReleaseDC(g_ddraw.primary, primary_dc);
|
2022-10-03 12:19:15 +02:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
2024-06-04 03:55:40 +02:00
|
|
|
else if (g_ddraw.width > 0 && g_ddraw.render.hdc)
|
|
|
|
{
|
|
|
|
return
|
|
|
|
real_StretchDIBits(
|
|
|
|
hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc,
|
|
|
|
(int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x,
|
|
|
|
(int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y,
|
|
|
|
(int)(roundf(w * g_ddraw.render.scale_w)),
|
|
|
|
(int)(roundf(h * g_ddraw.render.scale_h)),
|
|
|
|
xSrc,
|
|
|
|
ySrc,
|
|
|
|
w,
|
|
|
|
h,
|
|
|
|
lpvBits,
|
|
|
|
lpbmi,
|
|
|
|
ColorUse,
|
|
|
|
SRCCOPY);
|
|
|
|
}
|
2022-10-03 12:19:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return real_SetDIBitsToDevice(hdc, xDest, yDest, w, h, xSrc, ySrc, StartScan, cLines, lpvBits, lpbmi, ColorUse);
|
|
|
|
}
|
|
|
|
|
2022-10-05 22:33:53 +02:00
|
|
|
int WINAPI fake_StretchDIBits(
|
|
|
|
HDC hdc,
|
|
|
|
int xDest,
|
|
|
|
int yDest,
|
|
|
|
int DestWidth,
|
|
|
|
int DestHeight,
|
|
|
|
int xSrc,
|
|
|
|
int ySrc,
|
|
|
|
int SrcWidth,
|
|
|
|
int SrcHeight,
|
|
|
|
const VOID* lpBits,
|
|
|
|
const BITMAPINFO* lpbmi,
|
|
|
|
UINT iUsage,
|
|
|
|
DWORD rop)
|
|
|
|
{
|
2024-02-17 23:18:42 +01:00
|
|
|
HWND hwnd = WindowFromDC(hdc);
|
|
|
|
|
|
|
|
char class_name[MAX_PATH] = { 0 };
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd)
|
2024-02-17 23:18:42 +01:00
|
|
|
{
|
|
|
|
GetClassNameA(hwnd, class_name, sizeof(class_name) - 1);
|
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd &&
|
|
|
|
(hwnd == g_ddraw.hwnd ||
|
|
|
|
(g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) &&
|
2024-02-17 23:18:42 +01:00
|
|
|
(g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
|
2024-06-04 03:55:40 +02:00
|
|
|
strcmp(class_name, "VideoRenderer") == 0 ||
|
2024-04-26 01:27:34 +02:00
|
|
|
strcmp(class_name, "AVI Window") == 0 ||
|
2024-02-17 23:18:42 +01:00
|
|
|
strcmp(class_name, "MCIAVI") == 0 ||
|
|
|
|
strcmp(class_name, "AVIWnd32") == 0 ||
|
|
|
|
strcmp(class_name, "MCIWndClass") == 0))))
|
2022-10-05 22:33:53 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette))
|
2022-10-05 22:33:53 +02:00
|
|
|
{
|
|
|
|
HDC primary_dc;
|
2024-03-22 22:27:00 +01:00
|
|
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
2022-10-05 22:33:53 +02:00
|
|
|
|
|
|
|
if (primary_dc)
|
|
|
|
{
|
2024-06-04 03:40:29 +02:00
|
|
|
POINT pt = {0};
|
|
|
|
real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1);
|
|
|
|
|
2022-10-05 22:33:53 +02:00
|
|
|
int result =
|
|
|
|
real_StretchDIBits(
|
|
|
|
primary_dc,
|
2024-06-04 03:40:29 +02:00
|
|
|
xDest + pt.x,
|
|
|
|
yDest + pt.y,
|
2022-10-05 22:33:53 +02:00
|
|
|
DestWidth,
|
|
|
|
DestHeight,
|
|
|
|
xSrc,
|
|
|
|
ySrc,
|
|
|
|
SrcWidth,
|
|
|
|
SrcHeight,
|
|
|
|
lpBits,
|
|
|
|
lpbmi,
|
|
|
|
iUsage,
|
|
|
|
rop);
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
dds_ReleaseDC(g_ddraw.primary, primary_dc);
|
2022-10-05 22:33:53 +02:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
2024-03-22 22:27:00 +01:00
|
|
|
else if (g_ddraw.width > 0 && g_ddraw.render.hdc)
|
2022-10-05 22:33:53 +02:00
|
|
|
{
|
|
|
|
return
|
|
|
|
real_StretchDIBits(
|
2024-05-28 03:08:25 +02:00
|
|
|
hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc,
|
2024-06-02 09:44:34 +02:00
|
|
|
(int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x,
|
|
|
|
(int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y,
|
|
|
|
(int)(roundf(DestWidth * g_ddraw.render.scale_w)),
|
|
|
|
(int)(roundf(DestHeight * g_ddraw.render.scale_h)),
|
2022-10-05 22:33:53 +02:00
|
|
|
xSrc,
|
|
|
|
ySrc,
|
|
|
|
SrcWidth,
|
|
|
|
SrcHeight,
|
|
|
|
lpBits,
|
|
|
|
lpbmi,
|
|
|
|
iUsage,
|
|
|
|
rop);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
real_StretchDIBits(
|
|
|
|
hdc,
|
|
|
|
xDest,
|
|
|
|
yDest,
|
|
|
|
DestWidth,
|
|
|
|
DestHeight,
|
|
|
|
xSrc,
|
|
|
|
ySrc,
|
|
|
|
SrcWidth,
|
|
|
|
SrcHeight,
|
|
|
|
lpBits,
|
|
|
|
lpbmi,
|
|
|
|
iUsage,
|
|
|
|
rop);
|
|
|
|
}
|
|
|
|
|
2023-08-16 14:21:26 +02:00
|
|
|
HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf)
|
|
|
|
{
|
|
|
|
LOGFONTA lf;
|
|
|
|
memcpy(&lf, lplf, sizeof(lf));
|
|
|
|
|
2023-09-16 01:11:03 +02:00
|
|
|
if (lf.lfHeight < 0) {
|
2023-09-22 00:38:42 +02:00
|
|
|
lf.lfHeight = min(-g_config.min_font_size, lf.lfHeight);
|
2023-09-16 01:11:03 +02:00
|
|
|
}
|
|
|
|
else {
|
2023-09-22 00:38:42 +02:00
|
|
|
lf.lfHeight = max(g_config.min_font_size, lf.lfHeight);
|
2023-09-16 01:11:03 +02:00
|
|
|
}
|
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_config.anti_aliased_fonts_min_size > abs(lf.lfHeight))
|
2023-08-16 14:21:26 +02:00
|
|
|
lf.lfQuality = NONANTIALIASED_QUALITY;
|
|
|
|
|
|
|
|
return real_CreateFontIndirectA(&lf);
|
|
|
|
}
|
|
|
|
|
|
|
|
HFONT WINAPI fake_CreateFontA(
|
|
|
|
int nHeight,
|
|
|
|
int nWidth,
|
|
|
|
int nEscapement,
|
|
|
|
int nOrientation,
|
|
|
|
int fnWeight,
|
|
|
|
DWORD fdwItalic,
|
|
|
|
DWORD fdwUnderline,
|
|
|
|
DWORD fdwStrikeOut,
|
|
|
|
DWORD fdwCharSet,
|
|
|
|
DWORD fdwOutputPrecision,
|
|
|
|
DWORD fdwClipPrecision,
|
|
|
|
DWORD fdwQuality,
|
|
|
|
DWORD fdwPitchAndFamily,
|
|
|
|
LPCTSTR lpszFace)
|
|
|
|
{
|
2023-09-16 10:08:15 +12:00
|
|
|
if (nHeight < 0) {
|
2023-09-22 00:38:42 +02:00
|
|
|
nHeight = min(-g_config.min_font_size, nHeight);
|
2023-09-16 10:08:15 +12:00
|
|
|
}
|
|
|
|
else {
|
2023-09-22 00:38:42 +02:00
|
|
|
nHeight = max(g_config.min_font_size, nHeight);
|
2023-09-16 10:08:15 +12:00
|
|
|
}
|
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_config.anti_aliased_fonts_min_size > abs(nHeight))
|
2023-09-16 01:11:03 +02:00
|
|
|
fdwQuality = NONANTIALIASED_QUALITY;
|
|
|
|
|
2023-08-16 14:21:26 +02:00
|
|
|
return
|
|
|
|
real_CreateFontA(
|
|
|
|
nHeight,
|
|
|
|
nWidth,
|
|
|
|
nEscapement,
|
|
|
|
nOrientation,
|
|
|
|
fnWeight,
|
|
|
|
fdwItalic,
|
|
|
|
fdwUnderline,
|
|
|
|
fdwStrikeOut,
|
|
|
|
fdwCharSet,
|
|
|
|
fdwOutputPrecision,
|
|
|
|
fdwClipPrecision,
|
|
|
|
fdwQuality,
|
|
|
|
fdwPitchAndFamily,
|
|
|
|
lpszFace);
|
|
|
|
}
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName)
|
|
|
|
{
|
2023-10-23 13:38:24 +02:00
|
|
|
HMODULE hmod_old = GetModuleHandleA(lpLibFileName);
|
2020-10-13 09:20:52 +02:00
|
|
|
HMODULE hmod = real_LoadLibraryA(lpLibFileName);
|
|
|
|
|
2023-08-10 14:41:42 +02:00
|
|
|
#ifdef _DEBUG
|
2023-08-02 15:15:44 +02:00
|
|
|
char mod_path[MAX_PATH] = { 0 };
|
2023-10-23 13:38:24 +02:00
|
|
|
if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
2023-08-02 15:15:44 +02:00
|
|
|
{
|
2024-06-16 05:37:11 +02:00
|
|
|
TRACE("LoadLibraryA Module %s = %p (%s) [%p]\n", mod_path, hmod, lpLibFileName, _ReturnAddress());
|
2023-08-02 15:15:44 +02:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-11-04 05:09:06 +01:00
|
|
|
if (hmod && hmod != g_ddraw_module && lpLibFileName &&
|
|
|
|
(_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 ||
|
|
|
|
_strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0))
|
2023-08-02 17:09:01 +02:00
|
|
|
{
|
2023-11-04 05:09:06 +01:00
|
|
|
dinput_hook_init();
|
|
|
|
}
|
2023-08-02 17:09:01 +02:00
|
|
|
|
2023-11-04 05:09:06 +01:00
|
|
|
if (hmod && hmod != hmod_old)
|
|
|
|
{
|
2024-06-02 22:17:26 +02:00
|
|
|
hook_init();
|
2023-10-23 13:38:24 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return hmod;
|
|
|
|
}
|
|
|
|
|
|
|
|
HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName)
|
|
|
|
{
|
2023-10-23 13:38:24 +02:00
|
|
|
HMODULE hmod_old = GetModuleHandleW(lpLibFileName);
|
2020-10-13 09:20:52 +02:00
|
|
|
HMODULE hmod = real_LoadLibraryW(lpLibFileName);
|
|
|
|
|
2023-08-02 15:15:44 +02:00
|
|
|
#ifdef _DEBUG
|
|
|
|
char mod_path[MAX_PATH] = { 0 };
|
2023-10-23 13:38:24 +02:00
|
|
|
if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
2023-08-02 15:15:44 +02:00
|
|
|
{
|
2024-06-16 05:37:11 +02:00
|
|
|
TRACE("LoadLibraryW Module %s = %p [%p]\n", mod_path, hmod, _ReturnAddress());
|
2023-08-02 15:15:44 +02:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-11-04 05:09:06 +01:00
|
|
|
if (hmod && hmod != g_ddraw_module && lpLibFileName &&
|
|
|
|
(_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 ||
|
|
|
|
_wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0))
|
2023-08-02 17:09:01 +02:00
|
|
|
{
|
2023-11-04 05:09:06 +01:00
|
|
|
dinput_hook_init();
|
|
|
|
}
|
2023-08-02 17:09:01 +02:00
|
|
|
|
2023-11-04 05:09:06 +01:00
|
|
|
if (hmod && hmod != hmod_old)
|
|
|
|
{
|
2024-06-02 22:17:26 +02:00
|
|
|
hook_init();
|
2023-10-23 13:38:24 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return hmod;
|
|
|
|
}
|
|
|
|
|
|
|
|
HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
|
|
|
|
{
|
2023-10-23 13:38:24 +02:00
|
|
|
HMODULE hmod_old = GetModuleHandleA(lpLibFileName);
|
2020-10-13 09:20:52 +02:00
|
|
|
HMODULE hmod = real_LoadLibraryExA(lpLibFileName, hFile, dwFlags);
|
|
|
|
|
2023-08-02 15:15:44 +02:00
|
|
|
#ifdef _DEBUG
|
|
|
|
char mod_path[MAX_PATH] = { 0 };
|
2023-10-23 13:38:24 +02:00
|
|
|
if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
2023-08-02 15:15:44 +02:00
|
|
|
{
|
2024-06-16 05:37:11 +02:00
|
|
|
TRACE("LoadLibraryExA Module %s = %p (%s) [%p]\n", mod_path, hmod, lpLibFileName, _ReturnAddress());
|
2023-08-02 15:15:44 +02:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-11-04 05:09:06 +01:00
|
|
|
if (hmod && hmod != g_ddraw_module && lpLibFileName &&
|
|
|
|
(_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 ||
|
|
|
|
_strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0))
|
2023-08-02 17:09:01 +02:00
|
|
|
{
|
2023-11-04 05:09:06 +01:00
|
|
|
dinput_hook_init();
|
|
|
|
}
|
2023-08-02 17:09:01 +02:00
|
|
|
|
2023-11-04 05:09:06 +01:00
|
|
|
if (hmod && hmod != hmod_old)
|
|
|
|
{
|
2024-06-02 22:17:26 +02:00
|
|
|
hook_init();
|
2023-10-23 13:38:24 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return hmod;
|
|
|
|
}
|
|
|
|
|
|
|
|
HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
|
|
|
|
{
|
2023-10-23 13:38:24 +02:00
|
|
|
HMODULE hmod_old = GetModuleHandleW(lpLibFileName);
|
2020-10-13 09:20:52 +02:00
|
|
|
HMODULE hmod = real_LoadLibraryExW(lpLibFileName, hFile, dwFlags);
|
|
|
|
|
2023-08-02 15:15:44 +02:00
|
|
|
#ifdef _DEBUG
|
|
|
|
char mod_path[MAX_PATH] = { 0 };
|
2023-10-23 13:38:24 +02:00
|
|
|
if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
2023-08-02 15:15:44 +02:00
|
|
|
{
|
2024-06-16 05:37:11 +02:00
|
|
|
TRACE("LoadLibraryExW Module %s = %p [%p]\n", mod_path, hmod, _ReturnAddress());
|
2023-08-02 15:15:44 +02:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-11-04 05:09:06 +01:00
|
|
|
if (hmod && hmod != g_ddraw_module && lpLibFileName &&
|
|
|
|
(_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 ||
|
|
|
|
_wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0))
|
2023-08-02 17:09:01 +02:00
|
|
|
{
|
2023-11-04 05:09:06 +01:00
|
|
|
dinput_hook_init();
|
|
|
|
}
|
2023-08-02 17:09:01 +02:00
|
|
|
|
2023-11-04 05:09:06 +01:00
|
|
|
if (hmod && hmod != hmod_old)
|
|
|
|
{
|
2024-06-02 22:17:26 +02:00
|
|
|
hook_init();
|
2023-10-23 13:38:24 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
return hmod;
|
|
|
|
}
|
|
|
|
|
2023-08-06 09:09:38 +02:00
|
|
|
FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName)
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
|
|
|
char mod_path[MAX_PATH] = { 0 };
|
|
|
|
if (hModule && GetModuleFileNameA(hModule, mod_path, MAX_PATH))
|
|
|
|
{
|
2024-06-16 05:37:11 +02:00
|
|
|
TRACE("GetProcAddress %s (%s) [%p]\n", HIWORD(lpProcName) ? lpProcName : NULL, mod_path, _ReturnAddress());
|
2023-08-06 09:09:38 +02:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-11-04 04:45:41 +01:00
|
|
|
BOOL hook = g_config.hook == 3;
|
|
|
|
|
|
|
|
#if defined(__GNUC__)
|
|
|
|
if (g_config.hook == 4 && hModule && HIWORD(lpProcName))
|
|
|
|
{
|
2023-11-04 05:09:06 +01:00
|
|
|
if (strcmp(lpProcName, "DirectInputCreateA") == 0 ||
|
|
|
|
strcmp(lpProcName, "DirectInputCreateEx") == 0 ||
|
2023-11-04 04:45:41 +01:00
|
|
|
strcmp(lpProcName, "DirectInput8Create") == 0)
|
|
|
|
{
|
|
|
|
hook = TRUE;
|
2023-11-04 05:09:06 +01:00
|
|
|
g_dinput_hook_active = TRUE;
|
2023-11-04 04:45:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-08-06 09:09:38 +02:00
|
|
|
FARPROC proc = real_GetProcAddress(hModule, lpProcName);
|
|
|
|
|
2023-11-04 04:45:41 +01:00
|
|
|
if (!hook || !hModule || !HIWORD(lpProcName))
|
2023-08-06 09:09:38 +02:00
|
|
|
return proc;
|
|
|
|
|
|
|
|
for (int i = 0; g_hook_hooklist[i].module_name[0]; i++)
|
|
|
|
{
|
|
|
|
HMODULE mod = GetModuleHandleA(g_hook_hooklist[i].module_name);
|
|
|
|
|
|
|
|
if (hModule != mod)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
for (int x = 0; g_hook_hooklist[i].data[x].function_name[0]; x++)
|
|
|
|
{
|
|
|
|
if (strcmp(lpProcName, g_hook_hooklist[i].data[x].function_name) == 0)
|
|
|
|
{
|
|
|
|
return (FARPROC)g_hook_hooklist[i].data[x].new_function;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return proc;
|
|
|
|
}
|
|
|
|
|
2022-10-15 18:28:23 +02:00
|
|
|
BOOL WINAPI fake_GetDiskFreeSpaceA(
|
|
|
|
LPCSTR lpRootPathName,
|
|
|
|
LPDWORD lpSectorsPerCluster,
|
|
|
|
LPDWORD lpBytesPerSector,
|
|
|
|
LPDWORD lpNumberOfFreeClusters,
|
|
|
|
LPDWORD lpTotalNumberOfClusters)
|
|
|
|
{
|
|
|
|
BOOL result =
|
|
|
|
real_GetDiskFreeSpaceA(
|
|
|
|
lpRootPathName,
|
|
|
|
lpSectorsPerCluster,
|
|
|
|
lpBytesPerSector,
|
|
|
|
lpNumberOfFreeClusters,
|
|
|
|
lpTotalNumberOfClusters);
|
|
|
|
|
2022-10-16 00:02:43 +02:00
|
|
|
if (result && lpSectorsPerCluster && lpBytesPerSector && lpNumberOfFreeClusters)
|
2022-10-15 18:28:23 +02:00
|
|
|
{
|
2022-10-16 00:02:43 +02:00
|
|
|
long long int free_bytes = (long long int)*lpNumberOfFreeClusters * *lpSectorsPerCluster * *lpBytesPerSector;
|
2022-10-15 18:28:23 +02:00
|
|
|
|
2022-10-16 00:02:43 +02:00
|
|
|
if (free_bytes >= 2147155968)
|
|
|
|
{
|
|
|
|
*lpSectorsPerCluster = 0x00000040;
|
2022-10-15 18:28:23 +02:00
|
|
|
*lpBytesPerSector = 0x00000200;
|
|
|
|
*lpNumberOfFreeClusters = 0x0000FFF6;
|
|
|
|
|
2022-10-16 00:02:43 +02:00
|
|
|
if (lpTotalNumberOfClusters)
|
|
|
|
*lpTotalNumberOfClusters = 0x0000FFF6;
|
|
|
|
}
|
2022-10-15 18:28:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
BOOL WINAPI fake_DestroyWindow(HWND hWnd)
|
|
|
|
{
|
2024-06-16 05:37:11 +02:00
|
|
|
TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress());
|
2024-05-28 21:54:49 +02:00
|
|
|
|
2024-05-28 22:23:47 +02:00
|
|
|
if (g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd)
|
|
|
|
{
|
|
|
|
dd_RestoreDisplayMode();
|
|
|
|
|
|
|
|
if (g_ddraw.renderer == d3d9_render_main)
|
|
|
|
{
|
|
|
|
d3d9_release();
|
|
|
|
}
|
2024-07-22 09:02:31 +02:00
|
|
|
else if (g_ddraw.renderer == ogl_render_main)
|
|
|
|
{
|
|
|
|
ogl_release();
|
|
|
|
}
|
2024-05-28 22:23:47 +02:00
|
|
|
}
|
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
BOOL result = real_DestroyWindow(hWnd);
|
|
|
|
|
2024-05-28 22:23:47 +02:00
|
|
|
if (result && g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd)
|
2023-07-28 05:50:23 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.hwnd = NULL;
|
|
|
|
g_ddraw.wndproc = NULL;
|
|
|
|
g_ddraw.render.hdc = NULL;
|
2024-05-28 22:23:47 +02:00
|
|
|
|
|
|
|
if (g_config.fake_mode[0])
|
|
|
|
{
|
|
|
|
dd_SetCooperativeLevel(NULL, DDSCL_NORMAL);
|
|
|
|
}
|
2023-07-28 05:50:23 +02:00
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (g_ddraw.ref && g_ddraw.hwnd != hWnd && g_ddraw.bnet_active)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
|
|
|
RedrawWindow(NULL, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
|
|
|
|
|
|
|
if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL))
|
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.bnet_active = FALSE;
|
|
|
|
SetFocus(g_ddraw.hwnd);
|
2020-10-13 09:20:52 +02:00
|
|
|
mouse_lock();
|
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
if (g_config.windowed)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.bnet_pos.x = g_ddraw.bnet_pos.y = 0;
|
|
|
|
real_ClientToScreen(g_ddraw.hwnd, &g_ddraw.bnet_pos);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.bnet_was_upscaled)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left;
|
|
|
|
int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top;
|
2020-10-13 21:58:04 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
int dst_width = width == g_ddraw.width ? 0 : width;
|
|
|
|
int dst_height = height == g_ddraw.height ? 0 : height;
|
2021-11-05 15:23:35 +01:00
|
|
|
|
|
|
|
util_set_window_rect(
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.bnet_win_rect.left,
|
|
|
|
g_ddraw.bnet_win_rect.top,
|
2021-11-05 15:23:35 +01:00
|
|
|
dst_width,
|
|
|
|
dst_height,
|
|
|
|
flags);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
g_config.fullscreen = g_ddraw.bnet_was_upscaled;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
SetTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2023-09-22 00:38:42 +02:00
|
|
|
g_config.resizable = TRUE;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
HWND WINAPI fake_CreateWindowExA(
|
|
|
|
DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y,
|
|
|
|
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
|
|
|
|
{
|
2024-05-25 03:30:51 +02:00
|
|
|
TRACE("-> CreateWindowExA("
|
2024-05-24 22:16:32 +02:00
|
|
|
"dwExStyle=%08X, lpClassName=%p, lpWindowName=%p, dwStyle=%08X, X=%d, Y=%d, nWidth=%d, "
|
2024-06-16 05:37:11 +02:00
|
|
|
"nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p) [%p]\n",
|
2024-05-24 22:16:32 +02:00
|
|
|
dwExStyle,
|
|
|
|
lpClassName,
|
|
|
|
lpWindowName,
|
|
|
|
dwStyle,
|
|
|
|
X,
|
|
|
|
Y,
|
|
|
|
nWidth,
|
|
|
|
nHeight,
|
|
|
|
hWndParent,
|
|
|
|
hMenu,
|
|
|
|
hInstance,
|
2024-06-16 05:37:11 +02:00
|
|
|
lpParam,
|
|
|
|
_ReturnAddress());
|
2024-05-24 22:16:32 +02:00
|
|
|
|
|
|
|
TRACE(" WindowName=%s, ClassName=%s, g_ddraw.hwnd=%p\n", lpWindowName, HIWORD(lpClassName) ? lpClassName : "", g_ddraw.hwnd);
|
|
|
|
|
|
|
|
dbg_dump_wnd_styles(dwStyle, dwExStyle);
|
|
|
|
|
2024-06-01 06:30:00 +02:00
|
|
|
/* Almost all of the Learning Company Games */
|
|
|
|
if (!dwExStyle &&
|
|
|
|
HIWORD(lpClassName) && _strcmpi(lpClassName, "OMWindowChildClass") == 0 &&
|
|
|
|
!lpWindowName &&
|
2024-06-01 07:41:03 +02:00
|
|
|
dwStyle == (WS_CHILD | WS_CHILDWINDOW | WS_CLIPSIBLINGS) &&
|
2024-06-01 06:30:00 +02:00
|
|
|
!X &&
|
|
|
|
!Y &&
|
|
|
|
g_ddraw.ref && g_ddraw.width && g_ddraw.width == nWidth && g_ddraw.height == nHeight &&
|
|
|
|
g_ddraw.hwnd && hWndParent == g_ddraw.hwnd &&
|
2024-06-01 07:29:48 +02:00
|
|
|
!hMenu &&
|
|
|
|
!g_config.game_section[0])
|
2024-06-01 06:30:00 +02:00
|
|
|
{
|
|
|
|
dwExStyle = WS_EX_TRANSPARENT;
|
|
|
|
g_config.lock_mouse_top_left = TRUE;
|
|
|
|
g_config.adjmouse = FALSE;
|
|
|
|
dd_SetDisplayMode(0, 0, 0, 0);
|
|
|
|
}
|
|
|
|
|
2024-06-01 02:20:21 +02:00
|
|
|
/* The American Girls Dress Designer */
|
2024-06-01 06:30:00 +02:00
|
|
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AfxFrameOrView42s") == 0 &&
|
2024-06-01 02:20:21 +02:00
|
|
|
g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd &&
|
|
|
|
g_config.fake_mode[0] &&
|
|
|
|
(dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD))
|
|
|
|
{
|
|
|
|
dwStyle &= ~WS_POPUP;
|
|
|
|
}
|
|
|
|
|
2023-08-30 21:45:49 +02:00
|
|
|
/* Center Claw DVD movies */
|
2024-06-01 06:30:00 +02:00
|
|
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 &&
|
2024-06-05 00:04:35 +02:00
|
|
|
g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd &&
|
|
|
|
g_ddraw.width &&
|
2023-09-06 20:06:03 +02:00
|
|
|
(dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD))
|
2023-08-30 21:45:49 +02:00
|
|
|
{
|
2024-06-05 00:04:35 +02:00
|
|
|
//dwStyle &= ~WS_POPUP;
|
|
|
|
//dwExStyle = WS_EX_TRANSPARENT;
|
|
|
|
|
2023-08-30 21:45:49 +02:00
|
|
|
POINT pt = { 0, 0 };
|
2024-03-22 22:27:00 +01:00
|
|
|
real_ClientToScreen(g_ddraw.hwnd, &pt);
|
2023-08-30 21:45:49 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
int added_height = g_ddraw.render.height - g_ddraw.height;
|
|
|
|
int added_width = g_ddraw.render.width - g_ddraw.width;
|
2023-08-30 21:45:49 +02:00
|
|
|
int align_y = added_height > 0 ? added_height / 2 : 0;
|
|
|
|
int align_x = added_width > 0 ? added_width / 2 : 0;
|
|
|
|
|
|
|
|
X = pt.x + align_x;
|
|
|
|
Y = pt.y + align_y;
|
|
|
|
}
|
|
|
|
|
2024-04-26 01:13:50 +02:00
|
|
|
/* Road Rash movies */
|
2024-06-05 00:04:35 +02:00
|
|
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AVI Window") == 0 &&
|
2024-04-26 01:13:50 +02:00
|
|
|
g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width &&
|
|
|
|
(dwStyle & WS_POPUP))
|
|
|
|
{
|
|
|
|
dwStyle = WS_CHILD;
|
|
|
|
hWndParent = g_ddraw.hwnd;
|
|
|
|
}
|
|
|
|
|
2021-09-09 03:49:54 +02:00
|
|
|
/* Fix for SMACKW32.DLL creating another window that steals the focus */
|
2024-03-22 22:27:00 +01:00
|
|
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw.ref && g_ddraw.hwnd)
|
2021-09-09 03:49:54 +02:00
|
|
|
{
|
|
|
|
dwStyle &= ~WS_VISIBLE;
|
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw.ref && g_ddraw.hwnd)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_ddraw.bnet_active)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.bnet_was_upscaled = g_config.fullscreen;
|
2023-09-22 00:38:42 +02:00
|
|
|
g_config.fullscreen = FALSE;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
if (!g_config.windowed && !g_ddraw.bnet_was_fullscreen)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
|
|
|
int ws = g_config.window_state;
|
|
|
|
util_toggle_fullscreen();
|
|
|
|
g_config.window_state = ws;
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.bnet_was_fullscreen = TRUE;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
real_GetClientRect(g_ddraw.hwnd, &g_ddraw.bnet_win_rect);
|
|
|
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw.bnet_win_rect, 2);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left;
|
|
|
|
int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top;
|
2020-10-13 21:58:04 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
int x = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.x : -32000;
|
|
|
|
int y = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.y : -32000;
|
2020-10-13 21:58:04 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
int dst_width = g_config.window_rect.right ? g_ddraw.width : 0;
|
|
|
|
int dst_height = g_config.window_rect.bottom ? g_ddraw.height : 0;
|
2021-11-05 15:23:35 +01:00
|
|
|
|
|
|
|
util_set_window_rect(x, y, dst_width, dst_height, flags);
|
2023-09-22 00:38:42 +02:00
|
|
|
g_config.resizable = FALSE;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
g_ddraw.bnet_active = TRUE;
|
2020-10-13 09:20:52 +02:00
|
|
|
mouse_unlock();
|
2024-05-22 04:38:10 +02:00
|
|
|
ReleaseCapture();
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
POINT pt = { 0, 0 };
|
2024-03-22 22:27:00 +01:00
|
|
|
real_ClientToScreen(g_ddraw.hwnd, &pt);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2024-03-22 22:27:00 +01:00
|
|
|
int added_height = g_ddraw.height - 480;
|
|
|
|
int added_width = g_ddraw.width - 640;
|
2021-11-05 21:04:12 +01:00
|
|
|
int align_y = added_height > 0 ? added_height / 2 : 0;
|
|
|
|
int align_x = added_width > 0 ? added_width / 2 : 0;
|
|
|
|
|
|
|
|
X += pt.x + align_x;
|
|
|
|
Y += pt.y + align_y;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
dwStyle |= WS_CLIPCHILDREN;
|
|
|
|
}
|
|
|
|
|
2024-04-16 02:48:15 +02:00
|
|
|
/* Limit window size to max surface size (Dune2000 1.02) */
|
|
|
|
if (dwStyle & WS_POPUP)
|
|
|
|
{
|
2024-04-16 03:11:33 +02:00
|
|
|
if (nWidth != CW_USEDEFAULT)
|
|
|
|
{
|
|
|
|
nWidth = min(nWidth, 16384);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nHeight != CW_USEDEFAULT)
|
|
|
|
{
|
|
|
|
nHeight = min(nHeight, 16384);
|
|
|
|
}
|
2024-04-16 02:48:15 +02:00
|
|
|
}
|
|
|
|
|
2024-05-25 03:30:51 +02:00
|
|
|
HWND hwnd = real_CreateWindowExA(
|
2020-10-13 09:20:52 +02:00
|
|
|
dwExStyle,
|
|
|
|
lpClassName,
|
|
|
|
lpWindowName,
|
|
|
|
dwStyle,
|
|
|
|
X,
|
|
|
|
Y,
|
|
|
|
nWidth,
|
|
|
|
nHeight,
|
|
|
|
hWndParent,
|
|
|
|
hMenu,
|
|
|
|
hInstance,
|
|
|
|
lpParam);
|
2024-05-25 03:30:51 +02:00
|
|
|
|
2024-07-14 07:59:39 +02:00
|
|
|
/* Age Of Empires 2 textbox align */
|
2024-07-14 07:21:07 +02:00
|
|
|
if (!dwExStyle &&
|
|
|
|
HIWORD(lpClassName) && _strcmpi(lpClassName, "edit") == 0 &&
|
|
|
|
!lpWindowName &&
|
|
|
|
g_ddraw.ref && g_ddraw.width &&
|
|
|
|
g_ddraw.hwnd && hWndParent == g_ddraw.hwnd &&
|
2024-07-18 01:50:31 +02:00
|
|
|
(int)hMenu == 1)
|
2024-07-14 07:21:07 +02:00
|
|
|
{
|
|
|
|
g_ddraw.textbox.hwnd = hwnd;
|
|
|
|
}
|
|
|
|
|
2024-05-25 03:30:51 +02:00
|
|
|
TRACE("<- CreateWindowExA(hwnd=%p)\n", hwnd);
|
|
|
|
|
|
|
|
return hwnd;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-08-02 17:27:19 +02:00
|
|
|
|
|
|
|
HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv)
|
|
|
|
{
|
2023-08-02 15:15:44 +02:00
|
|
|
if (rclsid && riid)
|
2021-08-02 17:27:19 +02:00
|
|
|
{
|
2024-06-16 05:37:11 +02:00
|
|
|
TRACE(
|
|
|
|
"CoCreateInstance rclsid = %08X, riid = %08X [%p]\n",
|
|
|
|
((GUID*)rclsid)->Data1,
|
|
|
|
((GUID*)riid)->Data1,
|
|
|
|
_ReturnAddress());
|
2023-08-02 15:15:44 +02:00
|
|
|
|
|
|
|
if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid))
|
2021-08-02 17:27:19 +02:00
|
|
|
{
|
2023-08-10 11:32:43 +02:00
|
|
|
TRACE(" GUID = %08X (CLSID_DirectDrawX)\n", ((GUID*)rclsid)->Data1);
|
|
|
|
|
2023-08-02 15:15:44 +02:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
2023-08-10 11:32:43 +02:00
|
|
|
|
|
|
|
if (IsEqualGUID(&CLSID_DirectDrawClipper, rclsid))
|
|
|
|
{
|
|
|
|
TRACE(" GUID = %08X (CLSID_DirectDrawClipper)\n", ((GUID*)rclsid)->Data1);
|
|
|
|
|
|
|
|
if (IsEqualGUID(&IID_IDirectDrawClipper, riid))
|
|
|
|
{
|
|
|
|
return dd_CreateClipper(0, (IDirectDrawClipperImpl**)ppv, NULL);
|
|
|
|
}
|
|
|
|
}
|
2021-08-02 17:27:19 +02:00
|
|
|
}
|
|
|
|
|
2024-06-01 20:43:38 +02:00
|
|
|
/* These dlls must be hooked for cutscene uscaling and windowed mode */
|
|
|
|
HMODULE quartz_dll = GetModuleHandleA("quartz");
|
|
|
|
HMODULE msvfw32_dll = GetModuleHandleA("msvfw32");
|
|
|
|
|
|
|
|
HRESULT result = real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);
|
|
|
|
|
|
|
|
if ((!quartz_dll && GetModuleHandleA("quartz")) ||
|
|
|
|
(!msvfw32_dll && GetModuleHandleA("msvfw32")))
|
|
|
|
{
|
2024-06-02 22:17:26 +02:00
|
|
|
hook_init();
|
2024-06-01 20:43:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
2021-08-02 17:27:19 +02:00
|
|
|
}
|
2023-06-29 21:13:04 +02:00
|
|
|
|
2024-06-01 23:04:06 +02:00
|
|
|
MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam)
|
|
|
|
{
|
|
|
|
/* These dlls must be hooked for cutscene uscaling and windowed mode */
|
|
|
|
HMODULE quartz_dll = GetModuleHandleA("quartz");
|
|
|
|
HMODULE msvfw32_dll = GetModuleHandleA("msvfw32");
|
|
|
|
|
|
|
|
MCIERROR result = real_mciSendCommandA(IDDevice, uMsg, fdwCommand, dwParam);
|
|
|
|
|
|
|
|
if ((!quartz_dll && GetModuleHandleA("quartz")) ||
|
|
|
|
(!msvfw32_dll && GetModuleHandleA("msvfw32")))
|
|
|
|
{
|
2024-06-02 22:17:26 +02:00
|
|
|
hook_init();
|
2024-06-01 23:04:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-06-29 21:13:04 +02:00
|
|
|
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter(
|
|
|
|
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
|
|
|
|
{
|
|
|
|
LPTOP_LEVEL_EXCEPTION_FILTER old = g_dbg_exception_filter;
|
|
|
|
g_dbg_exception_filter = lpTopLevelExceptionFilter;
|
|
|
|
|
|
|
|
return old;
|
|
|
|
//return real_SetUnhandledExceptionFilter(lpTopLevelExceptionFilter);
|
|
|
|
}
|