ERR -> TRACE
[reactos.git] / reactos / dll / win32 / advapi32 / service / scm.c
index 4a1ad32..beb5be0 100644 (file)
@@ -21,16 +21,124 @@ WINE_DEFAULT_DEBUG_CHANNEL(advapi);
 
 /* FUNCTIONS *****************************************************************/
 
-handle_t BindingHandle = NULL;
+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((UCHAR *)szMachineName,
+                                      (UCHAR *)"ncacn_np",
+                                      NULL,
+                                      (UCHAR *)"\\pipe\\ntsvcs",
+                                      NULL,
+                                      (UCHAR **)&pszStringBinding);
+    if (status)
+    {
+        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)
+    {
+        ERR("RpcBindingFromStringBinding returned 0x%x\n", status);
+    }
+
+    status = RpcStringFreeA(&pszStringBinding);
+    if (status)
+    {
+        ERR("RpcStringFree returned 0x%x\n", status);
+    }
+
+    return hBinding;
+}
+
 
-VOID
-HandleBind(VOID)
+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)
+    {
+        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;
 
-    if (BindingHandle != NULL)
-        return;
+    TRACE("SVCCTL_HANDLEW_bind() called\n");
+
+    status = RpcStringBindingComposeW(szMachineName,
+                                      L"ncacn_np",
+                                      NULL,
+                                      L"\\pipe\\ntsvcs",
+                                      NULL,
+                                      &pszStringBinding);
+    if (status)
+    {
+        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)
+    {
+        ERR("RpcBindingFromStringBinding returned 0x%x\n", status);
+    }
+
+    status = RpcStringFreeW(&pszStringBinding);
+    if (status)
+    {
+        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)
+    {
+        ERR("RpcBindingFree returned 0x%x\n", status);
+    }
+}
+
+
+handle_t __RPC_USER
+RPC_SERVICE_STATUS_HANDLE_bind(RPC_SERVICE_STATUS_HANDLE hServiceStatus)
+{
+    handle_t hBinding = NULL;
+    LPWSTR pszStringBinding;
+    RPC_STATUS status;
+
+    TRACE("RPC_SERVICE_STATUS_HANDLE_bind() called\n");
 
     status = RpcStringBindingComposeW(NULL,
                                       L"ncacn_np",
@@ -40,42 +148,62 @@ HandleBind(VOID)
                                       &pszStringBinding);
     if (status)
     {
-        TRACE("RpcStringBindingCompose returned 0x%x\n", status);
-        return;
+        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,
-                                          &BindingHandle);
+                                          &hBinding);
     if (status)
     {
-        TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
+        ERR("RpcBindingFromStringBinding returned 0x%x\n", status);
     }
 
     status = RpcStringFreeW(&pszStringBinding);
     if (status)
     {
-        TRACE("RpcStringFree returned 0x%x\n", status);
+        ERR("RpcStringFree returned 0x%x\n", status);
     }
+
+    return hBinding;
 }
 
 
-#if 0
-static VOID
-HandleUnbind(VOID)
+void __RPC_USER
+RPC_SERVICE_STATUS_HANDLE_unbind(RPC_SERVICE_STATUS_HANDLE hServiceStatus,
+                                 handle_t hBinding)
 {
     RPC_STATUS status;
 
-    if (BindingHandle == NULL)
-        return;
+    TRACE("RPC_SERVICE_STATUS_HANDLE_unbind() called\n");
 
-    status = RpcBindingFree(&BindingHandle);
+    status = RpcBindingFree(&hBinding);
     if (status)
     {
-        TRACE("RpcBindingFree returned 0x%x\n", status);
+        ERR("RpcBindingFree returned 0x%x\n", status);
+    }
+}
+
+
+DWORD
+ScmRpcStatusToWinError(RPC_STATUS Status)
+{
+    switch (Status)
+    {
+        case RPC_X_SS_IN_NULL_CONTEXT:
+            return ERROR_INVALID_HANDLE;
+
+        case RPC_X_NULL_REF_POINTER:
+            return ERROR_INVALID_PARAMETER;
+
+        case STATUS_ACCESS_VIOLATION:
+            return ERROR_INVALID_ADDRESS;
+
+        default:
+            return (DWORD)Status;
     }
 }
-#endif
 
 
 /**********************************************************************
@@ -114,11 +242,17 @@ ChangeServiceConfig2A(SC_HANDLE hService,
     if (lpInfo == NULL)
         return TRUE;
 
-    HandleBind();
+    _SEH_TRY
+    {
+        dwError = RChangeServiceConfig2A((SC_RPC_HANDLE)hService,
+                                         Info);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = RChangeServiceConfig2A(BindingHandle,
-                                     (SC_RPC_HANDLE)hService,
-                                     Info);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RChangeServiceConfig2A() failed (Error %lu)\n", dwError);
@@ -168,11 +302,17 @@ ChangeServiceConfig2W(SC_HANDLE hService,
     if (lpInfo == NULL)
         return TRUE;
 
-    HandleBind();
+    _SEH_TRY
+    {
+        dwError = RChangeServiceConfig2W((SC_RPC_HANDLE)hService,
+                                         Info);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = RChangeServiceConfig2W(BindingHandle,
-                                     (SC_RPC_HANDLE)hService,
-                                     Info);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RChangeServiceConfig2W() failed (Error %lu)\n", dwError);
@@ -224,23 +364,29 @@ ChangeServiceConfigA(SC_HANDLE hService,
 
     /* FIXME: Encrypt the password */
 
