1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-25 01:57:47 +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; int fixchilds;
BOOL hook_peekmessage; BOOL hook_peekmessage;
BOOL hook_getmessage; BOOL hook_getmessage;
char win_version[32];
/* Undocumented settings */ /* Undocumented settings */

View File

@ -70,6 +70,8 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD);
typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD);
typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR);
typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); 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 HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*);
typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR);
typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER);
@ -120,6 +122,8 @@ extern LOADLIBRARYEXAPROC real_LoadLibraryExA;
extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern LOADLIBRARYEXWPROC real_LoadLibraryExW;
extern GETPROCADDRESSPROC real_GetProcAddress; extern GETPROCADDRESSPROC real_GetProcAddress;
extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA;
extern GETVERSIONPROC real_GetVersion;
extern GETVERSIONEXAPROC real_GetVersionExA;
extern COCREATEINSTANCEPROC real_CoCreateInstance; extern COCREATEINSTANCEPROC real_CoCreateInstance;
extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern MCISENDCOMMANDAPROC real_mciSendCommandA;
extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter;

View File

@ -72,6 +72,9 @@ BOOL WINAPI fake_GetDiskFreeSpaceA(
LPDWORD lpNumberOfFreeClusters, LPDWORD lpNumberOfFreeClusters,
LPDWORD lpTotalNumberOfClusters); LPDWORD lpTotalNumberOfClusters);
DWORD WINAPI fake_GetVersion(void);
BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA lpVersionInformation);
HWND WINAPI fake_CreateWindowExA( HWND WINAPI fake_CreateWindowExA(
DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y,
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); 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_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT);
GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE);
GET_BOOL(g_config.hook_getmessage, "hook_getmessage", 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 */ /* Undocumented settings */
@ -323,6 +324,7 @@ static void cfg_create_ini()
"lock_mouse_top_left=false\n" "lock_mouse_top_left=false\n"
"no_compat_warning=false\n" "no_compat_warning=false\n"
"remove_menu=false\n" "remove_menu=false\n"
";win_version=95\n"
"\n" "\n"
"\n" "\n"
"\n" "\n"

View File

@ -63,6 +63,8 @@ LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA;
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress;
GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA;
GETVERSIONPROC real_GetVersion = GetVersion;
GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA;
COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance;
MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA;
SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter;
@ -168,6 +170,8 @@ HOOKLIST g_hook_hooklist[] =
{ "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 },
{ "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 },
{ "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, 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__) #if defined(_DEBUG) && defined(__GNUC__)
{ "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 },
#endif #endif

View File

@ -1548,6 +1548,98 @@ BOOL WINAPI fake_GetDiskFreeSpaceA(
return result; 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) BOOL WINAPI fake_DestroyWindow(HWND hWnd)
{ {
TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress()); TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress());