From 1fb996d8a22c0c17e075f326aa376adc2a943cd8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Oct 2022 23:13:04 +0200 Subject: [PATCH] limit available resolutions to avoid crashes (Infantry Online) --- inc/dd.h | 1 + src/config.c | 3 +++ src/dd.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index ba8e2bf..88b5065 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -154,6 +154,7 @@ typedef struct CNCDDRAW BOOL d3d9on12; int guard_lines; int resolutions; + int max_resolutions; BOOL armadahack; BOOL tshack; BOOL infantryhack; diff --git a/src/config.c b/src/config.c index 8c59f64..81b3732 100644 --- a/src/config.c +++ b/src/config.c @@ -52,6 +52,7 @@ void cfg_load() g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); + g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); @@ -357,6 +358,7 @@ static void cfg_create_ini() "opengl_core=false\n" "d3d9on12=false\n" "guard_lines=200\n" + "max_resolutions=0\n" "game_handles_close=false\n" "accuratetimers=false\n" "fixpitch=true\n" @@ -789,6 +791,7 @@ static void cfg_create_ini() "devmode=true\n" "resolutions=2\n" "infantryhack=true\n" + "max_resolutions=90\n" "\n" "; Jagged Alliance 2\n" "[ja2]\n" diff --git a/src/dd.c b/src/dd.c index 7a5f5f6..997d5e2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -26,6 +26,7 @@ HRESULT dd_EnumDisplayModes( dbg_dump_edm_flags(dwFlags); DWORD i = 0; + DWORD res_count = 0; DDSURFACEDESC2 s; /* Some games crash when you feed them with too many resolutions so we have to keep the list short */ @@ -144,6 +145,12 @@ HRESULT dd_EnumDisplayModes( if (g_ddraw->bpp == 8 || g_ddraw->resolutions == RESLIST_FULL) { + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -160,6 +167,12 @@ HRESULT dd_EnumDisplayModes( if (g_ddraw->bpp == 16 || g_ddraw->resolutions == RESLIST_FULL) { + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -176,6 +189,12 @@ HRESULT dd_EnumDisplayModes( if (g_ddraw->bpp == 32 || g_ddraw->resolutions == RESLIST_FULL) { + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -233,6 +252,12 @@ HRESULT dd_EnumDisplayModes( s.dwWidth = resolutions[i].cx; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -246,6 +271,12 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwBBitMask = 0x001F; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -262,6 +293,12 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwBBitMask = 0x0000FF; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n");