ADVAPI32: implement ChangeServiceConfigA using ChangeServiceConfigW

Mike McCormack mike at codeweavers.com
Wed Oct 20 04:06:53 CDT 2004


ChangeLog:
* implement ChangeServiceConfigA using ChangeServiceConfigW
-------------- next part --------------
Index: dlls/advapi32/service.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/service.c,v
retrieving revision 1.60
diff -u -r1.60 service.c
--- dlls/advapi32/service.c	27 Sep 2004 20:35:27 -0000	1.60
+++ dlls/advapi32/service.c	20 Oct 2004 07:17:38 -0000
@@ -1455,6 +1455,51 @@
 }
 
 /******************************************************************************
+ * SERVICE_strdupAtoW  [INTERNAL]
+ */
+static LPWSTR SERVICE_strdupAtoW( LPCSTR str )
+{
+    DWORD len;
+    LPWSTR wstr;
+    if (str == NULL)
+        return NULL;
+    len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
+    wstr = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+    MultiByteToWideChar( CP_ACP, 0, str, -1, wstr, len );
+    return wstr;
+}
+
+/******************************************************************************
+ * SERVICE_strdupAtoW  [INTERNAL]
+ */
+static LPWSTR SERVICE_strdupMultiAtoW( LPCSTR str )
+{
+    DWORD lenA = 0, lenW;
+    LPWSTR wstr;
+
+    if (str == NULL)
+        return NULL;
+
+    while (str[lenA])
+        lenA += lstrlenA(&str[lenA]) + 1;
+    lenA++;
+    
+    lenW = MultiByteToWideChar( CP_ACP, 0, str, lenA, NULL, 0 );
+    wstr = HeapAlloc( GetProcessHeap(), 0, lenW*sizeof(WCHAR) );
+    MultiByteToWideChar( CP_ACP, 0, str, lenA, wstr, lenW );
+    return wstr;
+}
+
+/******************************************************************************
+ * SERVICE_StrFree  [INTERNAL]
+ */
+static VOID SERVICE_StrFree( LPWSTR str )
+{
+    if( str )
+        HeapFree(  GetProcessHeap(), 0, str );
+}
+
+/******************************************************************************
  * ChangeServiceConfigA  [ADVAPI32.@]
  */
 BOOL WINAPI ChangeServiceConfigA( SC_HANDLE hService, DWORD dwServiceType,
@@ -1462,12 +1507,36 @@
   LPCSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCSTR lpDependencies,
   LPCSTR lpServiceStartName, LPCSTR lpPassword, LPCSTR lpDisplayName)
 {
-    FIXME("%p %ld %ld %ld %s %s %p %p %s %s %s\n",
+    LPWSTR wBinaryPathName, wLoadOrderGroup, wDependencies;
+    LPWSTR wServiceStartName, wPassword, wDisplayName;
+    BOOL r;
+
+    TRACE("%p %ld %ld %ld %s %s %p %p %s %s %s\n",
           hService, dwServiceType, dwStartType, dwErrorControl, 
           debugstr_a(lpBinaryPathName), debugstr_a(lpLoadOrderGroup),
           lpdwTagId, lpDependencies, debugstr_a(lpServiceStartName),
           debugstr_a(lpPassword), debugstr_a(lpDisplayName) );
-    return TRUE;
+
+    wBinaryPathName = SERVICE_strdupAtoW( lpBinaryPathName );
+    wLoadOrderGroup = SERVICE_strdupAtoW( lpLoadOrderGroup );
+    wDependencies = SERVICE_strdupMultiAtoW( lpDependencies );
+    wServiceStartName = SERVICE_strdupAtoW( lpServiceStartName );
+    wPassword = SERVICE_strdupAtoW( lpPassword );
+    wDisplayName = SERVICE_strdupAtoW( lpDisplayName );
+
+    r = ChangeServiceConfigW( hService, dwServiceType,
+            dwStartType, dwErrorControl, wBinaryPathName,
+            wLoadOrderGroup, lpdwTagId, wDependencies,
+            wServiceStartName, wPassword, wDisplayName);
+
+    SERVICE_StrFree( wBinaryPathName );
+    SERVICE_StrFree( wLoadOrderGroup );
+    SERVICE_StrFree( wDependencies );
+    SERVICE_StrFree( wServiceStartName );
+    SERVICE_StrFree( wPassword );
+    SERVICE_StrFree( wDisplayName );
+
+    return r;
 }
 
 /******************************************************************************


More information about the wine-patches mailing list