[ros-diffs] [hpoussin] 23519: Call ScmrStartServiceW in StartServiceA to prevent code duplicating between ScmrStartServiceA/W in services.exe

hpoussin at svn.reactos.org hpoussin at svn.reactos.org
Mon Aug 7 19:04:50 CEST 2006


Author: hpoussin
Date: Mon Aug  7 21:04:48 2006
New Revision: 23519

URL: http://svn.reactos.org/svn/reactos?rev=23519&view=rev
Log:
Call ScmrStartServiceW in StartServiceA to prevent code duplicating between ScmrStartServiceA/W in services.exe

Modified:
    trunk/reactos/base/system/services/rpcserver.c
    trunk/reactos/dll/win32/advapi32/service/scm.c

Modified: trunk/reactos/base/system/services/rpcserver.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/rpcserver.c?rev=23519&r1=23518&r2=23519&view=diff
==============================================================================
--- trunk/reactos/base/system/services/rpcserver.c (original)
+++ trunk/reactos/base/system/services/rpcserver.c Mon Aug  7 21:04:48 2006
@@ -2094,8 +2094,7 @@
                   unsigned long cbBufSize)
 {
     DPRINT1("ScmrStartServiceA() called\n");
-    return ERROR_SUCCESS;
-//    return ERROR_CALL_NOT_IMPLEMENTED;
+    return ERROR_CALL_NOT_IMPLEMENTED;
 }
 
 

Modified: trunk/reactos/dll/win32/advapi32/service/scm.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/service/scm.c?rev=23519&r1=23518&r2=23519&view=diff
==============================================================================
--- trunk/reactos/dll/win32/advapi32/service/scm.c (original)
+++ trunk/reactos/dll/win32/advapi32/service/scm.c Mon Aug  7 21:04:48 2006
@@ -1970,16 +1970,16 @@
               DWORD dwNumServiceArgs,
               LPCSTR *lpServiceArgVectors)
 {
-    LPSTR lpBuffer;
-    LPSTR lpStr;
+    LPWSTR lpBuffer;
+    LPWSTR lpStr;
     DWORD dwError;
     DWORD dwBufSize;
-    DWORD i;
+    DWORD i, step;
 
     dwBufSize = 0;
     for (i = 0; i < dwNumServiceArgs; i++)
     {
-        dwBufSize += (strlen(lpServiceArgVectors[i]) + 1);
+        dwBufSize += MultiByteToWideChar(CP_ACP, 0, lpServiceArgVectors[i], -1, NULL, 0);
     }
     DPRINT1("dwBufSize: %lu\n", dwBufSize);
 
@@ -1993,64 +1993,12 @@
     lpStr = lpBuffer;
     for (i = 0; i < dwNumServiceArgs; i++)
     {
-        strcpy(lpStr, lpServiceArgVectors[i]);
-        lpStr += (strlen(lpServiceArgVectors[i]) + 1);
-    }
-
-    dwError = ScmrStartServiceA(BindingHandle,
-                                (unsigned int)hService,
-                                dwNumServiceArgs,
-                                (unsigned char *)lpBuffer,
-                                dwBufSize);
-
-    HeapFree(GetProcessHeap(), 0, lpBuffer);
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        DPRINT1("ScmrStartServiceA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  StartServiceW
- *
- * @implemented
- */
-BOOL STDCALL
-StartServiceW(SC_HANDLE hService,
-              DWORD dwNumServiceArgs,
-              LPCWSTR *lpServiceArgVectors)
-{
-    LPWSTR lpBuffer;
-    LPWSTR lpStr;
-    DWORD dwError;
-    DWORD dwBufSize;
-    DWORD i;
-
-    dwBufSize = 0;
-    for (i = 0; i < dwNumServiceArgs; i++)
-    {
-        dwBufSize += ((wcslen(lpServiceArgVectors[i]) + 1) * sizeof(WCHAR));
-    }
-    DPRINT1("dwBufSize: %lu\n", dwBufSize);
-
-    lpBuffer = HeapAlloc(GetProcessHeap(), 0, dwBufSize);
-    if (lpBuffer == NULL)
-    {
-        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-        return FALSE;
-    }
-
-    lpStr = lpBuffer;
-    for (i = 0; i < dwNumServiceArgs; i++)
-    {
-        wcscpy(lpStr, lpServiceArgVectors[i]);
-        lpStr += (wcslen(lpServiceArgVectors[i]) + 1);
+        step = MultiByteToWideChar(CP_ACP, 0,
+            lpServiceArgVectors[i], -1,
+            lpStr, lpBuffer + dwBufSize - lpStr);
+        if (step == 0)
+            return FALSE;
+        lpStr += step + 1;
     }
 
     dwError = ScmrStartServiceW(BindingHandle,
@@ -2073,6 +2021,62 @@
 
 
 /**********************************************************************
+ *  StartServiceW
+ *
+ * @implemented
+ */
+BOOL STDCALL
+StartServiceW(SC_HANDLE hService,
+              DWORD dwNumServiceArgs,
+              LPCWSTR *lpServiceArgVectors)
+{
+    LPWSTR lpBuffer;
+    LPWSTR lpStr;
+    DWORD dwError;
+    DWORD dwBufSize;
+    DWORD i;
+
+    dwBufSize = 0;
+    for (i = 0; i < dwNumServiceArgs; i++)
+    {
+        dwBufSize += ((wcslen(lpServiceArgVectors[i]) + 1) * sizeof(WCHAR));
+    }
+    DPRINT1("dwBufSize: %lu\n", dwBufSize);
+
+    lpBuffer = HeapAlloc(GetProcessHeap(), 0, dwBufSize);
+    if (lpBuffer == NULL)
+    {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return FALSE;
+    }
+
+    lpStr = lpBuffer;
+    for (i = 0; i < dwNumServiceArgs; i++)
+    {
+        wcscpy(lpStr, lpServiceArgVectors[i]);
+        lpStr += (wcslen(lpServiceArgVectors[i]) + 1);
+    }
+
+    dwError = ScmrStartServiceW(BindingHandle,
+                                (unsigned int)hService,
+                                dwNumServiceArgs,
+                                (unsigned char *)lpBuffer,
+                                dwBufSize);
+
+    HeapFree(GetProcessHeap(), 0, lpBuffer);
+
+    if (dwError != ERROR_SUCCESS)
+    {
+        DPRINT1("ScmrStartServiceW() failed (Error %lu)\n", dwError);
+        SetLastError(dwError);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/**********************************************************************
  *  UnlockServiceDatabase
  *
  * @implemented




More information about the Ros-diffs mailing list