Null ascii to unicode conversions in winspool
Duane Clark
dclark at akamail.com
Thu Feb 6 15:00:59 CST 2003
How about this as a fix for winspool problems in the thread on
wine-devel, "Winspool errors with notepad".
http://www.winehq.com/hypermail/wine-devel/2003/02/0064.html
Changelog:
Winspool expects NULLs to be preserved in ascii to unicode conversions.
-------------- next part --------------
Index: dlls/winspool/info.c
===================================================================
RCS file: /home/wine/wine/dlls/winspool/info.c,v
retrieving revision 1.70
diff -u -r1.70 info.c
--- dlls/winspool/info.c 23 Jan 2003 23:07:39 -0000 1.70
+++ dlls/winspool/info.c 6 Feb 2003 20:52:05 -0000
@@ -104,6 +104,21 @@
DWORD Level, LPBYTE pDriverInfo,
DWORD cbBuf, LPDWORD pcbNeeded,
BOOL unicode);
+
+/* RtlCreateUnicodeStringFromAsciiz will return an empty string in the buffer
+ if passed a NULL string. This returns NULLs to the result.
+*/
+static inline PWSTR asciitounicode( UNICODE_STRING * usBufferPtr, LPCSTR src )
+{
+ if ( (src) )
+ {
+ RtlCreateUnicodeStringFromAsciiz(usBufferPtr, src);
+ return usBufferPtr->Buffer;
+ }
+ usBufferPtr->Buffer = NULL; /* so that RtlFreeUnicodeString won't barf */
+ return NULL;
+}
+
static void
WINSPOOL_SetDefaultPrinter(const char *devname, const char *name,BOOL force) {
char qbuf[200];
@@ -554,29 +569,18 @@
piW = HeapAlloc(heap, 0, sizeof(*piW));
memcpy(piW, piA, sizeof(*piW)); /* copy everything first */
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pServerName);
- piW->pServerName = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pPrinterName);
- piW->pPrinterName = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pShareName);
- piW->pShareName = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pPortName);
- piW->pPortName = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pDriverName);
- piW->pDriverName = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pComment);
- piW->pComment = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pLocation);
- piW->pLocation = usBuffer.Buffer;
+ piW->pServerName = asciitounicode(&usBuffer,piA->pServerName);
+ piW->pPrinterName = asciitounicode(&usBuffer,piA->pPrinterName);
+ piW->pShareName = asciitounicode(&usBuffer,piA->pShareName);
+ piW->pPortName = asciitounicode(&usBuffer,piA->pPortName);
+ piW->pDriverName = asciitounicode(&usBuffer,piA->pDriverName);
+ piW->pComment = asciitounicode(&usBuffer,piA->pComment);
+ piW->pLocation = asciitounicode(&usBuffer,piA->pLocation);
piW->pDevMode = DEVMODEdupAtoW(heap, piA->pDevMode);
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pSepFile);
- piW->pSepFile = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pPrintProcessor);
- piW->pPrintProcessor = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pDatatype);
- piW->pDatatype = usBuffer.Buffer;
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,piA->pParameters);
- piW->pParameters = usBuffer.Buffer;
+ piW->pSepFile = asciitounicode(&usBuffer,piA->pSepFile);
+ piW->pPrintProcessor = asciitounicode(&usBuffer,piA->pPrintProcessor);
+ piW->pDatatype = asciitounicode(&usBuffer,piA->pDatatype);
+ piW->pParameters = asciitounicode(&usBuffer,piA->pParameters);
return piW;
}
@@ -777,19 +781,19 @@
UNICODE_STRING lpPrinterNameW;
UNICODE_STRING usBuffer;
PRINTER_DEFAULTSW DefaultW, *pDefaultW = NULL;
+ PWSTR pwstrPrinterNameW;
BOOL ret;
- RtlCreateUnicodeStringFromAsciiz(&lpPrinterNameW,lpPrinterName);
+ pwstrPrinterNameW = asciitounicode(&lpPrinterNameW,lpPrinterName);
if(pDefault) {
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,pDefault->pDatatype);
- DefaultW.pDatatype = usBuffer.Buffer;
+ DefaultW.pDatatype = asciitounicode(&usBuffer,pDefault->pDatatype);
DefaultW.pDevMode = DEVMODEdupAtoW(GetProcessHeap(),
pDefault->pDevMode);
DefaultW.DesiredAccess = pDefault->DesiredAccess;
pDefaultW = &DefaultW;
}
- ret = OpenPrinterW(lpPrinterNameW.Buffer, phPrinter, pDefaultW);
+ ret = OpenPrinterW(pwstrPrinterNameW, phPrinter, pDefaultW);
if(pDefault) {
RtlFreeUnicodeString(&usBuffer);
HeapFree(GetProcessHeap(), 0, DefaultW.pDevMode);
@@ -1183,6 +1187,7 @@
HANDLE WINAPI AddPrinterA(LPSTR pName, DWORD Level, LPBYTE pPrinter)
{
UNICODE_STRING pNameW;
+ PWSTR pwstrNameW;
PRINTER_INFO_2W *piW;
PRINTER_INFO_2A *piA = (PRINTER_INFO_2A*)pPrinter;
HANDLE ret;
@@ -1193,10 +1198,10 @@
SetLastError(ERROR_INVALID_LEVEL);
return 0;
}
- RtlCreateUnicodeStringFromAsciiz(&pNameW,pName);
+ pwstrNameW = asciitounicode(&pNameW,pName);
piW = PRINTER_INFO_2AtoW(GetProcessHeap(), piA);
- ret = AddPrinterW(pNameW.Buffer, Level, (LPBYTE)piW);
+ ret = AddPrinterW(pwstrNameW, Level, (LPBYTE)piW);
FREE_PRINTER_INFO_2W(GetProcessHeap(), piW);
RtlFreeUnicodeString(&pNameW);
@@ -2166,8 +2171,11 @@
{
BOOL ret;
UNICODE_STRING lpszNameW;
+ PWSTR pwstrNameW;
+
RtlCreateUnicodeStringFromAsciiz(&lpszNameW,lpszName);
- ret = WINSPOOL_EnumPrinters(dwType, lpszNameW.Buffer, dwLevel, lpbPrinters, cbBuf,
+ pwstrNameW = asciitounicode(&lpszNameW,lpszName);
+ ret = WINSPOOL_EnumPrinters(dwType, pwstrNameW, dwLevel, lpbPrinters, cbBuf,
lpdwNeeded, lpdwReturned, FALSE);
RtlFreeUnicodeString(&lpszNameW);
return ret;
@@ -2440,8 +2448,10 @@
{
BOOL ret;
UNICODE_STRING pEnvW;
- RtlCreateUnicodeStringFromAsciiz(&pEnvW, pEnvironment);
- ret = WINSPOOL_GetPrinterDriver(hPrinter, pEnvW.Buffer, Level, pDriverInfo,
+ PWSTR pwstrEnvW;
+
+ pwstrEnvW = asciitounicode(&pEnvW, pEnvironment);
+ ret = WINSPOOL_GetPrinterDriver(hPrinter, pwstrEnvW, Level, pDriverInfo,
cbBuf, pcbNeeded, FALSE);
RtlFreeUnicodeString(&pEnvW);
return ret;
@@ -2816,19 +2826,16 @@
LPDWORD pcbNeeded, LPDWORD pcReturned)
{ BOOL ret;
UNICODE_STRING pNameW, pEnvironmentW;
+ PWSTR pwstrNameW, pwstrEnvironmentW;
- if(pName)
- RtlCreateUnicodeStringFromAsciiz(&pNameW, pName);
- if(pEnvironment)
- RtlCreateUnicodeStringFromAsciiz(&pEnvironmentW, pEnvironment);
+ pwstrNameW = asciitounicode(&pNameW, pName);
+ pwstrEnvironmentW = asciitounicode(&pEnvironmentW, pEnvironment);
- ret = WINSPOOL_EnumPrinterDrivers(pNameW.Buffer, pEnvironmentW.Buffer,
+ ret = WINSPOOL_EnumPrinterDrivers(pwstrNameW, pwstrEnvironmentW,
Level, pDriverInfo, cbBuf, pcbNeeded,
pcReturned, FALSE);
- if(pName)
- RtlFreeUnicodeString(&pNameW);
- if(pEnvironment)
- RtlFreeUnicodeString(&pEnvironmentW);
+ RtlFreeUnicodeString(&pNameW);
+ RtlFreeUnicodeString(&pEnvironmentW);
return ret;
}
More information about the wine-patches
mailing list