Jacek Caban : user32: Allow using null driver as a normal graphics driver.

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


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Feb 11 20:45:27 2020 +0100

user32: Allow using null driver as a normal graphics driver.

When explicitly requested by config, Wine will use null driver in the
same way as we allow using it for invisible winstations.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/driver.c        | 33 +++++++++++++++++----------------
 programs/explorer/desktop.c | 10 +++++++++-
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index 66b26ca51a..07be6a9a4a 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -41,7 +41,7 @@ static char driver_load_error[80];
 
 static BOOL CDECL nodrv_CreateWindow( HWND hwnd );
 
-static HMODULE load_desktop_driver( HWND hwnd )
+static BOOL load_desktop_driver( HWND hwnd, HMODULE *module )
 {
     static const WCHAR display_device_guid_propW[] = {
         '_','_','w','i','n','e','_','d','i','s','p','l','a','y','_',
@@ -53,7 +53,8 @@ static HMODULE load_desktop_driver( HWND hwnd )
         'V','i','d','e','o','\\','{',0};
     static const WCHAR displayW[] = {'}','\\','0','0','0','0',0};
     static const WCHAR driverW[] = {'G','r','a','p','h','i','c','s','D','r','i','v','e','r',0};
-    HMODULE ret = 0;
+    static const WCHAR nullW[] = {'n','u','l','l',0};
+    BOOL ret = FALSE;
     HKEY hkey;
     DWORD size;
     WCHAR path[MAX_PATH];
@@ -76,8 +77,9 @@ static HMODULE load_desktop_driver( HWND hwnd )
     size = sizeof(path);
     if (!RegQueryValueExW( hkey, driverW, NULL, NULL, (BYTE *)path, &size ))
     {
-        if (!(ret = LoadLibraryW( path ))) ERR( "failed to load %s\n", debugstr_w(path) );
-        TRACE( "%s %p\n", debugstr_w(path), ret );
+        ret = !strcmpW( path, nullW ) || (*module = LoadLibraryW( path ));
+        if (!ret) ERR( "failed to load %s\n", debugstr_w(path) );
+        TRACE( "%s %p\n", debugstr_w(path), *module );
     }
     else
     {
@@ -98,8 +100,17 @@ static const USER_DRIVER *load_driver(void)
     driver = HeapAlloc( GetProcessHeap(), 0, sizeof(*driver) );
     *driver = null_driver;
 
-    graphics_driver = load_desktop_driver( GetDesktopWindow() );
-    if (graphics_driver)
+    if (!load_desktop_driver( GetDesktopWindow(), &graphics_driver ))
+    {
+        USEROBJECTFLAGS flags;
+        HWINSTA winstation;
+
+        winstation = GetProcessWindowStation();
+        if (!GetUserObjectInformationA(winstation, UOI_FLAGS, &flags, sizeof(flags), NULL)
+            || (flags.dwFlags & WSF_VISIBLE))
+            driver->pCreateWindow = nodrv_CreateWindow;
+    }
+    else if (graphics_driver)
     {
 #define GET_USER_FUNC(name) \
     do { if ((ptr = GetProcAddress( graphics_driver, #name ))) driver->p##name = ptr; } while(0)
@@ -153,16 +164,6 @@ static const USER_DRIVER *load_driver(void)
         GET_USER_FUNC(ThreadDetach);
 #undef GET_USER_FUNC
     }
-    else
-    {
-        USEROBJECTFLAGS flags;
-        HWINSTA winstation;
-
-        winstation = GetProcessWindowStation();
-        if (!GetUserObjectInformationA(winstation, UOI_FLAGS, &flags, sizeof(flags), NULL)
-            || (flags.dwFlags & WSF_VISIBLE))
-            driver->pCreateWindow = nodrv_CreateWindow;
-    }
 
     prev = InterlockedCompareExchangePointer( (void **)&USER_Driver, driver, &lazy_load_driver );
     if (prev != &lazy_load_driver)
diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index d4925f7c5b..bac17dcc5f 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -766,6 +766,7 @@ static HMODULE load_graphics_driver( const WCHAR *driver, const GUID *guid )
 
     WCHAR buffer[MAX_PATH], libname[32], *name, *next;
     WCHAR key[ARRAY_SIZE( device_keyW ) + 39];
+    BOOL null_driver = FALSE;
     HMODULE module = 0;
     HKEY hkey;
     char error[80];
@@ -790,6 +791,13 @@ static HMODULE load_graphics_driver( const WCHAR *driver, const GUID *guid )
         next = wcschr( name, ',' );
         if (next) *next++ = 0;
 
+        if (!wcscmp( name, L"null" ))
+        {
+            TRACE( "display %s using null driver\n", debugstr_guid(guid) );
+            null_driver = TRUE;
+            break;
+        }
+
         swprintf( libname, ARRAY_SIZE( libname ), drv_formatW, name );
         if ((module = LoadLibraryW( libname )) != 0) break;
         switch (GetLastError())
@@ -820,7 +828,7 @@ static HMODULE load_graphics_driver( const WCHAR *driver, const GUID *guid )
     if (!RegCreateKeyExW( HKEY_LOCAL_MACHINE, key, 0, NULL,
                           REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hkey, NULL  ))
     {
-        if (module)
+        if (module || null_driver)
             RegSetValueExW( hkey, graphics_driverW, 0, REG_SZ,
                             (BYTE *)buffer, (lstrlenW(buffer) + 1) * sizeof(WCHAR) );
         else




More information about the wine-cvs mailing list