[PATCH 4/5] user32: Check device name in EnumDisplayDevicesW().

Zhiyi Zhang zzhang at codeweavers.com
Thu Feb 21 03:05:22 CST 2019


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/user32/misc.c          | 28 ++++++++++++++++++++++++++++
 dlls/user32/tests/monitor.c |  2 +-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/dlls/user32/misc.c b/dlls/user32/misc.c
index 1a45e1c882..256a26c71b 100644
--- a/dlls/user32/misc.c
+++ b/dlls/user32/misc.c
@@ -276,12 +276,40 @@ BOOL WINAPI EnumDisplayDevicesA( LPCSTR lpDevice, DWORD i, LPDISPLAY_DEVICEA lpD
     return TRUE;
 }
 
+static BOOL is_display_device(LPCWSTR name)
+{
+    static const WCHAR display_deviceW[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y'};
+    const WCHAR *p = name;
+
+    if (strncmpiW(name, display_deviceW, ARRAY_SIZE(display_deviceW)))
+        return FALSE;
+
+    p += ARRAY_SIZE(display_deviceW);
+
+    if (!isdigitW(*p++))
+        return FALSE;
+
+    for (; *p; p++)
+    {
+        if (!isdigitW(*p))
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
 /***********************************************************************
  *		EnumDisplayDevicesW (USER32.@)
  */
 BOOL WINAPI EnumDisplayDevicesW( LPCWSTR lpDevice, DWORD i, LPDISPLAY_DEVICEW lpDisplayDevice,
                                  DWORD dwFlags )
 {
+    if (lpDevice && !is_display_device(lpDevice))
+    {
+        WARN("Wrong adapter name: %s\n", wine_dbgstr_w(lpDevice));
+        return FALSE;
+    }
+
     return USER_Driver->pEnumDisplayDevicesW(lpDevice, i, lpDisplayDevice, dwFlags);
 }
 
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 8bf284a5e1..733220a426 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -235,7 +235,7 @@ static void test_enumdisplaydevices(void)
     /* Doesn't accept \\.\DISPLAY */
     dd.cb = sizeof(dd);
     ret = pEnumDisplayDevicesA("\\\\.\\DISPLAY", 0, &dd, 0);
-    todo_wine ok(!ret, "Expect failure\n");
+    ok(!ret, "Expect failure\n");
 
     /* Enumeration */
     for (flag_index = 0; flag_index < ARRAY_SIZE(flags); flag_index++)
-- 
2.20.1





More information about the wine-devel mailing list