Detlef Riekenberg : winspool: Support the spooler in GetPrinterData.

Alexandre Julliard julliard at winehq.org
Tue Jun 15 13:46:50 CDT 2010


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

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Tue Jun 15 17:25:16 2010 +0200

winspool: Support the spooler in GetPrinterData.

---

 dlls/winspool.drv/info.c |   78 ++++++++++++++++++++++++++++++---------------
 tools/wine.inf.in        |    1 +
 2 files changed, 53 insertions(+), 26 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 4993a78..3f97ebd 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -5354,27 +5354,40 @@ DWORD WINAPI GetPrinterDataExA(HANDLE hPrinter, LPCSTR pKeyName,
 			       LPCSTR pValueName, LPDWORD pType,
 			       LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded)
 {
-    HKEY hkeyPrinter, hkeySubkey;
+    opened_printer_t *printer;
+    HKEY hkeyPrinters, hkeyPrinter = 0, hkeySubkey = 0;
     DWORD ret;
 
-    TRACE("(%p, %s, %s %p, %p, %08x, %p)\n", hPrinter,
-	  debugstr_a(pKeyName), debugstr_a(pValueName), pType, pData, nSize,
-	  pcbNeeded);
+    TRACE("(%p, %s, %s, %p, %p, %u, %p)\n", hPrinter, debugstr_a(pKeyName),
+            debugstr_a(pValueName), pType, pData, nSize, pcbNeeded);
 
-    if((ret = WINSPOOL_GetOpenedPrinterRegKey(hPrinter, &hkeyPrinter))
-       != ERROR_SUCCESS)
-        return ret;
+    printer = get_opened_printer(hPrinter);
+    if(!printer) return ERROR_INVALID_HANDLE;
 
-    if((ret = RegOpenKeyA(hkeyPrinter, pKeyName, &hkeySubkey))
-       != ERROR_SUCCESS) {
-        WARN("Can't open subkey %s\n", debugstr_a(pKeyName));
-	RegCloseKey(hkeyPrinter);
-	return ret;
+    ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, PrintersW, &hkeyPrinters);
+    if (ret) return ret;
+
+    if (printer->name) {
+
+        ret = RegOpenKeyW(hkeyPrinters, printer->name, &hkeyPrinter);
+        if (ret) {
+            RegCloseKey(hkeyPrinters);
+            return ret;
+        }
+        if((ret = RegOpenKeyA(hkeyPrinter, pKeyName, &hkeySubkey)) != ERROR_SUCCESS) {
+            WARN("Can't open subkey %s: %d\n", debugstr_a(pKeyName), ret);
+            RegCloseKey(hkeyPrinter);
+            RegCloseKey(hkeyPrinters);
+            return ret;
+        }
     }
     *pcbNeeded = nSize;
-    ret = RegQueryValueExA(hkeySubkey, pValueName, 0, pType, pData, pcbNeeded);
+    ret = RegQueryValueExA(printer->name ? hkeySubkey : hkeyPrinters, pValueName,
+                          0, pType, pData, pcbNeeded);
+
     RegCloseKey(hkeySubkey);
     RegCloseKey(hkeyPrinter);
+    RegCloseKey(hkeyPrinters);
     return ret;
 }
 
@@ -5385,27 +5398,40 @@ DWORD WINAPI GetPrinterDataExW(HANDLE hPrinter, LPCWSTR pKeyName,
 			       LPCWSTR pValueName, LPDWORD pType,
 			       LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded)
 {
-    HKEY hkeyPrinter, hkeySubkey;
+    opened_printer_t *printer;
+    HKEY hkeyPrinters, hkeyPrinter = 0, hkeySubkey = 0;
     DWORD ret;
 
-    TRACE("(%p, %s, %s %p, %p, %08x, %p)\n", hPrinter,
-	  debugstr_w(pKeyName), debugstr_w(pValueName), pType, pData, nSize,
-	  pcbNeeded);
+    TRACE("(%p, %s, %s, %p, %p, %u, %p)\n", hPrinter, debugstr_w(pKeyName),
+            debugstr_w(pValueName), pType, pData, nSize, pcbNeeded);
 
-    if((ret = WINSPOOL_GetOpenedPrinterRegKey(hPrinter, &hkeyPrinter))
-       != ERROR_SUCCESS)
-        return ret;
+    printer = get_opened_printer(hPrinter);
+    if(!printer) return ERROR_INVALID_HANDLE;
 
-    if((ret = RegOpenKeyW(hkeyPrinter, pKeyName, &hkeySubkey))
-       != ERROR_SUCCESS) {
-        WARN("Can't open subkey %s\n", debugstr_w(pKeyName));
-	RegCloseKey(hkeyPrinter);
-	return ret;
+    ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, PrintersW, &hkeyPrinters);
+    if (ret) return ret;
+
+    if (printer->name) {
+
+        ret = RegOpenKeyW(hkeyPrinters, printer->name, &hkeyPrinter);
+        if (ret) {
+            RegCloseKey(hkeyPrinters);
+            return ret;
+        }
+        if((ret = RegOpenKeyW(hkeyPrinter, pKeyName, &hkeySubkey)) != ERROR_SUCCESS) {
+            WARN("Can't open subkey %s: %d\n", debugstr_w(pKeyName), ret);
+            RegCloseKey(hkeyPrinter);
+            RegCloseKey(hkeyPrinters);
+            return ret;
+        }
     }
     *pcbNeeded = nSize;
-    ret = RegQueryValueExW(hkeySubkey, pValueName, 0, pType, pData, pcbNeeded);
+    ret = RegQueryValueExW(printer->name ? hkeySubkey : hkeyPrinters, pValueName,
+                          0, pType, pData, pcbNeeded);
+
     RegCloseKey(hkeySubkey);
     RegCloseKey(hkeyPrinter);
+    RegCloseKey(hkeyPrinters);
     return ret;
 }
 
diff --git a/tools/wine.inf.in b/tools/wine.inf.in
index b8f4a82..63a78d2 100644
--- a/tools/wine.inf.in
+++ b/tools/wine.inf.in
@@ -1009,6 +1009,7 @@ HKLM,"Software\Microsoft\OLE","EnableRemoteConnect",,"N"
 
 [Printing]
 HKLM,%Control%\Print\Monitors\Local Port,"Driver",2,"localspl.dll"
+HKLM,%Control%\Print\Printers,"DefaultSpoolDirectory",2,"%11%\spool\printers"
 HKLM,%CurrentVersionNT%\Ports,"FILE:",,""
 HKLM,%CurrentVersionNT%\Ports,"LPT1:",,""
 HKLM,%CurrentVersionNT%\Ports,"LPT2:",,""




More information about the wine-cvs mailing list