Zhiyi Zhang : user32: Fix ChangeDisplaySettingsExW() minimum size check.

Alexandre Julliard julliard at winehq.org
Mon Feb 10 16:32:44 CST 2020


Module: wine
Branch: master
Commit: b5603287b7d6cc38e2a90840271deaf90c788a6e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b5603287b7d6cc38e2a90840271deaf90c788a6e

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Mon Feb 10 11:09:43 2020 +0800

user32: Fix ChangeDisplaySettingsExW() minimum size check.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/sysparams.c     | 16 ++++++----------
 dlls/user32/tests/monitor.c |  4 ++--
 2 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 0a0a2c70bd..a146f31071 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -3285,18 +3285,14 @@ LONG WINAPI ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode, HWND
     {
         trace_devmode(devmode);
 
-        /* This is the minimal dmSize that XP accepts */
-        if (devmode->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
-            return DISP_CHANGE_FAILED;
+        if (devmode->dmSize < FIELD_OFFSET(DEVMODEW, dmICMMethod))
+            return DISP_CHANGE_BADMODE;
 
-        if (devmode->dmSize >= FIELD_OFFSET(DEVMODEW, dmFields) + sizeof(devmode->dmFields))
-        {
-            if (((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel) ||
-                ((devmode->dmFields & DM_PELSWIDTH) && devmode->dmPelsWidth) ||
-                ((devmode->dmFields & DM_PELSHEIGHT) && devmode->dmPelsHeight) ||
-                ((devmode->dmFields & DM_DISPLAYFREQUENCY) && devmode->dmDisplayFrequency))
+        if (((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel) ||
+            ((devmode->dmFields & DM_PELSWIDTH) && devmode->dmPelsWidth) ||
+            ((devmode->dmFields & DM_PELSHEIGHT) && devmode->dmPelsHeight) ||
+            ((devmode->dmFields & DM_DISPLAYFREQUENCY) && devmode->dmDisplayFrequency))
                 def_mode = FALSE;
-        }
     }
 
     if (def_mode)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 03fd6f3ec3..e669b2b82e 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -401,11 +401,11 @@ static void test_ChangeDisplaySettingsEx(void)
 
     dmW.dmSize = FIELD_OFFSET(DEVMODEW, dmICMMethod) - 1;
     res = ChangeDisplaySettingsW(&dmW, CDS_TEST);
-    todo_wine ok(res == DISP_CHANGE_BADMODE, "ChangeDisplaySettingsW returned %d, expect DISP_CHANGE_BADMODE\n", res);
+    ok(res == DISP_CHANGE_BADMODE, "ChangeDisplaySettingsW returned %d, expect DISP_CHANGE_BADMODE\n", res);
 
     dmW.dmSize = FIELD_OFFSET(DEVMODEW, dmICMMethod) - 1;
     res = ChangeDisplaySettingsExW(NULL, &dmW, NULL, CDS_TEST, NULL);
-    todo_wine ok(res == DISP_CHANGE_BADMODE, "ChangeDisplaySettingsExW returned %d, expect DISP_CHANGE_BADMODE\n", res);
+    ok(res == DISP_CHANGE_BADMODE, "ChangeDisplaySettingsExW returned %d, expect DISP_CHANGE_BADMODE\n", res);
 
     dmW.dmSize = FIELD_OFFSET(DEVMODEW, dmICMMethod);
     res = ChangeDisplaySettingsW(&dmW, CDS_TEST);




More information about the wine-cvs mailing list