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