From 7f50216c3817070a61a2dd2cdd170ffeee751a15 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 4 Sep 2011 14:42:08 +0000 Subject: [PATCH 1/1] [SERVICES] RStartServiceA: Convert the ANSI start arguments vector to a UNICODE vector and pass it to ScmStartService. Calls to StartServiceA can now be used to pass arguments to a starting service. svn path=/trunk/; revision=53579 --- reactos/base/system/services/rpcserver.c | 53 ++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index 6a7895992de..5f5e2d8d5e3 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -4086,6 +4086,9 @@ DWORD RStartServiceA( DWORD dwError = ERROR_SUCCESS; PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; + LPWSTR *lpVector = NULL; + DWORD i; + DWORD dwLength; DPRINT("RStartServiceA() called\n"); @@ -4119,12 +4122,56 @@ DWORD RStartServiceA( if (lpService->bDeleted) return ERROR_SERVICE_MARKED_FOR_DELETE; - /* FIXME: Convert argument vector to Unicode */ + /* Build a Unicode argument vector */ + if (argc > 0) + { + lpVector = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + argc * sizeof(LPWSTR)); + if (lpVector == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + for (i = 0; i < argc; i++) + { + dwLength = MultiByteToWideChar(CP_ACP, + 0, + ((LPSTR*)argv)[i], + -1, + NULL, + 0); + + lpVector[i] = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + dwLength * sizeof(WCHAR)); + if (lpVector[i] == NULL) + { + dwError = ERROR_NOT_ENOUGH_MEMORY; + goto done; + } + + MultiByteToWideChar(CP_ACP, + 0, + ((LPSTR*)argv)[i], + -1, + lpVector[i], + dwLength); + } + } /* Start the service */ - dwError = ScmStartService(lpService, 0, NULL); + dwError = ScmStartService(lpService, argc, lpVector); - /* FIXME: Free argument vector */ +done: + /* Free the Unicode argument vector */ + if (lpVector != NULL) + { + for (i = 0; i < argc; i++) + { + if (lpVector[i] != NULL) + HeapFree(GetProcessHeap(), 0, lpVector[i]); + } + HeapFree(GetProcessHeap(), 0, lpVector); + } return dwError; } -- 2.17.1