Zhiyi Zhang : user32: Handle NULL device parameter in EnumDisplaySettingsExW().

Alexandre Julliard julliard at winehq.org
Wed Feb 12 16:21:07 CST 2020


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

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Tue Feb 11 16:08:38 2020 +0800

user32: Handle NULL device parameter in EnumDisplaySettingsExW().

This makes sure that user graphics drivers always have a valid device name.

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

---

 dlls/user32/sysparams.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index a146f31071..e3919ad1b1 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -567,6 +567,24 @@ RECT get_virtual_screen_rect(void)
     return info.virtual_rect;
 }
 
+static BOOL get_primary_adapter(WCHAR *name)
+{
+    DISPLAY_DEVICEW dd;
+    DWORD i;
+
+    dd.cb = sizeof(dd);
+    for (i = 0; EnumDisplayDevicesW(NULL, i, &dd, 0); ++i)
+    {
+        if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
+        {
+            lstrcpyW(name, dd.DeviceName);
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
 /* get text metrics and/or "average" char width of the specified logfont 
  * for the specified dc */
 static void get_text_metr_size( HDC hdc, LOGFONTW *plf, TEXTMETRICW * ptm, UINT *psz)
@@ -3394,6 +3412,18 @@ BOOL WINAPI EnumDisplaySettingsExA(LPCSTR lpszDeviceName, DWORD iModeNum,
 BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum,
                                    LPDEVMODEW lpDevMode, DWORD dwFlags)
 {
+    WCHAR primary_adapter[CCHDEVICENAME];
+
+    TRACE("%s %u %p %#x\n", wine_dbgstr_w(lpszDeviceName), iModeNum, lpDevMode, dwFlags);
+
+    if (!lpszDeviceName)
+    {
+        if (!get_primary_adapter(primary_adapter))
+            return FALSE;
+
+        lpszDeviceName = primary_adapter;
+    }
+
     return USER_Driver->pEnumDisplaySettingsEx(lpszDeviceName, iModeNum, lpDevMode, dwFlags);
 }
 




More information about the wine-cvs mailing list