[PATCH 6/6] user32: Initialize the cache with the default display devices.

Rémi Bernon rbernon at codeweavers.com
Mon Oct 18 06:31:52 CDT 2021


So that we have a list of default devices even without the
L"HARDWARE\\DEVICEMAP\\VIDEO" registry key, which the null driver
doesn't create.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/user32/sysparams.c | 76 +++++++++++++----------------------------
 1 file changed, 24 insertions(+), 52 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 2266e88b710..0ef38ba02c5 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -107,9 +107,21 @@ DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, 0x233a9ef3, 0xafc4, 0x4ab
 
 #define NULLDRV_DEFAULT_HMONITOR ((HMONITOR)(UINT_PTR)(0x10000 + 1))
 
-/* Cached display device information */
-static DISPLAY_DEVICEW display_devices[512];
-static DISPLAY_DEVICEW *display_devices_end = display_devices;
+/* Cached display device information, initialized with the default adapter and monitor */
+static DISPLAY_DEVICEW display_devices[512] =
+{
+    {.cb = sizeof(DISPLAY_DEVICEW), .DeviceName = L"\\\\.\\DISPLAY1", .DeviceString = L"Wine Default Adapter",
+     .StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP|DISPLAY_DEVICE_PRIMARY_DEVICE|DISPLAY_DEVICE_VGA_COMPATIBLE,
+     .DeviceID = L"PCI\\VEN_0000&DEV_0000&SUBSYS_00000000&REV_00",
+     .DeviceKey = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\{8ef18ecd-e56e-419f-8d7d-9991dd40b7f7}\\0000",
+    },
+    {.cb = sizeof(DISPLAY_DEVICEW), .DeviceName = L"\\\\.\\DISPLAY1\\Monitor0", .DeviceString = L"Generic Non-PnP Monitor",
+     .StateFlags = DISPLAY_DEVICE_ATTACHED|DISPLAY_DEVICE_ACTIVE,
+     .DeviceID = L"\\\\?\\DISPLAY#Default_Monitor#0000&0000#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}",
+     .DeviceKey = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\{4d36e96e-e325-11ce-bfc1-08002be10318}\\0000",
+    },
+};
+static DISPLAY_DEVICEW *display_devices_end = display_devices + 2;
 
 static FILETIME last_query_display_time;
 static CRITICAL_SECTION display_section;
@@ -3815,23 +3827,22 @@ HMONITOR WINAPI MonitorFromWindow(HWND hWnd, DWORD dwFlags)
 }
 
 /* Return FALSE on failure and TRUE on success */
-static BOOL update_display_cache(void)
+static void update_display_cache(void)
 {
     DISPLAY_DEVICEW *adapter, *device;
     DWORD adapter_idx, monitor_idx;
     FILETIME filetime = {0};
     HANDLE mutex = NULL;
-    BOOL ret = FALSE;
 
     /* Update display cache from SetupAPI if it's outdated */
     wait_graphics_driver_ready();
 
     if (!video_key && RegOpenKeyW( HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\VIDEO", &video_key ))
-        return FALSE;
+        return;
     if (RegQueryInfoKeyW( video_key, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &filetime ))
-        return FALSE;
+        return;
     if (CompareFileTime( &filetime, &last_query_display_time ) < 1)
-        return TRUE;
+        return;
 
     mutex = get_display_device_init_mutex();
     EnterCriticalSection( &display_section );
@@ -3849,13 +3860,13 @@ static BOOL update_display_cache(void)
     }
     if (device == display_devices + ARRAY_SIZE(display_devices))
         FIXME( "More than %u display devices detected, ignoring.\n", ARRAY_SIZE(display_devices) );
-    display_devices_end = device;
+
+    if (device != display_devices) display_devices_end = device;
+    else WARN( "No display devices detected, keeping default devices.\n" );
 
     last_query_display_time = filetime;
-    ret = TRUE;
     LeaveCriticalSection( &display_section );
     release_display_device_init_mutex( mutex );
-    return ret;
 }
 
 /* Return FALSE on failure and TRUE on success */
@@ -4199,8 +4210,7 @@ BOOL WINAPI EnumDisplayDevicesW( const WCHAR *devname, DWORD index, DISPLAY_DEVI
 
     TRACE( "devname %s, index %u, info %p, flags %#x\n", debugstr_w(devname), index, info, flags );
 
-    if (!update_display_cache())
-        return FALSE;
+    update_display_cache();
 
     EnterCriticalSection( &display_section );
     /* Enumerate adapters */
@@ -4263,7 +4273,6 @@ static BOOL enum_display_device( WCHAR *device, DWORD index, DISPLAY_DEVICEW *in
     WCHAR *next_charW;
     DWORD size;
     DWORD type;
-    HKEY hkey;
     BOOL ret = FALSE;
 
     /* Find adapter */
@@ -4371,44 +4380,7 @@ static BOOL enum_display_device( WCHAR *device, DWORD index, DISPLAY_DEVICEW *in
     ret = TRUE;
 done:
     SetupDiDestroyDeviceInfoList( set );
-    if (ret)
-        return ret;
-
-    /* Fallback to report at least one adapter and monitor, if user driver didn't initialize display device registry */
-    if (index)
-        return FALSE;
-
-    /* If user driver did initialize the registry, then exit */
-    if (!RegOpenKeyW( HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\VIDEO", &hkey ))
-    {
-        RegCloseKey( hkey );
-        return FALSE;
-    }
-    WARN("Reporting fallback display devices\n");
-
-    /* Adapter */
-    if (!device)
-    {
-        lstrcpyW( info->DeviceName, L"\\\\.\\DISPLAY1" );
-        lstrcpyW( info->DeviceString, L"Wine Adapter" );
-        info->StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE;
-        lstrcpyW( info->DeviceID, L"PCI\\VEN_0000&DEV_0000&SUBSYS_00000000&REV_00" );
-        lstrcpyW( info->DeviceKey, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\{71c91c84-1064-400f-a994-95e3ff2716d6}\\0000" );
-    }
-    /* Monitor */
-    else
-    {
-        if (lstrcmpiW( L"\\\\.\\DISPLAY1", device ))
-            return FALSE;
-
-        lstrcpyW( info->DeviceName, L"\\\\.\\DISPLAY1\\Monitor0" );
-        lstrcpyW( info->DeviceString, L"Generic Non-PnP Monitor" );
-        info->StateFlags = DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED;
-        lstrcpyW( info->DeviceID, L"\\\\\?\\DISPLAY#Default_Monitor#4&17f0ff54&0&UID0#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}" );
-        lstrcpyW( info->DeviceKey, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\{4d36e96e-e325-11ce-bfc1-08002be10318}\\0000" );
-    }
-
-    return TRUE;
+    return ret;
 }
 
 /**********************************************************************
-- 
2.33.0




More information about the wine-devel mailing list