From b88857386e202cff1db5d6000b0d632b8ed9d422 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 18:07:16 +0200 Subject: [PATCH] add new "win_version" setting to fake the reported windows version --- inc/config.h | 1 + inc/hook.h | 4 ++ inc/winapi_hooks.h | 3 ++ src/config.c | 2 + src/hook.c | 4 ++ src/winapi_hooks.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 106 insertions(+) diff --git a/inc/config.h b/inc/config.h index 1140fe0..09c7e20 100644 --- a/inc/config.h +++ b/inc/config.h @@ -57,6 +57,7 @@ typedef struct CNCDDRAWCONFIG int fixchilds; BOOL hook_peekmessage; BOOL hook_getmessage; + char win_version[32]; /* Undocumented settings */ diff --git a/inc/hook.h b/inc/hook.h index cd1dab8..92301d4 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -70,6 +70,8 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); +typedef DWORD(WINAPI* GETVERSIONPROC)(void); +typedef BOOL(WINAPI* GETVERSIONEXAPROC)(LPOSVERSIONINFOA); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); @@ -120,6 +122,8 @@ extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern GETPROCADDRESSPROC real_GetProcAddress; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; +extern GETVERSIONPROC real_GetVersion; +extern GETVERSIONEXAPROC real_GetVersionExA; extern COCREATEINSTANCEPROC real_CoCreateInstance; extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6e2965d..fa5c635 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -72,6 +72,9 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); +DWORD WINAPI fake_GetVersion(void); +BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA lpVersionInformation); + 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); diff --git a/src/config.c b/src/config.c index 62c1938..9284f1d 100644 --- a/src/config.c +++ b/src/config.c @@ -69,6 +69,7 @@ void cfg_load() GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); + GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -323,6 +324,7 @@ static void cfg_create_ini() "lock_mouse_top_left=false\n" "no_compat_warning=false\n" "remove_menu=false\n" + ";win_version=95\n" "\n" "\n" "\n" diff --git a/src/hook.c b/src/hook.c index 378b4a0..c07f58a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -63,6 +63,8 @@ LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; +GETVERSIONPROC real_GetVersion = GetVersion; +GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; @@ -168,6 +170,8 @@ HOOKLIST g_hook_hooklist[] = { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, + { "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, HOOK_SKIP_2 }, + { "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, HOOK_SKIP_2 }, #if defined(_DEBUG) && defined(__GNUC__) { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, #endif diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index cd93961..76b4728 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1548,6 +1548,98 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( return result; } +DWORD WINAPI fake_GetVersion() +{ + if (_strcmpi(g_config.win_version, "95") == 0) + return 0xC3B60004; + + if (_strcmpi(g_config.win_version, "98") == 0) + return 0xC0000A04; + + if (_strcmpi(g_config.win_version, "nt4") == 0) + return 0x05650004; + + if (_strcmpi(g_config.win_version, "2000") == 0) + return 0x08930005; + + if (_strcmpi(g_config.win_version, "xp") == 0) + return 0x0A280105; + + return real_GetVersion(); +} + +BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA info) +{ + if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) + { + if (_strcmpi(g_config.win_version, "95") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 0, 950, 1, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "98") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 10, 67766446, 1, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "nt4") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 0, 1381, 2, "Service Pack 5" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "2000") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 5, 0, 2195, 2, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "xp") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 5, 1, 2600, 2, "Service Pack 3" }; + return TRUE; + } + } + + if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA)) + { + LPOSVERSIONINFOEXA ex = (LPOSVERSIONINFOEXA)info; + if (_strcmpi(g_config.win_version, "95") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 0, 950, 1, "", 1, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "98") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 10, 67766446, 1, "", 1, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "nt4") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 0, 1381, 2, "Service Pack 5", 5, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "2000") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 5, 0, 2195, 2, "", 0, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "xp") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 5, 1, 2600, 2, "Service Pack 3", 3, 0, 256, 1, 30 }; + return TRUE; + } + } + + return real_GetVersionExA(info); +} + BOOL WINAPI fake_DestroyWindow(HWND hWnd) { TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress());