Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / reactos / dll / win32 / advapi32 / service / scm.c
diff --git a/reactos/dll/win32/advapi32/service/scm.c b/reactos/dll/win32/advapi32/service/scm.c
deleted file mode 100644 (file)
index 42aec43..0000000
+++ /dev/null
@@ -1,2850 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS system libraries
- * FILE:            lib/advapi32/service/scm.c
- * PURPOSE:         Service control manager functions
- * PROGRAMMER:      Emanuele Aliberti
- *                  Eric Kohl
- * UPDATE HISTORY:
- *  19990413 EA created
- *  19990515 EA
- */
-
-/* INCLUDES ******************************************************************/
-
-#include <advapi32.h>
-WINE_DEFAULT_DEBUG_CHANNEL(advapi);
-
-
-/* FUNCTIONS *****************************************************************/
-
-handle_t __RPC_USER
-SVCCTL_HANDLEA_bind(SVCCTL_HANDLEA szMachineName)
-{
-    handle_t hBinding = NULL;
-    UCHAR *pszStringBinding;
-    RPC_STATUS status;
-
-    TRACE("SVCCTL_HANDLEA_bind() called\n");
-
-    status = RpcStringBindingComposeA(NULL,
-                                      (UCHAR *)"ncacn_np",
-                                      (UCHAR *)szMachineName,
-                                      (UCHAR *)"\\pipe\\ntsvcs",
-                                      NULL,
-                                      (UCHAR **)&pszStringBinding);
-    if (status != RPC_S_OK)
-    {
-        ERR("RpcStringBindingCompose returned 0x%x\n", status);
-        return NULL;
-    }
-
-    /* Set the binding handle that will be used to bind to the server. */
-    status = RpcBindingFromStringBindingA(pszStringBinding,
-                                          &hBinding);
-    if (status != RPC_S_OK)
-    {
-        ERR("RpcBindingFromStringBinding returned 0x%x\n", status);
-    }
-
-    status = RpcStringFreeA(&pszStringBinding);
-    if (status != RPC_S_OK)
-    {
-        ERR("RpcStringFree returned 0x%x\n", status);
-    }
-
-    return hBinding;
-}
-
-
-void __RPC_USER
-SVCCTL_HANDLEA_unbind(SVCCTL_HANDLEA szMachineName,
-                      handle_t hBinding)
-{
-    RPC_STATUS status;
-
-    TRACE("SVCCTL_HANDLEA_unbind() called\n");
-
-    status = RpcBindingFree(&hBinding);
-    if (status != RPC_S_OK)
-    {
-        ERR("RpcBindingFree returned 0x%x\n", status);
-    }
-}
-
-
-handle_t __RPC_USER
-SVCCTL_HANDLEW_bind(SVCCTL_HANDLEW szMachineName)
-{
-    handle_t hBinding = NULL;
-    LPWSTR pszStringBinding;
-    RPC_STATUS status;
-
-    TRACE("SVCCTL_HANDLEW_bind() called\n");
-
-    status = RpcStringBindingComposeW(NULL,
-                                      L"ncacn_np",
-                                      szMachineName,
-                                      L"\\pipe\\ntsvcs",
-                                      NULL,
-                                      &pszStringBinding);
-    if (status != RPC_S_OK)
-    {
-        ERR("RpcStringBindingCompose returned 0x%x\n", status);
-        return NULL;
-    }
-
-    /* Set the binding handle that will be used to bind to the server. */
-    status = RpcBindingFromStringBindingW(pszStringBinding,
-                                          &hBinding);
-    if (status != RPC_S_OK)
-    {
-        ERR("RpcBindingFromStringBinding returned 0x%x\n", status);
-    }
-
-    status = RpcStringFreeW(&pszStringBinding);
-    if (status != RPC_S_OK)
-    {
-        ERR("RpcStringFree returned 0x%x\n", status);
-    }
-
-    return hBinding;
-}
-
-
-void __RPC_USER
-SVCCTL_HANDLEW_unbind(SVCCTL_HANDLEW szMachineName,
-                      handle_t hBinding)
-{
-    RPC_STATUS status;
-
-    TRACE("SVCCTL_HANDLEW_unbind() called\n");
-
-    status = RpcBindingFree(&hBinding);
-    if (status != RPC_S_OK)
-    {
-        ERR("RpcBindingFree returned 0x%x\n", status);
-    }
-}
-
-
-DWORD
-ScmRpcStatusToWinError(RPC_STATUS Status)
-{
-    switch (Status)
-    {
-        case STATUS_ACCESS_VIOLATION:
-        case RPC_S_INVALID_BINDING:
-        case RPC_X_SS_IN_NULL_CONTEXT:
-            return ERROR_INVALID_HANDLE;
-
-        case RPC_X_ENUM_VALUE_OUT_OF_RANGE:
-        case RPC_X_BYTE_COUNT_TOO_SMALL:
-            return ERROR_INVALID_PARAMETER;
-
-        case RPC_X_NULL_REF_POINTER:
-            return ERROR_INVALID_ADDRESS;
-
-        default:
-            return (DWORD)Status;
-    }
-}
-
-
-/**********************************************************************
- *  ChangeServiceConfig2A
- *
- * @implemented
- */
-BOOL WINAPI
-ChangeServiceConfig2A(SC_HANDLE hService,
-                      DWORD dwInfoLevel,
-                      LPVOID lpInfo)
-{
-    SC_RPC_CONFIG_INFOA Info;
-    DWORD dwError;
-
-    TRACE("ChangeServiceConfig2A() called\n");
-
-    if (lpInfo == NULL) return TRUE;
-
-    /* Fill relevant field of the Info structure */
-    Info.dwInfoLevel = dwInfoLevel;
-    switch (dwInfoLevel)
-    {
-        case SERVICE_CONFIG_DESCRIPTION:
-            Info.psd = lpInfo;
-            break;
-
-        case SERVICE_CONFIG_FAILURE_ACTIONS:
-            Info.psfa = lpInfo;
-            break;
-
-        default:
-            WARN("Unknown info level 0x%lx\n", dwInfoLevel);
-            SetLastError(ERROR_INVALID_PARAMETER);
-            return FALSE;
-    }
-
-    RpcTryExcept
-    {
-        dwError = RChangeServiceConfig2A((SC_RPC_HANDLE)hService,
-                                         Info);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RChangeServiceConfig2A() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  ChangeServiceConfig2W
- *
- * @implemented
- */
-BOOL WINAPI
-ChangeServiceConfig2W(SC_HANDLE hService,
-                      DWORD dwInfoLevel,
-                      LPVOID lpInfo)
-{
-    SC_RPC_CONFIG_INFOW Info;
-    DWORD dwError;
-
-    TRACE("ChangeServiceConfig2W() called\n");
-
-    if (lpInfo == NULL) return TRUE;
-
-    /* Fill relevant field of the Info structure */
-    Info.dwInfoLevel = dwInfoLevel;
-    switch (dwInfoLevel)
-    {
-        case SERVICE_CONFIG_DESCRIPTION:
-            Info.psd = lpInfo;
-            break;
-
-        case SERVICE_CONFIG_FAILURE_ACTIONS:
-            Info.psfa = lpInfo;
-            break;
-
-        default:
-            WARN("Unknown info level 0x%lx\n", dwInfoLevel);
-            SetLastError(ERROR_INVALID_PARAMETER);
-            return FALSE;
-    }
-
-    RpcTryExcept
-    {
-        dwError = RChangeServiceConfig2W((SC_RPC_HANDLE)hService,
-                                         Info);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RChangeServiceConfig2W() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  ChangeServiceConfigA
- *
- * @implemented
- */
-BOOL WINAPI
-ChangeServiceConfigA(SC_HANDLE hService,
-                     DWORD dwServiceType,
-                     DWORD dwStartType,
-                     DWORD dwErrorControl,
-                     LPCSTR lpBinaryPathName,
-                     LPCSTR lpLoadOrderGroup,
-                     LPDWORD lpdwTagId,
-                     LPCSTR lpDependencies,
-                     LPCSTR lpServiceStartName,
-                     LPCSTR lpPassword,
-                     LPCSTR lpDisplayName)
-{
-    DWORD dwError;
-    DWORD dwDependenciesLength = 0;
-    SIZE_T cchLength;
-    LPCSTR lpStr;
-    DWORD dwPasswordLength = 0;
-    LPWSTR lpPasswordW = NULL;
-    LPBYTE lpEncryptedPassword = NULL;
-
-    TRACE("ChangeServiceConfigA() called\n");
-
-    /* Calculate the Dependencies length*/
-    if (lpDependencies != NULL)
-    {
-        lpStr = lpDependencies;
-        while (*lpStr)
-        {
-            cchLength = strlen(lpStr) + 1;
-            dwDependenciesLength += (DWORD)cchLength;
-            lpStr = lpStr + cchLength;
-        }
-        dwDependenciesLength++;
-    }
-
-    if (lpPassword != NULL)
-    {
-        /* Convert the password to unicode */
-        lpPasswordW = HeapAlloc(GetProcessHeap(),
-                                HEAP_ZERO_MEMORY,
-                                (strlen(lpPassword) + 1) * sizeof(WCHAR));
-        if (lpPasswordW == NULL)
-        {
-            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-            return FALSE;
-        }
-
-        MultiByteToWideChar(CP_ACP,
-                            0,
-                            lpPassword,
-                            -1,
-                            lpPasswordW,
-                            (int)(strlen(lpPassword) + 1));
-
-        /* FIXME: Encrypt the password */
-        lpEncryptedPassword = (LPBYTE)lpPasswordW;
-        dwPasswordLength = (wcslen(lpPasswordW) + 1) * sizeof(WCHAR);
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RChangeServiceConfigA((SC_RPC_HANDLE)hService,
-                                        dwServiceType,
-                                        dwStartType,
-                                        dwErrorControl,
-                                        (LPSTR)lpBinaryPathName,
-                                        (LPSTR)lpLoadOrderGroup,
-                                        lpdwTagId,
-                                        (LPBYTE)lpDependencies,
-                                        dwDependenciesLength,
-                                        (LPSTR)lpServiceStartName,
-                                        lpEncryptedPassword,
-                                        dwPasswordLength,
-                                        (LPSTR)lpDisplayName);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (lpPasswordW != NULL)
-        HeapFree(GetProcessHeap(), 0, lpPasswordW);
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RChangeServiceConfigA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  ChangeServiceConfigW
- *
- * @implemented
- */
-BOOL WINAPI
-ChangeServiceConfigW(SC_HANDLE hService,
-                     DWORD dwServiceType,
-                     DWORD dwStartType,
-                     DWORD dwErrorControl,
-                     LPCWSTR lpBinaryPathName,
-                     LPCWSTR lpLoadOrderGroup,
-                     LPDWORD lpdwTagId,
-                     LPCWSTR lpDependencies,
-                     LPCWSTR lpServiceStartName,
-                     LPCWSTR lpPassword,
-                     LPCWSTR lpDisplayName)
-{
-    DWORD dwError;
-    DWORD dwDependenciesLength = 0;
-    SIZE_T cchLength;
-    LPCWSTR lpStr;
-    DWORD dwPasswordLength = 0;
-    LPBYTE lpEncryptedPassword = NULL;
-
-    TRACE("ChangeServiceConfigW() called\n");
-
-    /* Calculate the Dependencies length*/
-    if (lpDependencies != NULL)
-    {
-        lpStr = lpDependencies;
-        while (*lpStr)
-        {
-            cchLength = wcslen(lpStr) + 1;
-            dwDependenciesLength += (DWORD)cchLength;
-            lpStr = lpStr + cchLength;
-        }
-        dwDependenciesLength++;
-        dwDependenciesLength *= sizeof(WCHAR);
-    }
-
-    if (lpPassword != NULL)
-    {
-        /* FIXME: Encrypt the password */
-        lpEncryptedPassword = (LPBYTE)lpPassword;
-        dwPasswordLength = (wcslen(lpPassword) + 1) * sizeof(WCHAR);
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RChangeServiceConfigW((SC_RPC_HANDLE)hService,
-                                        dwServiceType,
-                                        dwStartType,
-                                        dwErrorControl,
-                                        (LPWSTR)lpBinaryPathName,
-                                        (LPWSTR)lpLoadOrderGroup,
-                                        lpdwTagId,
-                                        (LPBYTE)lpDependencies,
-                                        dwDependenciesLength,
-                                        (LPWSTR)lpServiceStartName,
-                                        lpEncryptedPassword,
-                                        dwPasswordLength,
-                                        (LPWSTR)lpDisplayName);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RChangeServiceConfigW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  CloseServiceHandle
- *
- * @implemented
- */
-BOOL WINAPI
-CloseServiceHandle(SC_HANDLE hSCObject)
-{
-    DWORD dwError;
-
-    TRACE("CloseServiceHandle() called\n");
-
-    if (!hSCObject)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RCloseServiceHandle((LPSC_RPC_HANDLE)&hSCObject);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError)
-    {
-        TRACE("RCloseServiceHandle() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("CloseServiceHandle() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  ControlService
- *
- * @implemented
- */
-BOOL WINAPI
-ControlService(SC_HANDLE hService,
-               DWORD dwControl,
-               LPSERVICE_STATUS lpServiceStatus)
-{
-    DWORD dwError;
-
-    TRACE("ControlService(%x, %x, %p)\n",
-           hService, dwControl, lpServiceStatus);
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RControlService((SC_RPC_HANDLE)hService,
-                                  dwControl,
-                                  lpServiceStatus);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RControlService() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("ControlService() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  ControlServiceEx
- *
- * @unimplemented
- */
-BOOL WINAPI
-ControlServiceEx(IN SC_HANDLE hService,
-                 IN DWORD dwControl,
-                 IN DWORD dwInfoLevel,
-                 IN OUT PVOID pControlParams)
-{
-    FIXME("ControlServiceEx(0x%p, 0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n",
-            hService, dwControl, dwInfoLevel, pControlParams);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
-}
-
-
-/**********************************************************************
- *  CreateServiceA
- *
- * @implemented
- */
-SC_HANDLE WINAPI
-CreateServiceA(SC_HANDLE hSCManager,
-               LPCSTR lpServiceName,
-               LPCSTR lpDisplayName,
-               DWORD dwDesiredAccess,
-               DWORD dwServiceType,
-               DWORD dwStartType,
-               DWORD dwErrorControl,
-               LPCSTR lpBinaryPathName,
-               LPCSTR lpLoadOrderGroup,
-               LPDWORD lpdwTagId,
-               LPCSTR lpDependencies,
-               LPCSTR lpServiceStartName,
-               LPCSTR lpPassword)
-{
-    SC_HANDLE hService = NULL;
-    DWORD dwDependenciesLength = 0;
-    DWORD dwError;
-    SIZE_T cchLength;
-    LPCSTR lpStr;
-    DWORD dwPasswordLength = 0;
-    LPWSTR lpPasswordW = NULL;
-    LPBYTE lpEncryptedPassword = NULL;
-
-    TRACE("CreateServiceA() called\n");
-    TRACE("%p %s %s\n", hSCManager,
-          lpServiceName, lpDisplayName);
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return NULL;
-    }
-
-    /* Calculate the Dependencies length */
-    if (lpDependencies != NULL)
-    {
-        lpStr = lpDependencies;
-        while (*lpStr)
-        {
-            cchLength = strlen(lpStr) + 1;
-            dwDependenciesLength += (DWORD)cchLength;
-            lpStr = lpStr + cchLength;
-        }
-        dwDependenciesLength++;
-    }
-
-    if (lpPassword != NULL)
-    {
-        /* Convert the password to unicode */
-        lpPasswordW = HeapAlloc(GetProcessHeap(),
-                                HEAP_ZERO_MEMORY,
-                                (strlen(lpPassword) + 1) * sizeof(WCHAR));
-        if (lpPasswordW == NULL)
-        {
-            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-            return FALSE;
-        }
-
-        MultiByteToWideChar(CP_ACP,
-                            0,
-                            lpPassword,
-                            -1,
-                            lpPasswordW,
-                            (int)(strlen(lpPassword) + 1));
-
-        /* FIXME: Encrypt the password */
-        lpEncryptedPassword = (LPBYTE)lpPasswordW;
-        dwPasswordLength = (wcslen(lpPasswordW) + 1) * sizeof(WCHAR);
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RCreateServiceA((SC_RPC_HANDLE)hSCManager,
-                                  (LPSTR)lpServiceName,
-                                  (LPSTR)lpDisplayName,
-                                  dwDesiredAccess,
-                                  dwServiceType,
-                                  dwStartType,
-                                  dwErrorControl,
-                                  (LPSTR)lpBinaryPathName,
-                                  (LPSTR)lpLoadOrderGroup,
-                                  lpdwTagId,
-                                  (LPBYTE)lpDependencies,
-                                  dwDependenciesLength,
-                                  (LPSTR)lpServiceStartName,
-                                  lpEncryptedPassword,
-                                  dwPasswordLength,
-                                  (SC_RPC_HANDLE *)&hService);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (lpPasswordW != NULL)
-        HeapFree(GetProcessHeap(), 0, lpPasswordW);
-
-    SetLastError(dwError);
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RCreateServiceA() failed (Error %lu)\n", dwError);
-        return NULL;
-    }
-
-    return hService;
-}
-
-
-/**********************************************************************
- *  CreateServiceW
- *
- * @implemented
- */
-SC_HANDLE WINAPI
-CreateServiceW(SC_HANDLE hSCManager,
-               LPCWSTR lpServiceName,
-               LPCWSTR lpDisplayName,
-               DWORD dwDesiredAccess,
-               DWORD dwServiceType,
-               DWORD dwStartType,
-               DWORD dwErrorControl,
-               LPCWSTR lpBinaryPathName,
-               LPCWSTR lpLoadOrderGroup,
-               LPDWORD lpdwTagId,
-               LPCWSTR lpDependencies,
-               LPCWSTR lpServiceStartName,
-               LPCWSTR lpPassword)
-{
-    SC_HANDLE hService = NULL;
-    DWORD dwDependenciesLength = 0;
-    DWORD dwError;
-    SIZE_T cchLength;
-    LPCWSTR lpStr;
-    DWORD dwPasswordLength = 0;
-    LPBYTE lpEncryptedPassword = NULL;
-
-    TRACE("CreateServiceW() called\n");
-    TRACE("%p %S %S\n", hSCManager,
-          lpServiceName, lpDisplayName);
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return NULL;
-    }
-
-    /* Calculate the Dependencies length */
-    if (lpDependencies != NULL)
-    {
-        lpStr = lpDependencies;
-        while (*lpStr)
-        {
-            cchLength = wcslen(lpStr) + 1;
-            dwDependenciesLength += (DWORD)cchLength;
-            lpStr = lpStr + cchLength;
-        }
-        dwDependenciesLength++;
-        dwDependenciesLength *= sizeof(WCHAR);
-    }
-
-    if (lpPassword != NULL)
-    {
-        /* FIXME: Encrypt the password */
-        lpEncryptedPassword = (LPBYTE)lpPassword;
-        dwPasswordLength = (wcslen(lpPassword) + 1) * sizeof(WCHAR);
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RCreateServiceW((SC_RPC_HANDLE)hSCManager,
-                                  lpServiceName,
-                                  lpDisplayName,
-                                  dwDesiredAccess,
-                                  dwServiceType,
-                                  dwStartType,
-                                  dwErrorControl,
-                                  lpBinaryPathName,
-                                  lpLoadOrderGroup,
-                                  lpdwTagId,
-                                  (LPBYTE)lpDependencies,
-                                  dwDependenciesLength,
-                                  lpServiceStartName,
-                                  lpEncryptedPassword,
-                                  dwPasswordLength,
-                                  (SC_RPC_HANDLE *)&hService);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    SetLastError(dwError);
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RCreateServiceW() failed (Error %lu)\n", dwError);
-        return NULL;
-    }
-
-    return hService;
-}
-
-
-/**********************************************************************
- *  DeleteService
- *
- * @implemented
- */
-BOOL WINAPI
-DeleteService(SC_HANDLE hService)
-{
-    DWORD dwError;
-
-    TRACE("DeleteService(%x)\n", hService);
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RDeleteService((SC_RPC_HANDLE)hService);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RDeleteService() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  EnumDependentServicesA
- *
- * @implemented
- */
-BOOL WINAPI
-EnumDependentServicesA(SC_HANDLE hService,
-                       DWORD dwServiceState,
-                       LPENUM_SERVICE_STATUSA lpServices,
-                       DWORD cbBufSize,
-                       LPDWORD pcbBytesNeeded,
-                       LPDWORD lpServicesReturned)
-{
-    ENUM_SERVICE_STATUSA ServiceStatus;
-    LPENUM_SERVICE_STATUSA lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-    DWORD dwCount;
-
-    TRACE("EnumDependentServicesA() called\n");
-
-    if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUSA))
-    {
-        lpStatusPtr = &ServiceStatus;
-        dwBufferSize = sizeof(ENUM_SERVICE_STATUSA);
-    }
-    else
-    {
-        lpStatusPtr = lpServices;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        dwError = REnumDependentServicesA((SC_RPC_HANDLE)hService,
-                                          dwServiceState,
-                                          (LPBYTE)lpStatusPtr,
-                                          dwBufferSize,
-                                          pcbBytesNeeded,
-                                          lpServicesReturned);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
-    {
-        for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-        {
-            if (lpStatusPtr->lpServiceName)
-                lpStatusPtr->lpServiceName =
-                    (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-            if (lpStatusPtr->lpDisplayName)
-                lpStatusPtr->lpDisplayName =
-                    (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-            lpStatusPtr++;
-        }
-    }
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("REnumDependentServicesA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("EnumDependentServicesA() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  EnumDependentServicesW
- *
- * @implemented
- */
-BOOL WINAPI
-EnumDependentServicesW(SC_HANDLE hService,
-                       DWORD dwServiceState,
-                       LPENUM_SERVICE_STATUSW lpServices,
-                       DWORD cbBufSize,
-                       LPDWORD pcbBytesNeeded,
-                       LPDWORD lpServicesReturned)
-{
-    ENUM_SERVICE_STATUSW ServiceStatus;
-    LPENUM_SERVICE_STATUSW lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-    DWORD dwCount;
-
-    TRACE("EnumDependentServicesW() called\n");
-
-    if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUSW))
-    {
-        lpStatusPtr = &ServiceStatus;
-        dwBufferSize = sizeof(ENUM_SERVICE_STATUSW);
-    }
-    else
-    {
-        lpStatusPtr = lpServices;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        dwError = REnumDependentServicesW((SC_RPC_HANDLE)hService,
-                                          dwServiceState,
-                                          (LPBYTE)lpStatusPtr,
-                                          dwBufferSize,
-                                          pcbBytesNeeded,
-                                          lpServicesReturned);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
-    {
-        for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-        {
-            if (lpStatusPtr->lpServiceName)
-                lpStatusPtr->lpServiceName =
-                    (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-            if (lpStatusPtr->lpDisplayName)
-                lpStatusPtr->lpDisplayName =
-                    (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-            lpStatusPtr++;
-        }
-    }
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("REnumDependentServicesW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("EnumDependentServicesW() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  EnumServiceGroupW
- *
- * @implemented
- */
-BOOL WINAPI
-EnumServiceGroupW(SC_HANDLE hSCManager,
-                  DWORD dwServiceType,
-                  DWORD dwServiceState,
-                  LPENUM_SERVICE_STATUSW lpServices,
-                  DWORD cbBufSize,
-                  LPDWORD pcbBytesNeeded,
-                  LPDWORD lpServicesReturned,
-                  LPDWORD lpResumeHandle,
-                  LPCWSTR lpGroup)
-{
-    ENUM_SERVICE_STATUSW ServiceStatus;
-    LPENUM_SERVICE_STATUSW lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-    DWORD dwCount;
-
-    TRACE("EnumServiceGroupW() called\n");
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (pcbBytesNeeded == NULL || lpServicesReturned == NULL)
-    {
-        SetLastError(ERROR_INVALID_ADDRESS);
-        return FALSE;
-    }
-
-    if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUSW))
-    {
-        lpStatusPtr = &ServiceStatus;
-        dwBufferSize = sizeof(ENUM_SERVICE_STATUSW);
-    }
-    else
-    {
-        lpStatusPtr = lpServices;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        if (lpGroup == NULL)
-        {
-            dwError = REnumServicesStatusW((SC_RPC_HANDLE)hSCManager,
-                                           dwServiceType,
-                                           dwServiceState,
-                                           (LPBYTE)lpStatusPtr,
-                                           dwBufferSize,
-                                           pcbBytesNeeded,
-                                           lpServicesReturned,
-                                           lpResumeHandle);
-        }
-        else
-        {
-            dwError = REnumServiceGroupW((SC_RPC_HANDLE)hSCManager,
-                                         dwServiceType,
-                                         dwServiceState,
-                                         (LPBYTE)lpStatusPtr,
-                                         dwBufferSize,
-                                         pcbBytesNeeded,
-                                         lpServicesReturned,
-                                         lpResumeHandle,
-                                         lpGroup);
-        }
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
-    {
-        for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-        {
-            if (lpStatusPtr->lpServiceName)
-                lpStatusPtr->lpServiceName =
-                    (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-            if (lpStatusPtr->lpDisplayName)
-                lpStatusPtr->lpDisplayName =
-                    (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-            lpStatusPtr++;
-        }
-    }
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("REnumServiceGroupW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("EnumServiceGroupW() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  EnumServicesStatusA
- *
- * @implemented
- */
-BOOL WINAPI
-EnumServicesStatusA(SC_HANDLE hSCManager,
-                    DWORD dwServiceType,
-                    DWORD dwServiceState,
-                    LPENUM_SERVICE_STATUSA lpServices,
-                    DWORD cbBufSize,
-                    LPDWORD pcbBytesNeeded,
-                    LPDWORD lpServicesReturned,
-                    LPDWORD lpResumeHandle)
-{
-    ENUM_SERVICE_STATUSA ServiceStatus;
-    LPENUM_SERVICE_STATUSA lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-    DWORD dwCount;
-
-    TRACE("EnumServicesStatusA() called\n");
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (pcbBytesNeeded == NULL || lpServicesReturned == NULL)
-    {
-        SetLastError(ERROR_INVALID_ADDRESS);
-        return FALSE;
-    }
-
-    if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUSA))
-    {
-        lpStatusPtr = &ServiceStatus;
-        dwBufferSize = sizeof(ENUM_SERVICE_STATUSA);
-    }
-    else
-    {
-        lpStatusPtr = lpServices;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        dwError = REnumServicesStatusA((SC_RPC_HANDLE)hSCManager,
-                                       dwServiceType,
-                                       dwServiceState,
-                                       (LPBYTE)lpStatusPtr,
-                                       dwBufferSize,
-                                       pcbBytesNeeded,
-                                       lpServicesReturned,
-                                       lpResumeHandle);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
-    {
-        for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-        {
-            if (lpStatusPtr->lpServiceName)
-                lpStatusPtr->lpServiceName =
-                    (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-            if (lpStatusPtr->lpDisplayName)
-                lpStatusPtr->lpDisplayName =
-                    (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-            lpStatusPtr++;
-        }
-    }
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("REnumServicesStatusA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("EnumServicesStatusA() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  EnumServicesStatusW
- *
- * @implemented
- */
-BOOL WINAPI
-EnumServicesStatusW(SC_HANDLE hSCManager,
-                    DWORD dwServiceType,
-                    DWORD dwServiceState,
-                    LPENUM_SERVICE_STATUSW lpServices,
-                    DWORD cbBufSize,
-                    LPDWORD pcbBytesNeeded,
-                    LPDWORD lpServicesReturned,
-                    LPDWORD lpResumeHandle)
-{
-    ENUM_SERVICE_STATUSW ServiceStatus;
-    LPENUM_SERVICE_STATUSW lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-    DWORD dwCount;
-
-    TRACE("EnumServicesStatusW() called\n");
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (pcbBytesNeeded == NULL || lpServicesReturned == NULL)
-    {
-        SetLastError(ERROR_INVALID_ADDRESS);
-        return FALSE;
-    }
-
-    if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUSW))
-    {
-        lpStatusPtr = &ServiceStatus;
-        dwBufferSize = sizeof(ENUM_SERVICE_STATUSW);
-    }
-    else
-    {
-        lpStatusPtr = lpServices;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        dwError = REnumServicesStatusW((SC_RPC_HANDLE)hSCManager,
-                                       dwServiceType,
-                                       dwServiceState,
-                                       (LPBYTE)lpStatusPtr,
-                                       dwBufferSize,
-                                       pcbBytesNeeded,
-                                       lpServicesReturned,
-                                       lpResumeHandle);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
-    {
-        for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-        {
-            if (lpStatusPtr->lpServiceName)
-                lpStatusPtr->lpServiceName =
-                    (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-            if (lpStatusPtr->lpDisplayName)
-                lpStatusPtr->lpDisplayName =
-                    (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-            lpStatusPtr++;
-        }
-    }
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("REnumServicesStatusW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("EnumServicesStatusW() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  EnumServicesStatusExA
- *
- * @implemented
- */
-BOOL WINAPI
-EnumServicesStatusExA(SC_HANDLE hSCManager,
-                      SC_ENUM_TYPE InfoLevel,
-                      DWORD dwServiceType,
-                      DWORD dwServiceState,
-                      LPBYTE lpServices,
-                      DWORD cbBufSize,
-                      LPDWORD pcbBytesNeeded,
-                      LPDWORD lpServicesReturned,
-                      LPDWORD lpResumeHandle,
-                      LPCSTR pszGroupName)
-{
-    ENUM_SERVICE_STATUS_PROCESSA ServiceStatus;
-    LPENUM_SERVICE_STATUS_PROCESSA lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-    DWORD dwCount;
-
-    TRACE("EnumServicesStatusExA() called\n");
-
-    if (InfoLevel != SC_ENUM_PROCESS_INFO)
-    {
-        SetLastError(ERROR_INVALID_LEVEL);
-        return FALSE;
-    }
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (pcbBytesNeeded == NULL || lpServicesReturned == NULL)
-    {
-        SetLastError(ERROR_INVALID_ADDRESS);
-        return FALSE;
-    }
-
-    if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUS_PROCESSA))
-    {
-        lpStatusPtr = &ServiceStatus;
-        dwBufferSize = sizeof(ENUM_SERVICE_STATUS_PROCESSA);
-    }
-    else
-    {
-        lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSA)lpServices;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        dwError = REnumServicesStatusExA((SC_RPC_HANDLE)hSCManager,
-                                         InfoLevel,
-                                         dwServiceType,
-                                         dwServiceState,
-                                         (LPBYTE)lpStatusPtr,
-                                         dwBufferSize,
-                                         pcbBytesNeeded,
-                                         lpServicesReturned,
-                                         lpResumeHandle,
-                                         (LPSTR)pszGroupName);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
-    {
-        if (InfoLevel == SC_ENUM_PROCESS_INFO)
-        {
-            for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-            {
-                if (lpStatusPtr->lpServiceName)
-                    lpStatusPtr->lpServiceName =
-                        (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-                if (lpStatusPtr->lpDisplayName)
-                    lpStatusPtr->lpDisplayName =
-                        (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-                lpStatusPtr++;
-            }
-        }
-    }
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("REnumServicesStatusExA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("EnumServicesStatusExA() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  EnumServicesStatusExW
- *
- * @implemented
- */
-BOOL WINAPI
-EnumServicesStatusExW(SC_HANDLE hSCManager,
-                      SC_ENUM_TYPE InfoLevel,
-                      DWORD dwServiceType,
-                      DWORD dwServiceState,
-                      LPBYTE lpServices,
-                      DWORD cbBufSize,
-                      LPDWORD pcbBytesNeeded,
-                      LPDWORD lpServicesReturned,
-                      LPDWORD lpResumeHandle,
-                      LPCWSTR pszGroupName)
-{
-    ENUM_SERVICE_STATUS_PROCESSW ServiceStatus;
-    LPENUM_SERVICE_STATUS_PROCESSW lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-    DWORD dwCount;
-
-    TRACE("EnumServicesStatusExW() called\n");
-
-    if (InfoLevel != SC_ENUM_PROCESS_INFO)
-    {
-        SetLastError(ERROR_INVALID_LEVEL);
-        return FALSE;
-    }
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (pcbBytesNeeded == NULL || lpServicesReturned == NULL)
-    {
-        SetLastError(ERROR_INVALID_ADDRESS);
-        return FALSE;
-    }
-
-    if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUS_PROCESSW))
-    {
-        lpStatusPtr = &ServiceStatus;
-        dwBufferSize = sizeof(ENUM_SERVICE_STATUS_PROCESSW);
-    }
-    else
-    {
-        lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSW)lpServices;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        dwError = REnumServicesStatusExW((SC_RPC_HANDLE)hSCManager,
-                                         InfoLevel,
-                                         dwServiceType,
-                                         dwServiceState,
-                                         (LPBYTE)lpStatusPtr,
-                                         dwBufferSize,
-                                         pcbBytesNeeded,
-                                         lpServicesReturned,
-                                         lpResumeHandle,
-                                         (LPWSTR)pszGroupName);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
-    {
-        if (InfoLevel == SC_ENUM_PROCESS_INFO)
-        {
-            for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-            {
-                if (lpStatusPtr->lpServiceName)
-                    lpStatusPtr->lpServiceName =
-                        (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-                if (lpStatusPtr->lpDisplayName)
-                    lpStatusPtr->lpDisplayName =
-                        (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-                lpStatusPtr++;
-            }
-        }
-    }
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("REnumServicesStatusExW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    TRACE("EnumServicesStatusExW() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  GetServiceDisplayNameA
- *
- * @implemented
- */
-BOOL WINAPI
-GetServiceDisplayNameA(SC_HANDLE hSCManager,
-                       LPCSTR lpServiceName,
-                       LPSTR lpDisplayName,
-                       LPDWORD lpcchBuffer)
-{
-    DWORD dwError;
-    LPSTR lpNameBuffer;
-    CHAR szEmptyName[] = "";
-
-    TRACE("GetServiceDisplayNameA() called\n");
-    TRACE("%p %s %p %p\n", hSCManager,
-          debugstr_a(lpServiceName), lpDisplayName, lpcchBuffer);
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (!lpDisplayName || *lpcchBuffer < sizeof(CHAR))
-    {
-        lpNameBuffer = szEmptyName;
-        *lpcchBuffer = sizeof(CHAR);
-    }
-    else
-    {
-        lpNameBuffer = lpDisplayName;
-    }
-
-    RpcTryExcept
-    {
-        dwError = RGetServiceDisplayNameA((SC_RPC_HANDLE)hSCManager,
-                                          lpServiceName,
-                                          lpNameBuffer,
-                                          lpcchBuffer);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        /* HACK: because of a problem with rpcrt4, rpcserver is hacked to return 6 for ERROR_SERVICE_DOES_NOT_EXIST */
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RGetServiceDisplayNameA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  GetServiceDisplayNameW
- *
- * @implemented
- */
-BOOL WINAPI
-GetServiceDisplayNameW(SC_HANDLE hSCManager,
-                       LPCWSTR lpServiceName,
-                       LPWSTR lpDisplayName,
-                       LPDWORD lpcchBuffer)
-{
-    DWORD dwError;
-    LPWSTR lpNameBuffer;
-    WCHAR szEmptyName[] = L"";
-
-    TRACE("GetServiceDisplayNameW() called\n");
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (!lpDisplayName || *lpcchBuffer < sizeof(WCHAR))
-    {
-        lpNameBuffer = szEmptyName;
-        *lpcchBuffer = sizeof(WCHAR);
-    }
-    else
-    {
-        lpNameBuffer = lpDisplayName;
-    }
-
-    RpcTryExcept
-    {
-        dwError = RGetServiceDisplayNameW((SC_RPC_HANDLE)hSCManager,
-                                          lpServiceName,
-                                          lpNameBuffer,
-                                          lpcchBuffer);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RGetServiceDisplayNameW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  GetServiceKeyNameA
- *
- * @implemented
- */
-BOOL WINAPI
-GetServiceKeyNameA(SC_HANDLE hSCManager,
-                   LPCSTR lpDisplayName,
-                   LPSTR lpServiceName,
-                   LPDWORD lpcchBuffer)
-{
-    DWORD dwError;
-    LPSTR lpNameBuffer;
-    CHAR szEmptyName[] = "";
-
-    TRACE("GetServiceKeyNameA() called\n");
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (!lpServiceName || *lpcchBuffer < sizeof(CHAR))
-    {
-        lpNameBuffer = szEmptyName;
-        *lpcchBuffer = sizeof(CHAR);
-    }
-    else
-    {
-        lpNameBuffer = lpServiceName;
-    }
-
-    RpcTryExcept
-    {
-        dwError = RGetServiceKeyNameA((SC_RPC_HANDLE)hSCManager,
-                                      lpDisplayName,
-                                      lpNameBuffer,
-                                      lpcchBuffer);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RGetServiceKeyNameA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  GetServiceKeyNameW
- *
- * @implemented
- */
-BOOL WINAPI
-GetServiceKeyNameW(SC_HANDLE hSCManager,
-                   LPCWSTR lpDisplayName,
-                   LPWSTR lpServiceName,
-                   LPDWORD lpcchBuffer)
-{
-    DWORD dwError;
-    LPWSTR lpNameBuffer;
-    WCHAR szEmptyName[] = L"";
-
-    TRACE("GetServiceKeyNameW() called\n");
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    if (!lpServiceName || *lpcchBuffer < sizeof(WCHAR))
-    {
-        lpNameBuffer = szEmptyName;
-        *lpcchBuffer = sizeof(WCHAR);
-    }
-    else
-    {
-        lpNameBuffer = lpServiceName;
-    }
-
-    RpcTryExcept
-    {
-        dwError = RGetServiceKeyNameW((SC_RPC_HANDLE)hSCManager,
-                                      lpDisplayName,
-                                      lpNameBuffer,
-                                      lpcchBuffer);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RGetServiceKeyNameW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  I_ScGetCurrentGroupStateW
- *
- * @implemented
- */
-DWORD WINAPI
-I_ScGetCurrentGroupStateW(SC_HANDLE hSCManager,
-                          LPWSTR pszGroupName,
-                          LPDWORD pdwGroupState)
-{
-    DWORD dwError;
-
-    TRACE("I_ScGetCurrentGroupStateW() called\n");
-
-    RpcTryExcept
-    {
-        dwError = RI_ScGetCurrentGroupStateW((SC_RPC_HANDLE)hSCManager,
-                                             pszGroupName,
-                                             pdwGroupState);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RI_ScGetCurrentGroupStateW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-    }
-
-    return dwError;
-}
-
-
-/**********************************************************************
- *  LockServiceDatabase
- *
- * @implemented
- */
-SC_LOCK WINAPI
-LockServiceDatabase(SC_HANDLE hSCManager)
-{
-    SC_LOCK hLock;
-    DWORD dwError;
-
-    TRACE("LockServiceDatabase(%x)\n", hSCManager);
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RLockServiceDatabase((SC_RPC_HANDLE)hSCManager,
-                                       (SC_RPC_LOCK *)&hLock);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RLockServiceDatabase() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return NULL;
-    }
-
-    TRACE("hLock = %p\n", hLock);
-
-    return hLock;
-}
-
-
-static VOID
-WaitForSCManager(VOID)
-{
-    HANDLE hEvent;
-
-    TRACE("WaitForSCManager() called\n");
-
-    /* Try to open the existing event */
-    hEvent = OpenEventW(SYNCHRONIZE, FALSE, SCM_START_EVENT);
-    if (hEvent == NULL)
-    {
-        if (GetLastError() != ERROR_FILE_NOT_FOUND) return;
-
-        /* Try to create a new event */
-        hEvent = CreateEventW(NULL, TRUE, FALSE, SCM_START_EVENT);
-        if (hEvent == NULL) return;
-    }
-
-    /* Wait for 3 minutes */
-    WaitForSingleObject(hEvent, 180000);
-    CloseHandle(hEvent);
-
-    TRACE("ScmWaitForSCManager() done\n");
-}
-
-
-/**********************************************************************
- *  OpenSCManagerA
- *
- * @implemented
- */
-SC_HANDLE WINAPI
-OpenSCManagerA(LPCSTR lpMachineName,
-               LPCSTR lpDatabaseName,
-               DWORD dwDesiredAccess)
-{
-    SC_HANDLE hScm = NULL;
-    DWORD dwError;
-
-    TRACE("OpenSCManagerA(%s, %s, %lx)\n",
-           lpMachineName, lpDatabaseName, dwDesiredAccess);
-
-    WaitForSCManager();
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = ROpenSCManagerA((LPSTR)lpMachineName,
-                                  (LPSTR)lpDatabaseName,
-                                  dwDesiredAccess,
-                                  (SC_RPC_HANDLE *)&hScm);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("ROpenSCManagerA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return NULL;
-    }
-
-    TRACE("hScm = %p\n", hScm);
-
-    return hScm;
-}
-
-
-/**********************************************************************
- *  OpenSCManagerW
- *
- * @implemented
- */
-SC_HANDLE WINAPI
-OpenSCManagerW(LPCWSTR lpMachineName,
-               LPCWSTR lpDatabaseName,
-               DWORD dwDesiredAccess)
-{
-    SC_HANDLE hScm = NULL;
-    DWORD dwError;
-
-    TRACE("OpenSCManagerW(%S, %S, %lx)\n",
-           lpMachineName, lpDatabaseName, dwDesiredAccess);
-
-    WaitForSCManager();
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = ROpenSCManagerW((LPWSTR)lpMachineName,
-                                  (LPWSTR)lpDatabaseName,
-                                  dwDesiredAccess,
-                                  (SC_RPC_HANDLE *)&hScm);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("ROpenSCManagerW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return NULL;
-    }
-
-    TRACE("hScm = %p\n", hScm);
-
-    return hScm;
-}
-
-
-/**********************************************************************
- *  OpenServiceA
- *
- * @implemented
- */
-SC_HANDLE WINAPI
-OpenServiceA(SC_HANDLE hSCManager,
-             LPCSTR lpServiceName,
-             DWORD dwDesiredAccess)
-{
-    SC_HANDLE hService = NULL;
-    DWORD dwError;
-
-    TRACE("OpenServiceA(%p, %s, %lx)\n",
-           hSCManager, lpServiceName, dwDesiredAccess);
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return NULL;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = ROpenServiceA((SC_RPC_HANDLE)hSCManager,
-                                (LPSTR)lpServiceName,
-                                dwDesiredAccess,
-                                (SC_RPC_HANDLE *)&hService);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    SetLastError(dwError);
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("ROpenServiceA() failed (Error %lu)\n", dwError);
-        return NULL;
-    }
-
-    TRACE("hService = %p\n", hService);
-
-    return hService;
-}
-
-
-/**********************************************************************
- *  OpenServiceW
- *
- * @implemented
- */
-SC_HANDLE WINAPI
-OpenServiceW(SC_HANDLE hSCManager,
-             LPCWSTR lpServiceName,
-             DWORD dwDesiredAccess)
-{
-    SC_HANDLE hService = NULL;
-    DWORD dwError;
-
-    TRACE("OpenServiceW(%p, %S, %lx)\n",
-           hSCManager, lpServiceName, dwDesiredAccess);
-
-    if (!hSCManager)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return NULL;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = ROpenServiceW((SC_RPC_HANDLE)hSCManager,
-                                (LPWSTR)lpServiceName,
-                                dwDesiredAccess,
-                                (SC_RPC_HANDLE *)&hService);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    SetLastError(dwError);
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("ROpenServiceW() failed (Error %lu)\n", dwError);
-        return NULL;
-    }
-
-    TRACE("hService = %p\n", hService);
-
-    return hService;
-}
-
-
-/**********************************************************************
- *  QueryServiceConfigA
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceConfigA(SC_HANDLE hService,
-                    LPQUERY_SERVICE_CONFIGA lpServiceConfig,
-                    DWORD cbBufSize,
-                    LPDWORD pcbBytesNeeded)
-{
-    QUERY_SERVICE_CONFIGA ServiceConfig;
-    LPQUERY_SERVICE_CONFIGA lpConfigPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-
-    TRACE("QueryServiceConfigA(%p, %p, %lu, %p)\n",
-           hService, lpServiceConfig, cbBufSize, pcbBytesNeeded);
-
-    if (lpServiceConfig == NULL ||
-        cbBufSize < sizeof(QUERY_SERVICE_CONFIGA))
-    {
-        lpConfigPtr = &ServiceConfig;
-        dwBufferSize = sizeof(QUERY_SERVICE_CONFIGA);
-    }
-    else
-    {
-        lpConfigPtr = lpServiceConfig;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceConfigA((SC_RPC_HANDLE)hService,
-                                       (LPBYTE)lpConfigPtr,
-                                       dwBufferSize,
-                                       pcbBytesNeeded);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RQueryServiceConfigA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    /* Adjust the pointers */
-    if (lpConfigPtr->lpBinaryPathName)
-        lpConfigPtr->lpBinaryPathName =
-            (LPSTR)((ULONG_PTR)lpConfigPtr +
-                    (ULONG_PTR)lpConfigPtr->lpBinaryPathName);
-
-    if (lpConfigPtr->lpLoadOrderGroup)
-        lpConfigPtr->lpLoadOrderGroup =
-            (LPSTR)((ULONG_PTR)lpConfigPtr +
-                    (ULONG_PTR)lpConfigPtr->lpLoadOrderGroup);
-
-    if (lpConfigPtr->lpDependencies)
-        lpConfigPtr->lpDependencies =
-            (LPSTR)((ULONG_PTR)lpConfigPtr +
-                    (ULONG_PTR)lpConfigPtr->lpDependencies);
-
-    if (lpConfigPtr->lpServiceStartName)
-        lpConfigPtr->lpServiceStartName =
-            (LPSTR)((ULONG_PTR)lpConfigPtr +
-                    (ULONG_PTR)lpConfigPtr->lpServiceStartName);
-
-    if (lpConfigPtr->lpDisplayName)
-        lpConfigPtr->lpDisplayName =
-           (LPSTR)((ULONG_PTR)lpConfigPtr +
-                   (ULONG_PTR)lpConfigPtr->lpDisplayName);
-
-    TRACE("QueryServiceConfigA() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  QueryServiceConfigW
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceConfigW(SC_HANDLE hService,
-                    LPQUERY_SERVICE_CONFIGW lpServiceConfig,
-                    DWORD cbBufSize,
-                    LPDWORD pcbBytesNeeded)
-{
-    QUERY_SERVICE_CONFIGW ServiceConfig;
-    LPQUERY_SERVICE_CONFIGW lpConfigPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-
-    TRACE("QueryServiceConfigW(%p, %p, %lu, %p)\n",
-           hService, lpServiceConfig, cbBufSize, pcbBytesNeeded);
-
-    if (lpServiceConfig == NULL ||
-        cbBufSize < sizeof(QUERY_SERVICE_CONFIGW))
-    {
-        lpConfigPtr = &ServiceConfig;
-        dwBufferSize = sizeof(QUERY_SERVICE_CONFIGW);
-    }
-    else
-    {
-        lpConfigPtr = lpServiceConfig;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceConfigW((SC_RPC_HANDLE)hService,
-                                       (LPBYTE)lpConfigPtr,
-                                       dwBufferSize,
-                                       pcbBytesNeeded);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RQueryServiceConfigW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    /* Adjust the pointers */
-    if (lpConfigPtr->lpBinaryPathName)
-        lpConfigPtr->lpBinaryPathName =
-            (LPWSTR)((ULONG_PTR)lpConfigPtr +
-                     (ULONG_PTR)lpConfigPtr->lpBinaryPathName);
-
-    if (lpConfigPtr->lpLoadOrderGroup)
-        lpConfigPtr->lpLoadOrderGroup =
-            (LPWSTR)((ULONG_PTR)lpConfigPtr +
-                     (ULONG_PTR)lpConfigPtr->lpLoadOrderGroup);
-
-    if (lpConfigPtr->lpDependencies)
-        lpConfigPtr->lpDependencies =
-            (LPWSTR)((ULONG_PTR)lpConfigPtr +
-                     (ULONG_PTR)lpConfigPtr->lpDependencies);
-
-    if (lpConfigPtr->lpServiceStartName)
-        lpConfigPtr->lpServiceStartName =
-            (LPWSTR)((ULONG_PTR)lpConfigPtr +
-                     (ULONG_PTR)lpConfigPtr->lpServiceStartName);
-
-    if (lpConfigPtr->lpDisplayName)
-        lpConfigPtr->lpDisplayName =
-           (LPWSTR)((ULONG_PTR)lpConfigPtr +
-                    (ULONG_PTR)lpConfigPtr->lpDisplayName);
-
-    TRACE("QueryServiceConfigW() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  QueryServiceConfig2A
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceConfig2A(SC_HANDLE hService,
-                     DWORD dwInfoLevel,
-                     LPBYTE lpBuffer,
-                     DWORD cbBufSize,
-                     LPDWORD pcbBytesNeeded)
-{
-    SERVICE_DESCRIPTIONA ServiceDescription;
-    SERVICE_FAILURE_ACTIONSA ServiceFailureActions;
-    LPBYTE lpTempBuffer;
-    BOOL bUseTempBuffer = FALSE;
-    DWORD dwBufferSize;
-    DWORD dwError;
-
-    TRACE("QueryServiceConfig2A(hService %p, dwInfoLevel %lu, lpBuffer %p, cbBufSize %lu, pcbBytesNeeded %p)\n",
-          hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
-
-    lpTempBuffer = lpBuffer;
-    dwBufferSize = cbBufSize;
-
-    switch (dwInfoLevel)
-    {
-        case SERVICE_CONFIG_DESCRIPTION:
-            if ((lpBuffer == NULL) || (cbBufSize < sizeof(SERVICE_DESCRIPTIONA)))
-            {
-                lpTempBuffer = (LPBYTE)&ServiceDescription;
-                dwBufferSize = sizeof(SERVICE_DESCRIPTIONA);
-                bUseTempBuffer = TRUE;
-            }
-            break;
-
-        case SERVICE_CONFIG_FAILURE_ACTIONS:
-            if ((lpBuffer == NULL) || (cbBufSize < sizeof(SERVICE_FAILURE_ACTIONSA)))
-            {
-                lpTempBuffer = (LPBYTE)&ServiceFailureActions;
-                dwBufferSize = sizeof(SERVICE_FAILURE_ACTIONSA);
-                bUseTempBuffer = TRUE;
-            }
-            break;
-
-        default:
-            WARN("Unknown info level 0x%lx\n", dwInfoLevel);
-            SetLastError(ERROR_INVALID_LEVEL);
-            return FALSE;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceConfig2A((SC_RPC_HANDLE)hService,
-                                        dwInfoLevel,
-                                        lpTempBuffer,
-                                        dwBufferSize,
-                                        pcbBytesNeeded);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RQueryServiceConfig2A() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    if (bUseTempBuffer != FALSE)
-    {
-        TRACE("RQueryServiceConfig2A() returns ERROR_INSUFFICIENT_BUFFER\n");
-        *pcbBytesNeeded = dwBufferSize;
-        SetLastError(ERROR_INSUFFICIENT_BUFFER);
-        return FALSE;
-    }
-
-    switch (dwInfoLevel)
-    {
-        case SERVICE_CONFIG_DESCRIPTION:
-            {
-                LPSERVICE_DESCRIPTIONA lpPtr = (LPSERVICE_DESCRIPTIONA)lpTempBuffer;
-
-                if (lpPtr->lpDescription != NULL)
-                    lpPtr->lpDescription =
-                        (LPSTR)((ULONG_PTR)lpPtr + (ULONG_PTR)lpPtr->lpDescription);
-            }
-            break;
-
-        case SERVICE_CONFIG_FAILURE_ACTIONS:
-            {
-                LPSERVICE_FAILURE_ACTIONSA lpPtr = (LPSERVICE_FAILURE_ACTIONSA)lpTempBuffer;
-
-                if (lpPtr->lpRebootMsg != NULL)
-                    lpPtr->lpRebootMsg =
-                        (LPSTR)((ULONG_PTR)lpPtr + (ULONG_PTR)lpPtr->lpRebootMsg);
-
-                if (lpPtr->lpCommand != NULL)
-                    lpPtr->lpCommand =
-                        (LPSTR)((ULONG_PTR)lpPtr + (ULONG_PTR)lpPtr->lpCommand);
-
-                if (lpPtr->lpsaActions != NULL)
-                    lpPtr->lpsaActions =
-                        (LPSC_ACTION)((ULONG_PTR)lpPtr + (ULONG_PTR)lpPtr->lpsaActions);
-            }
-            break;
-    }
-
-    TRACE("QueryServiceConfig2A() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  QueryServiceConfig2W
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceConfig2W(SC_HANDLE hService,
-                     DWORD dwInfoLevel,
-                     LPBYTE lpBuffer,
-                     DWORD cbBufSize,
-                     LPDWORD pcbBytesNeeded)
-{
-    SERVICE_DESCRIPTIONW ServiceDescription;
-    SERVICE_FAILURE_ACTIONSW ServiceFailureActions;
-    LPBYTE lpTempBuffer;
-    BOOL bUseTempBuffer = FALSE;
-    DWORD dwBufferSize;
-    DWORD dwError;
-
-    TRACE("QueryServiceConfig2W(%p, %lu, %p, %lu, %p)\n",
-           hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
-
-    lpTempBuffer = lpBuffer;
-    dwBufferSize = cbBufSize;
-
-    switch (dwInfoLevel)
-    {
-        case SERVICE_CONFIG_DESCRIPTION:
-            if ((lpBuffer == NULL) || (cbBufSize < sizeof(SERVICE_DESCRIPTIONW)))
-            {
-                lpTempBuffer = (LPBYTE)&ServiceDescription;
-                dwBufferSize = sizeof(SERVICE_DESCRIPTIONW);
-                bUseTempBuffer = TRUE;
-            }
-            break;
-
-        case SERVICE_CONFIG_FAILURE_ACTIONS:
-            if ((lpBuffer == NULL) || (cbBufSize < sizeof(SERVICE_FAILURE_ACTIONSW)))
-            {
-                lpTempBuffer = (LPBYTE)&ServiceFailureActions;
-                dwBufferSize = sizeof(SERVICE_FAILURE_ACTIONSW);
-                bUseTempBuffer = TRUE;
-            }
-            break;
-
-        default:
-            WARN("Unknown info level 0x%lx\n", dwInfoLevel);
-            SetLastError(ERROR_INVALID_LEVEL);
-            return FALSE;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceConfig2W((SC_RPC_HANDLE)hService,
-                                        dwInfoLevel,
-                                        lpTempBuffer,
-                                        dwBufferSize,
-                                        pcbBytesNeeded);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RQueryServiceConfig2W() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    if (bUseTempBuffer != FALSE)
-    {
-        TRACE("RQueryServiceConfig2W() returns ERROR_INSUFFICIENT_BUFFER\n");
-        *pcbBytesNeeded = dwBufferSize;
-        SetLastError(ERROR_INSUFFICIENT_BUFFER);
-        return FALSE;
-    }
-
-    switch (dwInfoLevel)
-    {
-        case SERVICE_CONFIG_DESCRIPTION:
-            {
-                LPSERVICE_DESCRIPTIONW lpPtr = (LPSERVICE_DESCRIPTIONW)lpTempBuffer;
-
-                if (lpPtr->lpDescription != NULL)
-                    lpPtr->lpDescription =
-                        (LPWSTR)((ULONG_PTR)lpPtr + (ULONG_PTR)lpPtr->lpDescription);
-            }
-            break;
-
-        case SERVICE_CONFIG_FAILURE_ACTIONS:
-            {
-                LPSERVICE_FAILURE_ACTIONSW lpPtr = (LPSERVICE_FAILURE_ACTIONSW)lpTempBuffer;
-
-                if (lpPtr->lpRebootMsg != NULL)
-                    lpPtr->lpRebootMsg =
-                        (LPWSTR)((ULONG_PTR)lpPtr + (ULONG_PTR)lpPtr->lpRebootMsg);
-
-                if (lpPtr->lpCommand != NULL)
-                    lpPtr->lpCommand =
-                        (LPWSTR)((ULONG_PTR)lpPtr + (ULONG_PTR)lpPtr->lpCommand);
-
-                if (lpPtr->lpsaActions != NULL)
-                    lpPtr->lpsaActions =
-                        (LPSC_ACTION)((ULONG_PTR)lpPtr + (ULONG_PTR)lpPtr->lpsaActions);
-            }
-            break;
-    }
-
-    TRACE("QueryServiceConfig2W() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  QueryServiceLockStatusA
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceLockStatusA(SC_HANDLE hSCManager,
-                        LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus,
-                        DWORD cbBufSize,
-                        LPDWORD pcbBytesNeeded)
-{
-    QUERY_SERVICE_LOCK_STATUSA LockStatus;
-    LPQUERY_SERVICE_LOCK_STATUSA lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-
-    TRACE("QueryServiceLockStatusA() called\n");
-
-    if (lpLockStatus == NULL || cbBufSize < sizeof(QUERY_SERVICE_LOCK_STATUSA))
-    {
-        lpStatusPtr = &LockStatus;
-        dwBufferSize = sizeof(QUERY_SERVICE_LOCK_STATUSA);
-    }
-    else
-    {
-        lpStatusPtr = lpLockStatus;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceLockStatusA((SC_RPC_HANDLE)hSCManager,
-                                           (LPBYTE)lpStatusPtr,
-                                           dwBufferSize,
-                                           pcbBytesNeeded);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RQueryServiceLockStatusA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    if (lpStatusPtr->lpLockOwner != NULL)
-    {
-        lpStatusPtr->lpLockOwner =
-            (LPSTR)((ULONG_PTR)lpStatusPtr + (ULONG_PTR)lpStatusPtr->lpLockOwner);
-    }
-
-    TRACE("QueryServiceLockStatusA() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  QueryServiceLockStatusW
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceLockStatusW(SC_HANDLE hSCManager,
-                        LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus,
-                        DWORD cbBufSize,
-                        LPDWORD pcbBytesNeeded)
-{
-    QUERY_SERVICE_LOCK_STATUSW LockStatus;
-    LPQUERY_SERVICE_LOCK_STATUSW lpStatusPtr;
-    DWORD dwBufferSize;
-    DWORD dwError;
-
-    TRACE("QueryServiceLockStatusW() called\n");
-
-    if (lpLockStatus == NULL || cbBufSize < sizeof(QUERY_SERVICE_LOCK_STATUSW))
-    {
-        lpStatusPtr = &LockStatus;
-        dwBufferSize = sizeof(QUERY_SERVICE_LOCK_STATUSW);
-    }
-    else
-    {
-        lpStatusPtr = lpLockStatus;
-        dwBufferSize = cbBufSize;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceLockStatusW((SC_RPC_HANDLE)hSCManager,
-                                           (LPBYTE)lpStatusPtr,
-                                           dwBufferSize,
-                                           pcbBytesNeeded);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RQueryServiceLockStatusW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    if (lpStatusPtr->lpLockOwner != NULL)
-    {
-        lpStatusPtr->lpLockOwner =
-            (LPWSTR)((ULONG_PTR)lpStatusPtr + (ULONG_PTR)lpStatusPtr->lpLockOwner);
-    }
-
-    TRACE("QueryServiceLockStatusW() done\n");
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  QueryServiceObjectSecurity
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceObjectSecurity(SC_HANDLE hService,
-                           SECURITY_INFORMATION dwSecurityInformation,
-                           PSECURITY_DESCRIPTOR lpSecurityDescriptor,
-                           DWORD cbBufSize,
-                           LPDWORD pcbBytesNeeded)
-{
-    DWORD dwError;
-
-    TRACE("QueryServiceObjectSecurity(%p, %lu, %p)\n",
-           hService, dwSecurityInformation, lpSecurityDescriptor);
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceObjectSecurity((SC_RPC_HANDLE)hService,
-                                              dwSecurityInformation,
-                                              (LPBYTE)lpSecurityDescriptor,
-                                              cbBufSize,
-                                              pcbBytesNeeded);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("QueryServiceObjectSecurity() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-/**********************************************************************
- *  SetServiceObjectSecurity
- *
- * @implemented
- */
-BOOL WINAPI
-SetServiceObjectSecurity(SC_HANDLE hService,
-                         SECURITY_INFORMATION dwSecurityInformation,
-                         PSECURITY_DESCRIPTOR lpSecurityDescriptor)
-{
-    PSECURITY_DESCRIPTOR SelfRelativeSD = NULL;
-    ULONG Length;
-    NTSTATUS Status;
-    DWORD dwError;
-
-    Length = 0;
-    Status = RtlMakeSelfRelativeSD(lpSecurityDescriptor,
-                                   SelfRelativeSD,
-                                   &Length);
-    if (Status != STATUS_BUFFER_TOO_SMALL)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-
-    SelfRelativeSD = HeapAlloc(GetProcessHeap(), 0, Length);
-    if (SelfRelativeSD == NULL)
-    {
-        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-        return FALSE;
-    }
-
-    Status = RtlMakeSelfRelativeSD(lpSecurityDescriptor,
-                                   SelfRelativeSD,
-                                   &Length);
-    if (!NT_SUCCESS(Status))
-    {
-        HeapFree(GetProcessHeap(), 0, SelfRelativeSD);
-        SetLastError(RtlNtStatusToDosError(Status));
-        return FALSE;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RSetServiceObjectSecurity((SC_RPC_HANDLE)hService,
-                                            dwSecurityInformation,
-                                            (LPBYTE)SelfRelativeSD,
-                                            Length);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    HeapFree(GetProcessHeap(), 0, SelfRelativeSD);
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RServiceObjectSecurity() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  QueryServiceStatus
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceStatus(SC_HANDLE hService,
-                   LPSERVICE_STATUS lpServiceStatus)
-{
-    DWORD dwError;
-
-    TRACE("QueryServiceStatus(%p, %p)\n",
-           hService, lpServiceStatus);
-
-    if (!hService)
-    {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceStatus((SC_RPC_HANDLE)hService,
-                                      lpServiceStatus);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RQueryServiceStatus() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  QueryServiceStatusEx
- *
- * @implemented
- */
-BOOL WINAPI
-QueryServiceStatusEx(SC_HANDLE hService,
-                     SC_STATUS_TYPE InfoLevel,
-                     LPBYTE lpBuffer,
-                     DWORD cbBufSize,
-                     LPDWORD pcbBytesNeeded)
-{
-    DWORD dwError;
-
-    TRACE("QueryServiceStatusEx() called\n");
-
-    if (InfoLevel != SC_STATUS_PROCESS_INFO)
-    {
-        SetLastError(ERROR_INVALID_LEVEL);
-        return FALSE;
-    }
-
-    if (cbBufSize < sizeof(SERVICE_STATUS_PROCESS))
-    {
-        *pcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS);
-        SetLastError(ERROR_INSUFFICIENT_BUFFER);
-        return FALSE;
-    }
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RQueryServiceStatusEx((SC_RPC_HANDLE)hService,
-                                        InfoLevel,
-                                        lpBuffer,
-                                        cbBufSize,
-                                        pcbBytesNeeded);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RQueryServiceStatusEx() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  StartServiceA
- *
- * @implemented
- */
-BOOL WINAPI
-StartServiceA(SC_HANDLE hService,
-              DWORD dwNumServiceArgs,
-              LPCSTR *lpServiceArgVectors)
-{
-    DWORD dwError;
-
-    RpcTryExcept
-    {
-        dwError = RStartServiceA((SC_RPC_HANDLE)hService,
-                                 dwNumServiceArgs,
-                                 (LPSTRING_PTRSA)lpServiceArgVectors);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        ERR("RStartServiceA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  StartServiceW
- *
- * @implemented
- */
-BOOL WINAPI
-StartServiceW(SC_HANDLE hService,
-              DWORD dwNumServiceArgs,
-              LPCWSTR *lpServiceArgVectors)
-{
-    DWORD dwError;
-
-    RpcTryExcept
-    {
-        dwError = RStartServiceW((SC_RPC_HANDLE)hService,
-                                 dwNumServiceArgs,
-                                 (LPSTRING_PTRSW)lpServiceArgVectors);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        ERR("RStartServiceW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  UnlockServiceDatabase
- *
- * @implemented
- */
-BOOL WINAPI
-UnlockServiceDatabase(SC_LOCK ScLock)
-{
-    DWORD dwError;
-
-    TRACE("UnlockServiceDatabase(%x)\n", ScLock);
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RUnlockServiceDatabase((LPSC_RPC_LOCK)&ScLock);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError == ERROR_INVALID_HANDLE)
-        dwError = ERROR_INVALID_SERVICE_LOCK;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("RUnlockServiceDatabase() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-/**********************************************************************
- *  NotifyBootConfigStatus
- *
- * @implemented
- */
-BOOL WINAPI
-NotifyBootConfigStatus(BOOL BootAcceptable)
-{
-    DWORD dwError;
-
-    TRACE("NotifyBootConfigStatus()\n");
-
-    RpcTryExcept
-    {
-        /* Call to services.exe using RPC */
-        dwError = RNotifyBootConfigStatus(NULL,
-                                          BootAcceptable);
-    }
-    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
-    {
-        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
-    }
-    RpcEndExcept;
-
-    if (dwError != ERROR_SUCCESS)
-    {
-        TRACE("NotifyBootConfigStatus() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-/* EOF */