add new "win_version" setting to fake the reported windows version

This commit is contained in:
FunkyFr3sh 2024-09-03 18:07:16 +02:00
parent f4ca7973eb
commit b88857386e
6 changed files with 106 additions and 0 deletions

View file

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

View file

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

View file

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