1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

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

@ -57,6 +57,7 @@ typedef struct CNCDDRAWCONFIG
int fixchilds;
BOOL hook_peekmessage;
BOOL hook_getmessage;
char win_version[32];
/* Undocumented settings */

View File

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

View File

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

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