Index: reactos/dll/win32/advapi32/service/sctrl.c =================================================================== --- dll/win32/advapi32/service/sctrl.c (revision 67916) +++ dll/win32/advapi32/service/sctrl.c (working copy) @@ -287,9 +287,9 @@ LPWSTR **lpArgVector) { LPWSTR *lpVector; - LPWSTR *lpArg; LPWSTR pszServiceName; DWORD cbServiceName; + DWORD cbArguments; DWORD cbTotal; DWORD i; @@ -304,7 +304,10 @@ cbTotal = cbServiceName + sizeof(LPWSTR); if (ControlPacket->dwArgumentsCount > 0) - cbTotal += ControlPacket->dwSize - ControlPacket->dwArgumentsOffset; + { + cbArguments = ControlPacket->dwSize - ControlPacket->dwArgumentsOffset; + cbTotal += cbArguments; + } lpVector = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, @@ -312,26 +315,22 @@ if (lpVector == NULL) return ERROR_OUTOFMEMORY; - lpArg = lpVector; - *lpArg = (LPWSTR)(lpArg + 1); - lpArg++; - - memcpy(lpArg, pszServiceName, cbServiceName); - lpArg = (LPWSTR*)((ULONG_PTR)lpArg + cbServiceName); - if (ControlPacket->dwArgumentsCount > 0) { - memcpy(lpArg, + memcpy(&lpVector[1], ((PBYTE)ControlPacket + ControlPacket->dwArgumentsOffset), - ControlPacket->dwSize - ControlPacket->dwArgumentsOffset); + cbArguments); for (i = 0; i < ControlPacket->dwArgumentsCount; i++) { - *lpArg = (LPWSTR)((ULONG_PTR)lpArg + (ULONG_PTR)*lpArg); - lpArg++; + lpVector[i + 1] = (LPWSTR)((PBYTE)&lpVector[i + 1] + (ULONG_PTR)lpVector[i + 1]); } } + lpVector[0] = (PWSTR)((PBYTE)&lpVector[1] + cbArguments); + ASSERT((PBYTE)lpVector[0] + cbServiceName == (PBYTE)lpVector + cbTotal); + memcpy(lpVector[0], pszServiceName, cbServiceName); + *lpArgCount = ControlPacket->dwArgumentsCount + 1; *lpArgVector = lpVector; @@ -344,17 +343,12 @@ LPDWORD lpArgCount, LPSTR **lpArgVector) { + DWORD Error; + DWORD ArgCount; LPSTR *lpVector; - LPSTR *lpPtr; - LPWSTR lpUnicodeString; - LPWSTR pszServiceName; - LPSTR lpAnsiString; - DWORD cbServiceName; - DWORD dwVectorSize; - DWORD dwUnicodeSize; - DWORD dwAnsiSize = 0; - DWORD dwAnsiNameSize = 0; + LPWSTR *lpVectorW; DWORD i; + DWORD cchArg; if (ControlPacket == NULL || lpArgCount == NULL || lpArgVector == NULL) return ERROR_INVALID_PARAMETER; @@ -362,81 +356,28 @@ *lpArgCount = 0; *lpArgVector = NULL; - pszServiceName = (PWSTR)((PBYTE)ControlPacket + ControlPacket->dwServiceNameOffset); - cbServiceName = lstrlenW(pszServiceName) * sizeof(WCHAR) + sizeof(UNICODE_NULL); + Error = ScBuildUnicodeArgsVector(ControlPacket, + &ArgCount, + &lpVectorW); + if (Error) + return Error; - dwAnsiNameSize = WideCharToMultiByte(CP_ACP, - 0, - pszServiceName, - cbServiceName, - NULL, - 0, - NULL, - NULL); + lpVector = (LPSTR *)lpVectorW; - dwVectorSize = ControlPacket->dwArgumentsCount * sizeof(LPWSTR); - if (ControlPacket->dwArgumentsCount > 0) + ASSERT(ArgCount == ControlPacket->dwArgumentsCount + 1); + for (i = 0; i < ArgCount; i++) { - lpUnicodeString = (LPWSTR)((PBYTE)ControlPacket + - ControlPacket->dwArgumentsOffset + - dwVectorSize); - dwUnicodeSize = (ControlPacket->dwSize - - ControlPacket->dwArgumentsOffset - - dwVectorSize) / sizeof(WCHAR); - - dwAnsiSize = WideCharToMultiByte(CP_ACP, - 0, - lpUnicodeString, - dwUnicodeSize, - NULL, - 0, - NULL, - NULL); - } - - dwVectorSize += sizeof(LPWSTR); - - lpVector = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - dwVectorSize + dwAnsiNameSize + dwAnsiSize); - if (lpVector == NULL) - return ERROR_OUTOFMEMORY; - - lpPtr = (LPSTR*)lpVector; - lpAnsiString = (LPSTR)((ULONG_PTR)lpVector + dwVectorSize); - - WideCharToMultiByte(CP_ACP, - 0, - pszServiceName, - cbServiceName, - lpAnsiString, - dwAnsiNameSize, - NULL, - NULL); - - if (ControlPacket->dwArgumentsCount > 0) - { - lpAnsiString = (LPSTR)((ULONG_PTR)lpAnsiString + dwAnsiNameSize); - + cchArg = wcslen(lpVectorW[i]) + 1; WideCharToMultiByte(CP_ACP, 0, - lpUnicodeString, - dwUnicodeSize, - lpAnsiString, - dwAnsiSize, + lpVectorW[i], + cchArg, + lpVector[i], + cchArg * sizeof(WCHAR), NULL, NULL); } - lpAnsiString = (LPSTR)((ULONG_PTR)lpVector + dwVectorSize); - for (i = 0; i < ControlPacket->dwArgumentsCount + 1; i++) - { - *lpPtr = lpAnsiString; - - lpPtr++; - lpAnsiString += (strlen(lpAnsiString) + 1); - } - *lpArgCount = ControlPacket->dwArgumentsCount + 1; *lpArgVector = lpVector; Index: rostests/apitests/advapi32/CMakeLists.txt =================================================================== --- modules/rostests/apitests/advapi32/CMakeLists.txt (revision 67916) +++ modules/rostests/apitests/advapi32/CMakeLists.txt (working copy) @@ -9,6 +9,7 @@ RegQueryInfoKey.c RtlEncryptMemory.c SaferIdentifyLevel.c + ServiceArgs.c testlist.c) add_executable(advapi32_apitest ${SOURCE}) Index: modules/rostests/apitests/advapi32/testlist.c =================================================================== --- modules/rostests/apitests/advapi32/testlist.c (revision 67916) +++ modules/rostests/apitests/advapi32/testlist.c (working copy) @@ -12,6 +12,7 @@ extern void func_RegQueryInfoKey(void); extern void func_RtlEncryptMemory(void); extern void func_SaferIdentifyLevel(void); +extern void func_ServiceArgs(void); const struct test winetest_testlist[] = { @@ -24,7 +25,7 @@ { "RegQueryInfoKey", func_RegQueryInfoKey }, { "RtlEncryptMemory", func_RtlEncryptMemory }, { "SaferIdentifyLevel", func_SaferIdentifyLevel }, - + { "ServiceArgs", func_ServiceArgs }, { 0, 0 } };