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