[PATCH] Misc info.c fixes
Gerard Patel
gerard.patel at nerim.net
Sat Oct 27 14:52:53 CDT 2001
- always set the length of data written using RegSetValueEx
- avoids a crash when DriverName="" in the registry (in my setup
it was caused by the RegSetValueEx problem when called by the automatic
cups setup, but it could happen when setting the values manually as well)
- displays a warning when using builtin driver (32 bits) with a 16 bits
program
ChangeLog:
* dlls/winspool/info.c
Fix RegSetValueEx calls and crash when DriverName="" in registry.
-------------- next part --------------
Index: dlls/winspool/info.c
===================================================================
RCS file: /home/wine/wine/dlls/winspool/info.c,v
retrieving revision 1.45
diff -u -r1.45 info.c
--- dlls/winspool/info.c 2001/10/14 16:15:09 1.45
+++ dlls/winspool/info.c 2001/10/27 16:26:05
@@ -285,6 +285,12 @@
return hadprinter;
}
+static inline DWORD set_reg_szW(HKEY hkey, WCHAR *keyname, WCHAR *value)
+{
+ return RegSetValueExW(hkey, keyname, 0, REG_SZ, (LPBYTE)value,
+ lstrlenW(value) * sizeof(WCHAR));
+}
+
void
WINSPOOL_LoadSystemPrinters() {
HKEY hkPPD;
@@ -916,7 +922,9 @@
switch (ver.dwPlatformId) {
case VER_PLATFORM_WIN32s:
+ ERR("win32 style printing used with 16 bits app, try -winver win95\n");
return 0;
+
case VER_PLATFORM_WIN32_NT:
p = "Windows NT x86";
break;
@@ -1026,8 +1034,7 @@
}
RegSetValueExA(hkeyPrinter, "Attributes", 0, REG_DWORD,
(LPBYTE)&pi->Attributes, sizeof(DWORD));
- RegSetValueExW(hkeyPrinter, DatatypeW, 0, REG_SZ, (LPBYTE)pi->pDatatype,
- 0);
+ set_reg_szW(hkeyPrinter, DatatypeW, pi->pDatatype);
/* See if we can load the driver. We may need the devmode structure anyway
*
@@ -1065,24 +1072,18 @@
HeapFree(GetProcessHeap(), 0, dmA);
if(!pi->pDevMode)
HeapFree(GetProcessHeap(), 0, dmW);
- RegSetValueExW(hkeyPrinter, DescriptionW, 0, REG_SZ, (LPBYTE)pi->pComment,
- 0);
- RegSetValueExW(hkeyPrinter, LocationW, 0, REG_SZ, (LPBYTE)pi->pLocation,
- 0);
- RegSetValueExW(hkeyPrinter, NameW, 0, REG_SZ, (LPBYTE)pi->pPrinterName, 0);
- RegSetValueExW(hkeyPrinter, ParametersW, 0, REG_SZ,
- (LPBYTE)pi->pParameters, 0);
- RegSetValueExW(hkeyPrinter, PortW, 0, REG_SZ, (LPBYTE)pi->pPortName, 0);
- RegSetValueExW(hkeyPrinter, Print_ProcessorW, 0, REG_SZ,
- (LPBYTE)pi->pPrintProcessor, 0);
- RegSetValueExW(hkeyPrinter, Printer_DriverW, 0, REG_SZ,
- (LPBYTE)pi->pDriverName, 0);
+ set_reg_szW(hkeyPrinter, DescriptionW, pi->pComment);
+ set_reg_szW(hkeyPrinter, LocationW, pi->pLocation);
+ set_reg_szW(hkeyPrinter, NameW, pi->pPrinterName);
+ set_reg_szW(hkeyPrinter, ParametersW, pi->pParameters);
+
+ set_reg_szW(hkeyPrinter, PortW, pi->pPortName);
+ set_reg_szW(hkeyPrinter, Print_ProcessorW, pi->pPrintProcessor);
+ set_reg_szW(hkeyPrinter, Printer_DriverW, pi->pDriverName);
RegSetValueExA(hkeyPrinter, "Priority", 0, REG_DWORD,
(LPBYTE)&pi->Priority, sizeof(DWORD));
- RegSetValueExW(hkeyPrinter, Separator_FileW, 0, REG_SZ,
- (LPBYTE)pi->pSepFile, 0);
- RegSetValueExW(hkeyPrinter, Share_NameW, 0, REG_SZ, (LPBYTE)pi->pShareName,
- 0);
+ set_reg_szW(hkeyPrinter, Separator_FileW, pi->pSepFile);
+ set_reg_szW(hkeyPrinter, Share_NameW, pi->pShareName);
RegSetValueExA(hkeyPrinter, "StartTime", 0, REG_DWORD,
(LPBYTE)&pi->StartTime, sizeof(DWORD));
RegSetValueExA(hkeyPrinter, "Status", 0, REG_DWORD,
@@ -2092,8 +2093,8 @@
strPtr = (pDriverStrings) ? (pDriverStrings + (*pcbNeeded)) : NULL;
}
- if(RegOpenKeyW(hkeyDrivers, DriverName, &hkeyDriver) != ERROR_SUCCESS) {
- ERR("Can't find driver %s in registry\n", debugstr_w(DriverName));
+ if(!DriverName[0] || RegOpenKeyW(hkeyDrivers, DriverName, &hkeyDriver) != ERROR_SUCCESS) {
+ ERR("Can't find driver '%s' in registry\n", debugstr_w(DriverName));
SetLastError(ERROR_UNKNOWN_PRINTER_DRIVER); /* ? */
return FALSE;
}
@@ -2250,6 +2251,7 @@
return FALSE;
}
size = sizeof(DriverName);
+ DriverName[0] = 0;
ret = RegQueryValueExW(hkeyPrinter, Printer_DriverW, 0, &type,
(LPBYTE)DriverName, &size);
RegCloseKey(hkeyPrinter);
-------------- next part --------------
More information about the wine-patches
mailing list