[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