From 2a8a5f85ec865578d2c58e1519581e82e00f4a61 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Oct 2022 12:19:15 +0200 Subject: [PATCH] hook SetDIBitsToDevice --- inc/hook.h | 3 +++ inc/winapi_hooks.h | 14 +++----------- src/hook.c | 2 ++ src/winapi_hooks.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 22c64a6..733deeb 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -35,6 +35,8 @@ typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); +typedef int (WINAPI* SETDIBITSTODEVICEPROC)( + HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); @@ -67,6 +69,7 @@ extern DESTROYWINDOWPROC real_DestroyWindow; extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; extern STRETCHBLTPROC real_StretchBlt; +extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern LOADLIBRARYAPROC real_LoadLibraryA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 9e7f82f..e97bb24 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -30,17 +30,9 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); 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); + HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); +int WINAPI fake_SetDIBitsToDevice( + HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); diff --git a/src/hook.c b/src/hook.c index 17cfe3f..185565b 100644 --- a/src/hook.c +++ b/src/hook.c @@ -41,6 +41,7 @@ DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; +SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; @@ -84,6 +85,7 @@ static HOOKLIST g_hooks[] = "gdi32.dll", { { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 | SKIP_HOOK3 }, + { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 | SKIP_HOOK3 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, SKIP_HOOK3 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1dec7f9..761f1dd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -598,6 +598,54 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); } +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) +{ + if (g_ddraw && WindowFromDC(hdc) == g_ddraw->hwnd) + { + if (g_ddraw->primary) + { + HDC primary_dc; + dds_GetDC(g_ddraw->primary, &primary_dc); + + if (primary_dc) + { + BOOL result = + real_SetDIBitsToDevice( + primary_dc, + xDest, + yDest, + w, + h, + xSrc, + ySrc, + StartScan, + cLines, + lpvBits, + lpbmi, + ColorUse); + + dds_ReleaseDC(g_ddraw->primary, primary_dc); + + return result; + } + } + } + + return real_SetDIBitsToDevice(hdc, xDest, yDest, w, h, xSrc, ySrc, StartScan, cLines, lpvBits, lpbmi, ColorUse); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName);