ADVAPI32: don't use RtlCreateUnicodeStringFromAsciiz, it doesn't preserve NULL

Mike McCormack mike at codeweavers.com
Fri Dec 24 04:31:20 CST 2004


This patch removes use of RtlCreateUnicodeStringFromAsciiz, as it 
doesn't preserve NULL properly and we already use an A->W macro function 
elsewhere in this file.

Mike


ChangeLog:
* don't use RtlCreateUnicodeStringFromAsciiz, it doesn't preserve NULL
-------------- next part --------------
Index: dlls/advapi32/service.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/service.c,v
retrieving revision 1.76
diff -u -r1.76 service.c
--- dlls/advapi32/service.c	23 Dec 2004 18:24:50 -0000	1.76
+++ dlls/advapi32/service.c	24 Dec 2004 10:27:20 -0000
@@ -646,12 +646,12 @@
 RegisterServiceCtrlHandlerA( LPCSTR lpServiceName,
                              LPHANDLER_FUNCTION lpfHandler )
 {
-    UNICODE_STRING lpServiceNameW;
+    LPWSTR lpServiceNameW;
     SERVICE_STATUS_HANDLE ret;
 
-    RtlCreateUnicodeStringFromAsciiz (&lpServiceNameW,lpServiceName);
-    ret = RegisterServiceCtrlHandlerW( lpServiceNameW.Buffer, lpfHandler );
-    RtlFreeUnicodeString(&lpServiceNameW);
+    lpServiceNameW = SERV_dup(lpServiceName);
+    ret = RegisterServiceCtrlHandlerW( lpServiceNameW, lpfHandler );
+    SERV_free(lpServiceNameW);
     return ret;
 }
 
@@ -721,15 +721,14 @@
 SC_HANDLE WINAPI OpenSCManagerA( LPCSTR lpMachineName, LPCSTR lpDatabaseName,
                                  DWORD dwDesiredAccess )
 {
-    UNICODE_STRING lpMachineNameW;
-    UNICODE_STRING lpDatabaseNameW;
+    LPWSTR lpMachineNameW, lpDatabaseNameW;
     SC_HANDLE ret;
 
-    RtlCreateUnicodeStringFromAsciiz (&lpMachineNameW,lpMachineName);
-    RtlCreateUnicodeStringFromAsciiz (&lpDatabaseNameW,lpDatabaseName);
-    ret = OpenSCManagerW(lpMachineNameW.Buffer,lpDatabaseNameW.Buffer, dwDesiredAccess);
-    RtlFreeUnicodeString(&lpDatabaseNameW);
-    RtlFreeUnicodeString(&lpMachineNameW);
+    lpMachineNameW = SERV_dup(lpMachineName);
+    lpDatabaseNameW = SERV_dup(lpDatabaseName);
+    ret = OpenSCManagerW(lpMachineNameW, lpDatabaseNameW, dwDesiredAccess);
+    SERV_free(lpDatabaseNameW);
+    SERV_free(lpMachineNameW);
     return ret;
 }
 
@@ -932,15 +931,14 @@
 SC_HANDLE WINAPI OpenServiceA( SC_HANDLE hSCManager, LPCSTR lpServiceName,
                                DWORD dwDesiredAccess )
 {
-    UNICODE_STRING lpServiceNameW;
+    LPWSTR lpServiceNameW;
     SC_HANDLE ret;
-    RtlCreateUnicodeStringFromAsciiz (&lpServiceNameW,lpServiceName);
-    if(lpServiceName)
-        TRACE("Request for service %s\n",lpServiceName);
-    else
-        return FALSE;
-    ret = OpenServiceW( hSCManager, lpServiceNameW.Buffer, dwDesiredAccess);
-    RtlFreeUnicodeString(&lpServiceNameW);
+
+    TRACE("%p %s %ld\n",hSCManager, debugstr_a(lpServiceName), dwDesiredAccess);
+
+    lpServiceNameW = SERV_dup(lpServiceName);
+    ret = OpenServiceW( hSCManager, lpServiceNameW, dwDesiredAccess);
+    SERV_free(lpServiceNameW);
     return ret;
 }
 
@@ -958,8 +956,13 @@
     HKEY hKey;
     long r;
 
-    TRACE("(%p,%p,%ld)\n",hSCManager, lpServiceName,
-          dwDesiredAccess);
+    TRACE("%p %s %ld\n",hSCManager, debugstr_w(lpServiceName), dwDesiredAccess);
+
+    if (!lpServiceName)
+    {
+        SetLastError(ERROR_INVALID_ADDRESS);
+        return NULL;
+    }
 
     retval = alloc_sc_handle( SC_HTYPE_SERVICE );
     if( NULL == retval )
@@ -1208,29 +1211,23 @@
                  LPCSTR *lpServiceArgVectors )
 {
     LPWSTR *lpwstr=NULL;
-    UNICODE_STRING usBuffer;
     unsigned int i;
 
     TRACE("(%p,%ld,%p)\n",hService,dwNumServiceArgs,lpServiceArgVectors);
 
     if(dwNumServiceArgs)
-        lpwstr = (LPWSTR*) HeapAlloc( GetProcessHeap(), 0,
+        lpwstr = HeapAlloc( GetProcessHeap(), 0,
                                    dwNumServiceArgs*sizeof(LPWSTR) );
-    else
-        lpwstr = NULL;
 
     for(i=0; i<dwNumServiceArgs; i++)
-    {
-        RtlCreateUnicodeStringFromAsciiz (&usBuffer,lpServiceArgVectors[i]);
-        lpwstr[i]=usBuffer.Buffer;
-    }
+        lpwstr[i]=SERV_dup(lpServiceArgVectors[i]);
 
     StartServiceW(hService, dwNumServiceArgs, (LPCWSTR *)lpwstr);
 
     if(dwNumServiceArgs)
     {
         for(i=0; i<dwNumServiceArgs; i++)
-            HeapFree(GetProcessHeap(), 0, lpwstr[i]);
+            SERV_free(lpwstr[i]);
         HeapFree(GetProcessHeap(), 0, lpwstr);
     }
 


More information about the wine-patches mailing list