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