Detlef Riekenberg : winspool: Enable all levels for EnumPrinterDrivers + GetPrinterDriver.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 27 07:34:46 CDT 2007


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

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Thu Jul 26 23:14:55 2007 +0200

winspool: Enable all levels for EnumPrinterDrivers + GetPrinterDriver.

---

 dlls/winspool.drv/info.c |   54 ++++++++++-----------------------------------
 1 files changed, 12 insertions(+), 42 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 9e4414b..0c735d3 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -245,6 +245,10 @@ static const WCHAR LPR_Port[] = {'L','P','R',':',0};
 static const WCHAR default_doc_title[] = {'L','o','c','a','l',' ','D','o','w','n','l','e','v','e','l',' ',
                                           'D','o','c','u','m','e','n','t',0};
 
+static const DWORD di_sizeof[] = {0, sizeof(DRIVER_INFO_1W), sizeof(DRIVER_INFO_2W),
+                                     sizeof(DRIVER_INFO_3W), sizeof(DRIVER_INFO_4W),
+                                     sizeof(DRIVER_INFO_5W), sizeof(DRIVER_INFO_6W),
+                                  0, sizeof(DRIVER_INFO_8W)};
 
 /******************************************************************
  *  validate the user-supplied printing-environment [internal]
@@ -4371,6 +4375,8 @@ static BOOL WINSPOOL_GetDriverInfoFromReg(
           debugstr_w(DriverName), env,
           Level, di, pDriverStrings, cbBuf, unicode);
 
+    if (di) ZeroMemory(di, di_sizeof[Level]);
+
     if (unicode) {
         *pcbNeeded = (lstrlenW(DriverName) + 1) * sizeof(WCHAR);
         if (*pcbNeeded <= cbBuf)
@@ -4540,14 +4546,13 @@ static BOOL WINSPOOL_GetPrinterDriver(HANDLE hPrinter, LPCWSTR pEnvironment,
     TRACE("(%p,%s,%d,%p,%d,%p)\n",hPrinter,debugstr_w(pEnvironment),
 	  Level,pDriverInfo,cbBuf, pcbNeeded);
 
-    ZeroMemory(pDriverInfo, cbBuf);
 
     if (!(name = get_opened_printer_name(hPrinter))) {
         SetLastError(ERROR_INVALID_HANDLE);
         return FALSE;
     }
 
-    if(Level < 1 || Level > 6) {
+    if (Level < 1 || Level == 7 || Level > 8) {
         SetLastError(ERROR_INVALID_LEVEL);
         return FALSE;
     }
@@ -4584,36 +4589,12 @@ static BOOL WINSPOOL_GetPrinterDriver(HANDLE hPrinter, LPCWSTR pEnvironment,
 	return FALSE;
     }
 
-    switch(Level) {
-    case 1:
-        size = sizeof(DRIVER_INFO_1W);
-	break;
-    case 2:
-        size = sizeof(DRIVER_INFO_2W);
-	break;
-    case 3:
-        size = sizeof(DRIVER_INFO_3W);
-	break;
-    case 4:
-        size = sizeof(DRIVER_INFO_4W);
-	break;
-    case 5:
-        size = sizeof(DRIVER_INFO_5W);
-	break;
-    case 6:
-        size = sizeof(DRIVER_INFO_6W);
-	break;
-    default:
-        ERR("Invalid level\n");
-	return FALSE;
-    }
-
-    if(size <= cbBuf)
+    size = di_sizeof[Level];
+    if ((size <= cbBuf) && pDriverInfo)
         ptr = pDriverInfo + size;
 
     if(!WINSPOOL_GetDriverInfoFromReg(hkeyDrivers, DriverName,
-                         env, Level, pDriverInfo,
-                         (cbBuf < size) ? NULL : ptr,
+                         env, Level, pDriverInfo, ptr,
                          (cbBuf < size) ? 0 : cbBuf - size,
                          &needed, unicode)) {
             RegCloseKey(hkeyDrivers);
@@ -5044,8 +5025,7 @@ static BOOL WINSPOOL_EnumPrinterDrivers(LPWSTR pName, LPCWSTR pEnvironment,
     if (!env) return FALSE;     /* SetLastError() is in validate_envW */
 
     /* check input parameter */
-    if((Level < 1) || (Level > 3)) {
-        ERR("unsupported level %d\n", Level);
+    if ((Level < 1) || (Level == 7) || (Level > 8)) {
         SetLastError(ERROR_INVALID_LEVEL);
         return FALSE;
     }
@@ -5073,17 +5053,7 @@ static BOOL WINSPOOL_EnumPrinterDrivers(LPWSTR pName, LPCWSTR pEnvironment,
     /* get size of single struct
      * unicode and ascii structure have the same size
      */
-    switch (Level) {
-        case 1:
-            size = sizeof(DRIVER_INFO_1A);
-            break;
-        case 2:
-            size = sizeof(DRIVER_INFO_2A);
-            break;
-        case 3:
-            size = sizeof(DRIVER_INFO_3A);
-            break;
-    }
+    size = di_sizeof[Level];
 
     /* calculate required buffer size */
     *pcbNeeded = size * number;




More information about the wine-cvs mailing list