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