Piotr Caban : winspool.drv: Fix get_config_module when printer and driver names differ.

Alexandre Julliard julliard at winehq.org
Tue Aug 16 16:00:59 CDT 2022


Module: wine
Branch: master
Commit: 26c95858a18de555bd56cffb64f8902d5b88a18d
URL:    https://gitlab.winehq.org/wine/wine/-/commit/26c95858a18de555bd56cffb64f8902d5b88a18d

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Aug 15 21:13:17 2022 +0200

winspool.drv: Fix get_config_module when printer and driver names differ.

---

 dlls/winspool.drv/info.c | 89 ++++++++++++++++++++++++++++++------------------
 1 file changed, 56 insertions(+), 33 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index d800eae159f..3806384ee08 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -374,6 +374,30 @@ static HKEY WINSPOOL_OpenDriverReg(const void *pEnvironment)
     return retval;
 }
 
+enum printers_key
+{
+    system_printers_key,
+    user_printers_key,
+    user_ports_key,
+    user_default_key,
+};
+
+static DWORD create_printers_reg_key( enum printers_key type, HKEY *key )
+{
+    switch( type )
+    {
+    case system_printers_key:
+        return RegCreateKeyW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Print\\Printers", key );
+    case user_printers_key:
+        return RegCreateKeyW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Devices", key );
+    case user_ports_key:
+        return RegCreateKeyW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\PrinterPorts", key );
+    case user_default_key:
+        return RegCreateKeyW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows", key );
+    }
+    return ERROR_PATH_NOT_FOUND;
+}
+
 static CRITICAL_SECTION config_modules_cs;
 static CRITICAL_SECTION_DEBUG config_modules_cs_debug =
 {
@@ -400,13 +424,13 @@ static void release_config_module(config_module_t *config_module)
 
 static config_module_t *get_config_module(const WCHAR *device, BOOL grab)
 {
-    WCHAR driver[MAX_PATH];
+    WCHAR driver_name[100], driver[MAX_PATH];
     DWORD size, len;
-    HKEY driver_key, device_key;
+    HKEY printers_key, printer_key, drivers_key, driver_key;
     HMODULE driver_module;
     config_module_t *ret = NULL;
     struct wine_rb_entry *entry;
-    DWORD type;
+    DWORD r, type;
     LSTATUS res;
 
     EnterCriticalSection(&config_modules_cs);
@@ -418,15 +442,38 @@ static config_module_t *get_config_module(const WCHAR *device, BOOL grab)
     }
     if (!grab) goto ret;
 
-    if (!(driver_key = WINSPOOL_OpenDriverReg(NULL))) goto ret;
+    if (create_printers_reg_key(system_printers_key, &printers_key))
+    {
+        ERR("Can't create Printers key\n");
+        goto ret;
+    }
 
-    res = RegOpenKeyW(driver_key, device, &device_key);
-    RegCloseKey(driver_key);
-    if (res) {
+    r = RegOpenKeyW(printers_key, device, &printer_key);
+    RegCloseKey(printers_key);
+    if (r)
+    {
         WARN("Device %s key not found\n", debugstr_w(device));
         goto ret;
     }
 
+    size = sizeof(driver_name);
+    r = RegQueryValueExW(printer_key, L"Printer Driver", 0, &type, (BYTE *)driver_name, &size);
+    RegCloseKey(printer_key);
+    if (r || type != REG_SZ)
+    {
+        WARN("Can't get Printer Driver name\n");
+        goto ret;
+    }
+
+    if (!(drivers_key = WINSPOOL_OpenDriverReg(NULL))) goto ret;
+
+    res = RegOpenKeyW(drivers_key, driver_name, &driver_key);
+    RegCloseKey(drivers_key);
+    if (res) {
+        WARN("Driver %s key not found\n", debugstr_w(driver_name));
+        goto ret;
+    }
+
     size = sizeof(driver);
     if (!GetPrinterDriverDirectoryW(NULL, NULL, 1, (LPBYTE)driver, size, &size)) goto ret;
 
@@ -435,9 +482,9 @@ static config_module_t *get_config_module(const WCHAR *device, BOOL grab)
     driver[len++] = '3';
     driver[len++] = '\\';
     size = sizeof(driver) - len * sizeof(WCHAR);
-    res = RegQueryValueExW( device_key, L"Configuration File", NULL, &type,
+    res = RegQueryValueExW( driver_key, L"Configuration File", NULL, &type,
                             (BYTE *)(driver + len), &size );
-    RegCloseKey(device_key);
+    RegCloseKey(driver_key);
     if (res || type != REG_SZ) {
         WARN("no configuration file: %lu\n", res);
         goto ret;
@@ -553,30 +600,6 @@ static HANDLE get_backend_handle( HANDLE hprn )
     return printer->backend_printer;
 }
 
-enum printers_key
-{
-    system_printers_key,
-    user_printers_key,
-    user_ports_key,
-    user_default_key,
-};
-
-static DWORD create_printers_reg_key( enum printers_key type, HKEY *key )
-{
-    switch( type )
-    {
-    case system_printers_key:
-        return RegCreateKeyW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Print\\Printers", key );
-    case user_printers_key:
-        return RegCreateKeyW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Devices", key );
-    case user_ports_key:
-        return RegCreateKeyW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\PrinterPorts", key );
-    case user_default_key:
-        return RegCreateKeyW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows", key );
-    }
-    return ERROR_PATH_NOT_FOUND;
-}
-
 static DWORD open_printer_reg_key( const WCHAR *name, HKEY *key )
 {
     HKEY printers;




More information about the wine-cvs mailing list