[PATCH v2 1/7] explorer: Create primary adapter key if user driver didn't create it.

Zhiyi Zhang zzhang at codeweavers.com
Wed Mar 6 02:42:46 CST 2019


This primary adapter key aims to replace the Atom mechanism currently
used to store what registry key the primary adapter is using.
This way we can let user drivers create the GUIDs for adapters if it's
supported without treating primary adapter differently.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
v2: Fix tests. Supersede 160033~160039. 

 dlls/user32/tests/monitor.c |  4 +--
 programs/explorer/desktop.c | 64 ++++++++++++++++++++++++++++---------
 2 files changed, 51 insertions(+), 17 deletions(-)

diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 8bf284a5e1..4f7e4c2287 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -107,7 +107,7 @@ static void test_enumdisplaydevices_adapter(int index, const DISPLAY_DEVICEA *de
     {
         sprintf(video_name, "\\Device\\Video%d", index);
         ls = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\VIDEO", 0, KEY_READ, &hkey);
-        todo_wine ok(!ls, "#%d: failed to open registry, error: %#x\n", index, ls);
+        ok(!ls, "#%d: failed to open registry, error: %#x\n", index, ls);
         if (!ls)
         {
             memset(video_value, 0, sizeof(video_value));
@@ -115,7 +115,7 @@ static void test_enumdisplaydevices_adapter(int index, const DISPLAY_DEVICEA *de
             ls = RegQueryValueExA(hkey, video_name, NULL, NULL, (unsigned char *)video_value, &size);
             ok(!ls, "#%d: failed to get registry value, error: %#x\n", index, ls);
             RegCloseKey(hkey);
-            ok(!strcmp(video_value, device->DeviceKey), "#%d: wrong DeviceKey: %s\n", index, device->DeviceKey);
+            todo_wine ok(!strcmp(video_value, device->DeviceKey), "#%d: wrong DeviceKey: %s\n", index, device->DeviceKey);
         }
     }
     else
diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index 27b9b24901..97fc7a219d 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -775,6 +775,13 @@ static BOOL get_default_enable_shell( const WCHAR *name )
 
 static HMODULE load_graphics_driver( const WCHAR *driver, const GUID *guid )
 {
+    static const WCHAR video_keyW[] = {'H','A','R','D','W','A','R','E','\\',
+                                       'D','E','V','I','C','E','M','A','P','\\',
+                                       'V','I','D','E','O',0};
+    static const WCHAR device_video0W[] = {'\\','D','e','v','i','c','e','\\',
+                                           'V','i','d','e','o','0',0};
+    static const WCHAR device_video_prefixW[] = {'\\','R','e','g','i','s','t','r','y','\\',
+                                                 'M','a','c','h','i','n','e','\\',0};
     static const WCHAR device_keyW[] = {
         'S','y','s','t','e','m','\\',
         'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
@@ -793,6 +800,7 @@ static HMODULE load_graphics_driver( const WCHAR *driver, const GUID *guid )
     WCHAR key[ARRAY_SIZE( device_keyW ) + 39];
     HMODULE module = 0;
     HKEY hkey;
+    DWORD disposition = 0;
     char error[80];
 
     if (!driver)
@@ -832,25 +840,51 @@ static HMODULE load_graphics_driver( const WCHAR *driver, const GUID *guid )
         name = next;
     }
 
-    if (module)
+    /* Create HKLM\HARDWARE\DEVICEMAP\VIDEO key if user drivers didn't do it */
+    if (!RegCreateKeyExW( HKEY_LOCAL_MACHINE, video_keyW, 0, NULL, REG_OPTION_VOLATILE, KEY_WRITE, NULL, &hkey,
+                          &disposition ))
     {
-        GetModuleFileNameW( module, buffer, MAX_PATH );
-        TRACE( "display %s driver %s\n", debugstr_guid(guid), debugstr_w(buffer) );
-    }
+        /* User driver did create it. Nothing to do */
+        if (disposition != REG_CREATED_NEW_KEY)
+        {
+            RegCloseKey( hkey );
+            return module;
+        }
 
-    sprintfW( key, device_keyW, guid->Data1, guid->Data2, guid->Data3,
-              guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
-              guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
+        sprintfW( key, device_keyW, guid->Data1, guid->Data2, guid->Data3,
+                  guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
+                  guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
+
+        strcpyW( buffer, device_video_prefixW );
+        strcatW( buffer, key);
+
+        TRACE( "primary adapter key %s\n", wine_dbgstr_w(buffer) );
+        /* Set \Device\Video0 value data in HKLM\HARDWARE\DEVICEMAP\VIDEO key */
+        if (RegSetValueExW( hkey, device_video0W, 0, REG_SZ,
+                            (const BYTE *)(buffer), (strlenW( buffer ) + 1) * sizeof(WCHAR)) )
+        {
+            ERR("Failed to set primary video value, display related functions may not function properly\n");
+            RegCloseKey( hkey );
+            return module;
+        }
 
-    if (!RegCreateKeyExW( HKEY_LOCAL_MACHINE, key, 0, NULL,
-                          REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hkey, NULL  ))
-    {
-        if (module)
-            RegSetValueExW( hkey, graphics_driverW, 0, REG_SZ,
-                            (BYTE *)buffer, (strlenW(buffer) + 1) * sizeof(WCHAR) );
-        else
-            RegSetValueExA( hkey, "DriverError", 0, REG_SZ, (BYTE *)error, strlen(error) + 1 );
         RegCloseKey( hkey );
+
+        /* Create primary adapter key SYSTEM\CurrentControlSet\Control\Video\{Primary adapter GUID}\0000 */
+        if (!RegCreateKeyExW( HKEY_LOCAL_MACHINE, key, 0, NULL,
+                              REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hkey, NULL ))
+        {
+            if (module)
+            {
+                GetModuleFileNameW( module, buffer, MAX_PATH );
+                TRACE( "display %s driver %s\n", debugstr_guid(guid), debugstr_w(buffer) );
+                RegSetValueExW( hkey, graphics_driverW, 0, REG_SZ,
+                                (BYTE *)buffer, (strlenW( buffer ) + 1) * sizeof(WCHAR) );
+            }
+            else
+                RegSetValueExA( hkey, "DriverError", 0, REG_SZ, (BYTE *)error, strlen( error ) + 1 );
+            RegCloseKey( hkey );
+        }
     }
 
     return module;
-- 
2.20.1





More information about the wine-devel mailing list