winspool: [3/5] Enable all levels for EnumPrinterDrivers + GetPrinterDriver

Detlef Riekenberg wine.dev at web.de
Thu Jul 26 17:02:34 CDT 2007


Changelog:
winspool: Enable all levels for EnumPrinterDrivers + GetPrinterDriver


Level 7 is not found in the native winspool.h and not found on the net.


-- 
 
By by ... Detlef

-------------- next part --------------
>From 695ec4a1ce0b0d305fd851e06356b5acee927a15 Mon Sep 17 00:00:00 2001
From: Detlef Riekenberg <wine.dev at web.de>
Date: Thu, 26 Jul 2007 23:14:55 +0200
Subject: [PATCH] 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 78a2896..d9fa673 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -245,6 +245,10 @@ static const WCHAR LPR_Port[] = {'L','P'
 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_GetDriverInfoFromRe
           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(HA
     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(HA
 	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(
     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(
     /* 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;
-- 
1.4.1



More information about the wine-patches mailing list