-    HandleBind();
-
-    /* Call to services.exe using RPC */
-    dwError = RChangeServiceConfigA(BindingHandle,
-                                    (SC_RPC_HANDLE)hService,
-                                    dwServiceType,
-                                    dwStartType,
-                                    dwErrorControl,
-                                    (LPSTR)lpBinaryPathName,
-                                    (LPSTR)lpLoadOrderGroup,
-                                    lpdwTagId,
-                                    (LPSTR)lpDependencies,
-                                    dwDependenciesLength,
-                                    (LPSTR)lpServiceStartName,
-                                    NULL,              /* FIXME: lpPassword */
-                                    0,                 /* FIXME: dwPasswordLength */
-                                    (LPSTR)lpDisplayName);
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RChangeServiceConfigA((SC_RPC_HANDLE)hService,
+                                        dwServiceType,
+                                        dwStartType,
+                                        dwErrorControl,
+                                        (LPSTR)lpBinaryPathName,
+                                        (LPSTR)lpLoadOrderGroup,
+                                        lpdwTagId,
+                                        (LPSTR)lpDependencies,
+                                        dwDependenciesLength,
+                                        (LPSTR)lpServiceStartName,
+                                        NULL,              /* FIXME: lpPassword */
+                                        0,                 /* FIXME: dwPasswordLength */
+                                        (LPSTR)lpDisplayName);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
+
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RChangeServiceConfigA() failed (Error %lu)\n", dwError);
@@ -292,23 +438,29 @@ ChangeServiceConfigW(SC_HANDLE hService,
 
     /* FIXME: Encrypt the password */
 
-    HandleBind();
-
-    /* Call to services.exe using RPC */
-    dwError = RChangeServiceConfigW(BindingHandle,
-                                    (SC_RPC_HANDLE)hService,
-                                    dwServiceType,
-                                    dwStartType,
-                                    dwErrorControl,
-                                    (LPWSTR)lpBinaryPathName,
-                                    (LPWSTR)lpLoadOrderGroup,
-                                    lpdwTagId,
-                                    (LPBYTE)lpDependencies,
-                                    dwDependenciesLength,
-                                    (LPWSTR)lpServiceStartName,
-                                    NULL,              /* FIXME: lpPassword */
-                                    0,                 /* FIXME: dwPasswordLength */
-                                    (LPWSTR)lpDisplayName);
+    _SEH_TRY
+    {
+        /* 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,
+                                        NULL,              /* FIXME: lpPassword */
+                                        0,                 /* FIXME: dwPasswordLength */
+                                        (LPWSTR)lpDisplayName);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
+
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RChangeServiceConfigW() failed (Error %lu)\n", dwError);
@@ -332,11 +484,17 @@ CloseServiceHandle(SC_HANDLE hSCObject)
 
     TRACE("CloseServiceHandle() called\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RCloseServiceHandle((LPSC_RPC_HANDLE)&hSCObject);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RCloseServiceHandle(BindingHandle,
-                                  (LPSC_RPC_HANDLE)&hSCObject);
     if (dwError)
     {
         ERR("RCloseServiceHandle() failed (Error %lu)\n", dwError);
@@ -365,13 +523,19 @@ ControlService(SC_HANDLE hService,
     TRACE("ControlService(%x, %x, %p)\n",
            hService, dwControl, lpServiceStatus);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RControlService((SC_RPC_HANDLE)hService,
+                                  dwControl,
+                                  lpServiceStatus);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RControlService(BindingHandle,
-                              (SC_RPC_HANDLE)hService,
-                              dwControl,
-                              lpServiceStatus);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RControlService() failed (Error %lu)\n", dwError);
@@ -403,7 +567,6 @@ ControlServiceEx(IN SC_HANDLE hService,
 }
 
 
-
 /**********************************************************************
  *  CreateServiceA
  *
@@ -502,7 +665,7 @@ CreateServiceA(SC_HANDLE hSCManager,
             SetLastError(ERROR_NOT_ENOUGH_MEMORY);
             goto cleanup;
         }
-        MultiByteToWideChar(CP_ACP, 0, lpDependencies, -1, lpDependenciesW, dwDependenciesLength);
+        MultiByteToWideChar(CP_ACP, 0, lpDependencies, dwDependenciesLength, lpDependenciesW, dwDependenciesLength);
     }
 
     if (lpServiceStartName)
@@ -614,26 +777,32 @@ CreateServiceW(SC_HANDLE hSCManager,
 
     /* FIXME: Encrypt the password */
 
-    HandleBind();
-
-    /* Call to services.exe using RPC */
-    dwError = RCreateServiceW(BindingHandle,
-                              (SC_RPC_HANDLE)hSCManager,
-                              (LPWSTR)lpServiceName,
-                              (LPWSTR)lpDisplayName,
-                              dwDesiredAccess,
-                              dwServiceType,
-                              dwStartType,
-                              dwErrorControl,
-                              (LPWSTR)lpBinaryPathName,
-                              (LPWSTR)lpLoadOrderGroup,
-                              lpdwTagId,
-                              (LPBYTE)lpDependencies,
-                              dwDependenciesLength,
-                              (LPWSTR)lpServiceStartName,
-                              NULL,              /* FIXME: lpPassword */
-                              0,                 /* FIXME: dwPasswordLength */
-                              (SC_RPC_HANDLE *)&hService);
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RCreateServiceW((SC_RPC_HANDLE)hSCManager,
+                                  (LPWSTR)lpServiceName,
+                                  (LPWSTR)lpDisplayName,
+                                  dwDesiredAccess,
+                                  dwServiceType,
+                                  dwStartType,
+                                  dwErrorControl,
+                                  (LPWSTR)lpBinaryPathName,
+                                  (LPWSTR)lpLoadOrderGroup,
+                                  lpdwTagId,
+                                  (LPBYTE)lpDependencies,
+                                  dwDependenciesLength,
+                                  (LPWSTR)lpServiceStartName,
+                                  NULL,              /* FIXME: lpPassword */
+                                  0,                 /* FIXME: dwPasswordLength */
+                                  (SC_RPC_HANDLE *)&hService);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
+
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RCreateServiceW() failed (Error %lu)\n", dwError);
@@ -657,11 +826,17 @@ DeleteService(SC_HANDLE hService)
 
     TRACE("DeleteService(%x)\n", hService);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RDeleteService((SC_RPC_HANDLE)hService);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RDeleteService(BindingHandle,
-                             (SC_RPC_HANDLE)hService);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RDeleteService() failed (Error %lu)\n", dwError);
@@ -687,20 +862,32 @@ EnumDependentServicesA(SC_HANDLE hService,
                        LPDWORD lpServicesReturned)
 {
     LPENUM_SERVICE_STATUSA lpStatusPtr;
-    DWORD dwError = ERROR_SUCCESS;
+    DWORD dwError;
     DWORD dwCount;
 
     TRACE("EnumServicesStatusA() called\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        dwError = REnumDependentServicesA((SC_RPC_HANDLE)hService,
+                                          dwServiceState,
+                                          (LPBYTE)lpServices,
+                                          cbBufSize,
+                                          pcbBytesNeeded,
+                                          lpServicesReturned);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = REnumDependentServicesA(BindingHandle,
-                                      (SC_RPC_HANDLE)hService,
-                                      dwServiceState,
-                                      (LPBYTE)lpServices,
-                                      cbBufSize,
-                                      pcbBytesNeeded,
-                                      lpServicesReturned);
+    if (dwError != ERROR_SUCCESS)
+    {
+        ERR("REnumDependentServicesA() failed (Error %lu)\n", dwError);
+        SetLastError(dwError);
+        return FALSE;
+    }
 
     lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpServices;
     for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
@@ -716,13 +903,6 @@ EnumDependentServicesA(SC_HANDLE hService,
         lpStatusPtr++;
     }
 
-    if (dwError != ERROR_SUCCESS)
-    {
-        ERR("REnumDependentServicesA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
     TRACE("EnumDependentServicesA() done\n");
 
     return TRUE;
@@ -743,20 +923,32 @@ EnumDependentServicesW(SC_HANDLE hService,
                        LPDWORD lpServicesReturned)
 {
     LPENUM_SERVICE_STATUSW lpStatusPtr;
-    DWORD dwError = ERROR_SUCCESS;
+    DWORD dwError;
     DWORD dwCount;
 
     TRACE("EnumServicesStatusW() called\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        dwError = REnumDependentServicesW((SC_RPC_HANDLE)hService,
+                                          dwServiceState,
+                                          (LPBYTE)lpServices,
+                                          cbBufSize,
+                                          pcbBytesNeeded,
+                                          lpServicesReturned);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = REnumDependentServicesW(BindingHandle,
-                                      (SC_RPC_HANDLE)hService,
-                                      dwServiceState,
-                                      (LPBYTE)lpServices,
-                                      cbBufSize,
-                                      pcbBytesNeeded,
-                                      lpServicesReturned);
+    if (dwError != ERROR_SUCCESS)
+    {
+        ERR("REnumDependentServicesW() failed (Error %lu)\n", dwError);
+        SetLastError(dwError);
+        return FALSE;
+    }
 
     lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices;
     for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
@@ -772,13 +964,6 @@ EnumDependentServicesW(SC_HANDLE hService,
         lpStatusPtr++;
     }
 
-    if (dwError != ERROR_SUCCESS)
-    {
-        ERR("REnumDependentServicesW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
     TRACE("EnumDependentServicesW() done\n");
 
     return TRUE;
@@ -825,22 +1010,34 @@ EnumServicesStatusA(SC_HANDLE hSCManager,
                     LPDWORD lpResumeHandle)
 {
     LPENUM_SERVICE_STATUSA lpStatusPtr;
-    DWORD dwError = ERROR_SUCCESS;
+    DWORD dwError;
     DWORD dwCount;
 
     TRACE("EnumServicesStatusA() called\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        dwError = REnumServicesStatusA((SC_RPC_HANDLE)hSCManager,
+                                       dwServiceType,
+                                       dwServiceState,
+                                       (LPBYTE)lpServices,
+                                       cbBufSize,
+                                       pcbBytesNeeded,
+                                       lpServicesReturned,
+                                       lpResumeHandle);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = REnumServicesStatusA(BindingHandle,
-                                   (SC_RPC_HANDLE)hSCManager,
-                                   dwServiceType,
-                                   dwServiceState,
-                                   (LPBYTE)lpServices,
-                                   cbBufSize,
-                                   pcbBytesNeeded,
-                                   lpServicesReturned,
-                                   lpResumeHandle);
+    if (dwError != ERROR_SUCCESS)
+    {
+        ERR("REnumServicesStatusA() failed (Error %lu)\n", dwError);
+        SetLastError(dwError);
+        return FALSE;
+    }
 
     lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpServices;
     for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
@@ -856,13 +1053,6 @@ EnumServicesStatusA(SC_HANDLE hSCManager,
         lpStatusPtr++;
     }
 
-    if (dwError != ERROR_SUCCESS)
-    {
-        ERR("REnumServicesStatusA() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
     TRACE("EnumServicesStatusA() done\n");
 
     return TRUE;
@@ -885,22 +1075,34 @@ EnumServicesStatusW(SC_HANDLE hSCManager,
                     LPDWORD lpResumeHandle)
 {
     LPENUM_SERVICE_STATUSW lpStatusPtr;
-    DWORD dwError = ERROR_SUCCESS;
+    DWORD dwError;
     DWORD dwCount;
 
     TRACE("EnumServicesStatusW() called\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        dwError = REnumServicesStatusW((SC_RPC_HANDLE)hSCManager,
+                                       dwServiceType,
+                                       dwServiceState,
+                                       (LPBYTE)lpServices,
+                                       cbBufSize,
+                                       pcbBytesNeeded,
+                                       lpServicesReturned,
+                                       lpResumeHandle);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = REnumServicesStatusW(BindingHandle,
-                                   (SC_RPC_HANDLE)hSCManager,
-                                   dwServiceType,
-                                   dwServiceState,
-                                   (LPBYTE)lpServices,
-                                   cbBufSize,
-                                   pcbBytesNeeded,
-                                   lpServicesReturned,
-                                   lpResumeHandle);
+    if (dwError != ERROR_SUCCESS)
+    {
+        ERR("REnumServicesStatusW() failed (Error %lu)\n", dwError);
+        SetLastError(dwError);
+        return FALSE;
+    }
 
     lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices;
     for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
@@ -916,13 +1118,6 @@ EnumServicesStatusW(SC_HANDLE hSCManager,
         lpStatusPtr++;
     }
 
-    if (dwError != ERROR_SUCCESS)
-    {
-        ERR("REnumServicesStatusW() failed (Error %lu)\n", dwError);
-        SetLastError(dwError);
-        return FALSE;
-    }
-
     TRACE("EnumServicesStatusW() done\n");
 
     return TRUE;
@@ -947,24 +1142,29 @@ EnumServicesStatusExA(SC_HANDLE hSCManager,
                       LPCSTR pszGroupName)
 {
     LPENUM_SERVICE_STATUS_PROCESSA lpStatusPtr;
-    DWORD dwError = ERROR_SUCCESS;
+    DWORD dwError;
     DWORD dwCount;
 
     TRACE("EnumServicesStatusExA() called\n");
 
-    HandleBind();
-
-    dwError = REnumServicesStatusExA(BindingHandle,
-                                     (SC_RPC_HANDLE)hSCManager,
-                                     InfoLevel,
-                                     dwServiceType,
-                                     dwServiceState,
-                                     (LPBYTE)lpServices,
-                                     cbBufSize,
-                                     pcbBytesNeeded,
-                                     lpServicesReturned,
-                                     lpResumeHandle,
-                                     (LPSTR)pszGroupName);
+    _SEH_TRY
+    {
+        dwError = REnumServicesStatusExA((SC_RPC_HANDLE)hSCManager,
+                                         InfoLevel,
+                                         dwServiceType,
+                                         dwServiceState,
+                                         (LPBYTE)lpServices,
+                                         cbBufSize,
+                                         pcbBytesNeeded,
+                                         lpServicesReturned,
+                                         lpResumeHandle,
+                                         (LPSTR)pszGroupName);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
     if (dwError == ERROR_MORE_DATA)
     {
@@ -1019,24 +1219,29 @@ EnumServicesStatusExW(SC_HANDLE hSCManager,
                       LPCWSTR pszGroupName)
 {
     LPENUM_SERVICE_STATUS_PROCESSW lpStatusPtr;
-    DWORD dwError = ERROR_SUCCESS;
+    DWORD dwError;
     DWORD dwCount;
 
     TRACE("EnumServicesStatusExW() called\n");
 
-    HandleBind();
-
-    dwError = REnumServicesStatusExW(BindingHandle,
-                                     (SC_RPC_HANDLE)hSCManager,
-                                     InfoLevel,
-                                     dwServiceType,
-                                     dwServiceState,
-                                     (LPBYTE)lpServices,
-                                     cbBufSize,
-                                     pcbBytesNeeded,
-                                     lpServicesReturned,
-                                     lpResumeHandle,
-                                     (LPWSTR)pszGroupName);
+    _SEH_TRY
+    {
+        dwError = REnumServicesStatusExW((SC_RPC_HANDLE)hSCManager,
+                                         InfoLevel,
+                                         dwServiceType,
+                                         dwServiceState,
+                                         (LPBYTE)lpServices,
+                                         cbBufSize,
+                                         pcbBytesNeeded,
+                                         lpServicesReturned,
+                                         lpResumeHandle,
+                                         (LPWSTR)pszGroupName);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
     if (dwError == ERROR_MORE_DATA)
     {
@@ -1088,13 +1293,25 @@ GetServiceDisplayNameA(SC_HANDLE hSCManager,
 
     TRACE("GetServiceDisplayNameA() called\n");
 
-    HandleBind();
+    if (!lpDisplayName)
+        *lpcchBuffer = 0;
+
+    _SEH_TRY
+    {
+        dwError = RGetServiceDisplayNameA((SC_RPC_HANDLE)hSCManager,
+                                          (LPSTR)lpServiceName,
+                                          lpDisplayName,
+                                          lpcchBuffer);
+    }
+    _SEH_HANDLE
+    {
+        /* HACK: because of a problem with rpcrt4, rpcserver is hacked to return 6 for ERROR_SERVICE_DOES_NOT_EXIST */
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+
+
+    _SEH_END;
 
-    dwError = RGetServiceDisplayNameA(BindingHandle,
-                                      (SC_RPC_HANDLE)hSCManager,
-                                      (LPSTR)lpServiceName,
-                                      lpDisplayName,
-                                      lpcchBuffer);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RGetServiceDisplayNameA() failed (Error %lu)\n", dwError);
@@ -1102,8 +1319,6 @@ GetServiceDisplayNameA(SC_HANDLE hSCManager,
         return FALSE;
     }
 
-    (*lpcchBuffer)--;
-
     return TRUE;
 }
 
@@ -1123,13 +1338,22 @@ GetServiceDisplayNameW(SC_HANDLE hSCManager,
 
     TRACE("GetServiceDisplayNameW() called\n");
 
-    HandleBind();
+    if (!lpDisplayName)
+        *lpcchBuffer = 0;
+
+    _SEH_TRY
+    {
+        dwError = RGetServiceDisplayNameW((SC_RPC_HANDLE)hSCManager,
+                                          (LPWSTR)lpServiceName,
+                                          lpDisplayName,
+                                          lpcchBuffer);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = RGetServiceDisplayNameW(BindingHandle,
-                                      (SC_RPC_HANDLE)hSCManager,
-                                      (LPWSTR)lpServiceName,
-                                      lpDisplayName,
-                                      lpcchBuffer);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RGetServiceDisplayNameW() failed (Error %lu)\n", dwError);
@@ -1137,8 +1361,6 @@ GetServiceDisplayNameW(SC_HANDLE hSCManager,
         return FALSE;
     }
 
-    (*lpcchBuffer)--;
-
     return TRUE;
 }
 
@@ -1158,13 +1380,22 @@ GetServiceKeyNameA(SC_HANDLE hSCManager,
 
     TRACE("GetServiceKeyNameA() called\n");
 
-    HandleBind();
+    if (!lpServiceName)
+        *lpcchBuffer = 0;
+
+    _SEH_TRY
+    {
+        dwError = RGetServiceKeyNameA((SC_RPC_HANDLE)hSCManager,
+                                      (LPSTR)lpDisplayName,
+                                      lpServiceName,
+                                      lpcchBuffer);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = RGetServiceKeyNameA(BindingHandle,
-                                  (SC_RPC_HANDLE)hSCManager,
-                                  (LPSTR)lpDisplayName,
-                                  lpServiceName,
-                                  lpcchBuffer);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RGetServiceKeyNameA() failed (Error %lu)\n", dwError);
@@ -1172,8 +1403,6 @@ GetServiceKeyNameA(SC_HANDLE hSCManager,
         return FALSE;
     }
 
-    (*lpcchBuffer)--;
-
     return TRUE;
 }
 
@@ -1193,13 +1422,22 @@ GetServiceKeyNameW(SC_HANDLE hSCManager,
 
     TRACE("GetServiceKeyNameW() called\n");
 
-    HandleBind();
+    if (!lpDisplayName)
+        *lpcchBuffer = 0;
+
+    _SEH_TRY
+    {
+        dwError = RGetServiceKeyNameW((SC_RPC_HANDLE)hSCManager,
+                                      (LPWSTR)lpDisplayName,
+                                      lpServiceName,
+                                      lpcchBuffer);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    dwError = RGetServiceKeyNameW(BindingHandle,
-                                  (SC_RPC_HANDLE)hSCManager,
-                                  (LPWSTR)lpDisplayName,
-                                  lpServiceName,
-                                  lpcchBuffer);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RGetServiceKeyNameW() failed (Error %lu)\n", dwError);
@@ -1207,8 +1445,6 @@ GetServiceKeyNameW(SC_HANDLE hSCManager,
         return FALSE;
     }
 
-    (*lpcchBuffer)--;
-
     return TRUE;
 }
 
@@ -1226,12 +1462,18 @@ LockServiceDatabase(SC_HANDLE hSCManager)
 
     TRACE("LockServiceDatabase(%x)\n", hSCManager);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RLockServiceDatabase((SC_RPC_HANDLE)hSCManager,
+                                       (SC_RPC_LOCK *)&hLock);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RLockServiceDatabase(BindingHandle,
-                                   (SC_RPC_HANDLE)hSCManager,
-                                   (SC_RPC_LOCK *)&hLock);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RLockServiceDatabase() failed (Error %lu)\n", dwError);
@@ -1303,14 +1545,20 @@ OpenSCManagerA(LPCSTR lpMachineName,
 
     WaitForSCManager();
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = ROpenSCManagerA((LPSTR)lpMachineName,
+                                  (LPSTR)lpDatabaseName,
+                                  dwDesiredAccess,
+                                  (SC_RPC_HANDLE *)&hScm);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = ROpenSCManagerA(BindingHandle,
-                              (LPSTR)lpMachineName,
-                              (LPSTR)lpDatabaseName,
-                              dwDesiredAccess,
-                              (SC_RPC_HANDLE *)&hScm);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("ROpenSCManagerA() failed (Error %lu)\n", dwError);
@@ -1342,14 +1590,20 @@ OpenSCManagerW(LPCWSTR lpMachineName,
 
     WaitForSCManager();
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = ROpenSCManagerW((LPWSTR)lpMachineName,
+                                  (LPWSTR)lpDatabaseName,
+                                  dwDesiredAccess,
+                                  (SC_RPC_HANDLE *)&hScm);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = ROpenSCManagerW(BindingHandle,
-                              (LPWSTR)lpMachineName,
-                              (LPWSTR)lpDatabaseName,
-                              dwDesiredAccess,
-                              (SC_RPC_HANDLE *)&hScm);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("ROpenSCManagerW() failed (Error %lu)\n", dwError);
@@ -1379,14 +1633,20 @@ OpenServiceA(SC_HANDLE hSCManager,
     TRACE("OpenServiceA(%p, %s, %lx)\n",
            hSCManager, lpServiceName, dwDesiredAccess);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = ROpenServiceA((SC_RPC_HANDLE)hSCManager,
+                                (LPSTR)lpServiceName,
+                                dwDesiredAccess,
+                                (SC_RPC_HANDLE *)&hService);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = ROpenServiceA(BindingHandle,
-                            (SC_RPC_HANDLE)hSCManager,
-                            (LPSTR)lpServiceName,
-                            dwDesiredAccess,
-                            (SC_RPC_HANDLE *)&hService);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("ROpenServiceA() failed (Error %lu)\n", dwError);
@@ -1416,14 +1676,20 @@ OpenServiceW(SC_HANDLE hSCManager,
     TRACE("OpenServiceW(%p, %S, %lx)\n",
            hSCManager, lpServiceName, dwDesiredAccess);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = ROpenServiceW((SC_RPC_HANDLE)hSCManager,
+                                (LPWSTR)lpServiceName,
+                                dwDesiredAccess,
+                                (SC_RPC_HANDLE *)&hService);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = ROpenServiceW(BindingHandle,
-                            (SC_RPC_HANDLE)hSCManager,
-                            (LPWSTR)lpServiceName,
-                            dwDesiredAccess,
-                            (SC_RPC_HANDLE *)&hService);
     if (dwError != ERROR_SUCCESS)
     {
         if (dwError == ERROR_SERVICE_DOES_NOT_EXIST)
@@ -1456,14 +1722,20 @@ QueryServiceConfigA(SC_HANDLE hService,
     TRACE("QueryServiceConfigA(%p, %p, %lu, %p)\n",
            hService, lpServiceConfig, cbBufSize, pcbBytesNeeded);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceConfigA((SC_RPC_HANDLE)hService,
+                                       (LPBYTE)lpServiceConfig,
+                                       cbBufSize,
+                                       pcbBytesNeeded);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceConfigA(BindingHandle,
-                                   (SC_RPC_HANDLE)hService,
-                                   lpServiceConfig,
-                                   cbBufSize,
-                                   pcbBytesNeeded);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RQueryServiceConfigA() failed (Error %lu)\n", dwError);
@@ -1519,14 +1791,20 @@ QueryServiceConfigW(SC_HANDLE hService,
     TRACE("QueryServiceConfigW(%p, %p, %lu, %p)\n",
            hService, lpServiceConfig, cbBufSize, pcbBytesNeeded);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceConfigW((SC_RPC_HANDLE)hService,
+                                       (LPBYTE)lpServiceConfig,
+                                       cbBufSize,
+                                       pcbBytesNeeded);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceConfigW(BindingHandle,
-                                   (SC_RPC_HANDLE)hService,
-                                   (LPBYTE)lpServiceConfig,
-                                   cbBufSize,
-                                   pcbBytesNeeded);
     if (dwError != ERROR_SUCCESS)
     {
         if (dwError == ERROR_INSUFFICIENT_BUFFER)
@@ -1586,15 +1864,35 @@ QueryServiceConfig2A(SC_HANDLE hService,
     TRACE("QueryServiceConfig2A(%p, %lu, %p, %lu, %p)\n",
            hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
 
-    HandleBind();
+    if (dwInfoLevel != SERVICE_CONFIG_DESCRIPTION &&
+        dwInfoLevel != SERVICE_CONFIG_FAILURE_ACTIONS)
+    {
+        SetLastError(ERROR_INVALID_LEVEL);
+        return FALSE;
+    }
+
+    if ((lpBuffer == NULL && cbBufSize != 0) ||
+        pcbBytesNeeded == NULL)
+    {
+        SetLastError(ERROR_INVALID_ADDRESS);
+        return FALSE;
+    }
+
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceConfig2A((SC_RPC_HANDLE)hService,
+                                        dwInfoLevel,
+                                        lpBuffer,
+                                        cbBufSize,
+                                        pcbBytesNeeded);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceConfig2A(BindingHandle,
-                                    (SC_RPC_HANDLE)hService,
-                                    dwInfoLevel,
-                                    lpBuffer,
-                                    cbBufSize,
-                                    pcbBytesNeeded);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RQueryServiceConfig2A() failed (Error %lu)\n", dwError);
@@ -1661,15 +1959,35 @@ QueryServiceConfig2W(SC_HANDLE hService,
     TRACE("QueryServiceConfig2W(%p, %lu, %p, %lu, %p)\n",
            hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
 
-    HandleBind();
+    if (dwInfoLevel != SERVICE_CONFIG_DESCRIPTION &&
+        dwInfoLevel != SERVICE_CONFIG_FAILURE_ACTIONS)
+    {
+        SetLastError(ERROR_INVALID_LEVEL);
+        return FALSE;
+    }
+
+    if ((lpBuffer == NULL && cbBufSize != 0) ||
+        pcbBytesNeeded == NULL)
+    {
+        SetLastError(ERROR_INVALID_ADDRESS);
+        return FALSE;
+    }
+
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceConfig2W((SC_RPC_HANDLE)hService,
+                                        dwInfoLevel,
+                                        lpBuffer,
+                                        cbBufSize,
+                                        pcbBytesNeeded);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceConfig2W(BindingHandle,
-                                    (SC_RPC_HANDLE)hService,
-                                    dwInfoLevel,
-                                    lpBuffer,
-                                    cbBufSize,
-                                    pcbBytesNeeded);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RQueryServiceConfig2W() failed (Error %lu)\n", dwError);
@@ -1734,14 +2052,20 @@ QueryServiceLockStatusA(SC_HANDLE hSCManager,
 
     TRACE("QueryServiceLockStatusA() called\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceLockStatusA((SC_RPC_HANDLE)hSCManager,
+                                           lpLockStatus,
+                                           cbBufSize,
+                                           pcbBytesNeeded);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceLockStatusA(BindingHandle,
-                                       (SC_RPC_HANDLE)hSCManager,
-                                       lpLockStatus,
-                                       cbBufSize,
-                                       pcbBytesNeeded);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RQueryServiceLockStatusA() failed (Error %lu)\n", dwError);
@@ -1776,14 +2100,20 @@ QueryServiceLockStatusW(SC_HANDLE hSCManager,
 
     TRACE("QueryServiceLockStatusW() called\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceLockStatusW((SC_RPC_HANDLE)hSCManager,
+                                           lpLockStatus,
+                                           cbBufSize,
+                                           pcbBytesNeeded);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceLockStatusW(BindingHandle,
-                                       (SC_RPC_HANDLE)hSCManager,
-                                       lpLockStatus,
-                                       cbBufSize,
-                                       pcbBytesNeeded);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RQueryServiceLockStatusW() failed (Error %lu)\n", dwError);
@@ -1820,15 +2150,21 @@ QueryServiceObjectSecurity(SC_HANDLE hService,
     TRACE("QueryServiceObjectSecurity(%p, %lu, %p)\n",
            hService, dwSecurityInformation, lpSecurityDescriptor);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceObjectSecurity((SC_RPC_HANDLE)hService,
+                                              dwSecurityInformation,
+                                              (LPBYTE)lpSecurityDescriptor,
+                                              cbBufSize,
+                                              pcbBytesNeeded);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceObjectSecurity(BindingHandle,
-                                          (SC_RPC_HANDLE)hService,
-                                          dwSecurityInformation,
-                                          (LPBYTE)lpSecurityDescriptor,
-                                          cbBufSize,
-                                          pcbBytesNeeded);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("QueryServiceObjectSecurity() failed (Error %lu)\n", dwError);
@@ -1881,14 +2217,19 @@ SetServiceObjectSecurity(SC_HANDLE hService,
         return FALSE;
     }
 
-    HandleBind();
-
-    /* Call to services.exe using RPC */
-    dwError = RSetServiceObjectSecurity(BindingHandle,
-                                        (SC_RPC_HANDLE)hService,
-                                        dwSecurityInformation,
-                                        (LPBYTE)SelfRelativeSD,
-                                        Length);
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RSetServiceObjectSecurity((SC_RPC_HANDLE)hService,
+                                            dwSecurityInformation,
+                                            (LPBYTE)SelfRelativeSD,
+                                            Length);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
     HeapFree(GetProcessHeap(), 0, SelfRelativeSD);
 
@@ -1917,12 +2258,18 @@ QueryServiceStatus(SC_HANDLE hService,
     TRACE("QueryServiceStatus(%p, %p)\n",
            hService, lpServiceStatus);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceStatus((SC_RPC_HANDLE)hService,
+                                      lpServiceStatus);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceStatus(BindingHandle,
-                                  (SC_RPC_HANDLE)hService,
-                                  lpServiceStatus);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RQueryServiceStatus() failed (Error %lu)\n", dwError);
@@ -1950,15 +2297,21 @@ QueryServiceStatusEx(SC_HANDLE hService,
 
     TRACE("QueryServiceStatusEx() called\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RQueryServiceStatusEx((SC_RPC_HANDLE)hService,
+                                        InfoLevel,
+                                        lpBuffer,
+                                        cbBufSize,
+                                        pcbBytesNeeded);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RQueryServiceStatusEx(BindingHandle,
-                                    (SC_RPC_HANDLE)hService,
-                                    InfoLevel,
-                                    lpBuffer,
-                                    cbBufSize,
-                                    pcbBytesNeeded);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RQueryServiceStatusEx() failed (Error %lu)\n", dwError);
@@ -1982,11 +2335,17 @@ StartServiceA(SC_HANDLE hService,
 {
     DWORD dwError;
 
-    dwError = RStartServiceA(BindingHandle,
-                             (SC_RPC_HANDLE)hService,
-                             dwNumServiceArgs,
-                             (LPSTRING_PTRSA)lpServiceArgVectors);
-
+    _SEH_TRY
+    {
+        dwError = RStartServiceA((SC_RPC_HANDLE)hService,
+                                 dwNumServiceArgs,
+                                 (LPSTRING_PTRSA)lpServiceArgVectors);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
     if (dwError != ERROR_SUCCESS)
     {
@@ -2011,10 +2370,17 @@ StartServiceW(SC_HANDLE hService,
 {
     DWORD dwError;
 
-    dwError = RStartServiceW(BindingHandle,
-                             (SC_RPC_HANDLE)hService,
-                             dwNumServiceArgs,
-                             (LPSTRING_PTRSW)lpServiceArgVectors);
+    _SEH_TRY
+    {
+        dwError = RStartServiceW((SC_RPC_HANDLE)hService,
+                                 dwNumServiceArgs,
+                                 (LPSTRING_PTRSW)lpServiceArgVectors);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
     if (dwError != ERROR_SUCCESS)
     {
@@ -2039,11 +2405,17 @@ UnlockServiceDatabase(SC_LOCK ScLock)
 
     TRACE("UnlockServiceDatabase(%x)\n", ScLock);
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RUnlockServiceDatabase((LPSC_RPC_LOCK)&ScLock);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RUnlockServiceDatabase(BindingHandle,
-                                     (SC_RPC_LOCK)ScLock);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("RUnlockServiceDatabase() failed (Error %lu)\n", dwError);
@@ -2067,12 +2439,18 @@ NotifyBootConfigStatus(BOOL BootAcceptable)
 
     TRACE("NotifyBootConfigStatus()\n");
 
-    HandleBind();
+    _SEH_TRY
+    {
+        /* Call to services.exe using RPC */
+        dwError = RNotifyBootConfigStatus(NULL,
+                                          BootAcceptable);
+    }
+    _SEH_HANDLE
+    {
+        dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+    }
+    _SEH_END;
 
-    /* Call to services.exe using RPC */
-    dwError = RNotifyBootConfigStatus(BindingHandle,
-                                      NULL,
-                                      BootAcceptable);
     if (dwError != ERROR_SUCCESS)
     {
         ERR("NotifyBootConfigStatus() failed (Error %lu)\n", dwError);