From: Piotr Caban piotr@codeweavers.com
--- dlls/winspool.drv/info.c | 2 +- dlls/winspool.drv/tests/info.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index e1cd0338207..d800eae159f 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -1889,7 +1889,7 @@ LONG WINAPI DocumentPropertiesW(HWND hWnd, HANDLE hPrinter, TRACE("(%p,%p,%s,%p,%p,%ld)\n", hWnd, hPrinter, debugstr_w(pDeviceName), pDevModeOutput, pDevModeInput, fMode);
- device = pDeviceName && pDeviceName[0] ? pDeviceName : get_opened_printer_name(hPrinter); + device = hPrinter ? get_opened_printer_name(hPrinter) : pDeviceName; if (!device) { ERR("no device name\n"); return -1; diff --git a/dlls/winspool.drv/tests/info.c b/dlls/winspool.drv/tests/info.c index f7464d9d696..47f602b7de3 100644 --- a/dlls/winspool.drv/tests/info.c +++ b/dlls/winspool.drv/tests/info.c @@ -2679,6 +2679,7 @@ static void test_DocumentProperties(void) LONG dm_size, ret; DEVMODEA *dm; char empty_str[] = ""; + char non_existing_str[] = "non existing printer";
if (!default_printer) { @@ -2707,6 +2708,9 @@ static void test_DocumentProperties(void) ret = DocumentPropertiesA(0, hprn, empty_str, dm, dm, DM_OUT_BUFFER); ok(ret == IDOK, "DocumentPropertiesA ret value %ld != expected IDOK\n", ret);
+ ret = DocumentPropertiesA(0, hprn, non_existing_str, dm, dm, DM_OUT_BUFFER); + ok(ret == IDOK, "DocumentPropertiesA ret value %ld != expected IDOK\n", ret); + test_DEVMODEA(dm, dm_size, default_printer);
HeapFree(GetProcessHeap(), 0, dm);
From: Piotr Caban piotr@codeweavers.com
--- 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;
This merge request was approved by Huw Davies.