[SERVICES]
[reactos.git] / reactos / dll / win32 / advapi32 / service / sctrl.c
index b78a4a0..a88fb2f 100644 (file)
@@ -22,7 +22,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(advapi);
 
 typedef struct _ACTIVE_SERVICE
 {
-    CLIENT_HANDLE hService;
+    SERVICE_STATUS_HANDLE hServiceStatus;
     UNICODE_STRING ServiceName;
     union
     {
@@ -32,7 +32,6 @@ typedef struct _ACTIVE_SERVICE
     LPHANDLER_FUNCTION HandlerFunction;
     LPHANDLER_FUNCTION_EX HandlerFunctionEx;
     LPVOID HandlerContext;
-    SERVICE_STATUS ServiceStatus;
     BOOL bUnicode;
     LPWSTR Arguments;
 } ACTIVE_SERVICE, *PACTIVE_SERVICE;
@@ -199,6 +198,7 @@ ScConnectControlPipe(HANDLE *hPipe)
     NTSTATUS Status;
     WCHAR NtControlPipeName[MAX_PATH + 1];
     RTL_QUERY_REGISTRY_TABLE QueryTable[2];
+    DWORD dwProcessId;
 
     /* Get the service number and create the named pipe */
     RtlZeroMemory(&QueryTable,
@@ -237,7 +237,7 @@ ScConnectControlPipe(HANDLE *hPipe)
                          NULL);
     if (*hPipe == INVALID_HANDLE_VALUE)
     {
-        ERR("CreateFileW() failed (Error %lu)\n", GetLastError());
+        ERR("CreateFileW() failed for pipe %S (Error %lu)\n", NtControlPipeName, GetLastError());
         return ERROR_FAILED_SERVICE_CONTROLLER_CONNECT;
     }
 
@@ -249,37 +249,34 @@ ScConnectControlPipe(HANDLE *hPipe)
         return ERROR_FAILED_SERVICE_CONTROLLER_CONNECT;
     }
 
-    /* Share the SERVICE_HANDLE handle with the SCM */
+    /* Pass the ProcessId to the SCM */
+    dwProcessId = GetCurrentProcessId();
     WriteFile(*hPipe,
-              (DWORD *)&lpActiveServices->hService,
-              sizeof(CLIENT_HANDLE),
+              &dwProcessId,
+              sizeof(DWORD),
               &dwBytesWritten,
               NULL);
 
-    TRACE("Sent SERVICE_HANDLE %lu\n", lpActiveServices->hService);
+    TRACE("Sent Process ID %lu\n", dwProcessId);
+
 
     return ERROR_SUCCESS;
 }
 
 
 static DWORD
-ScStartService(PSCM_CONTROL_PACKET ControlPacket)
+ScStartService(PACTIVE_SERVICE lpService,
+               PSCM_CONTROL_PACKET ControlPacket)
 {
-    PACTIVE_SERVICE lpService;
     HANDLE ThreadHandle;
     DWORD ThreadId;
 
     TRACE("ScStartService() called\n");
-    TRACE("client handle: %lu\n", ControlPacket->hClient);
     TRACE("Size: %lu\n", ControlPacket->dwSize);
     TRACE("Service: %S\n", &ControlPacket->szArguments[0]);
 
-    lpService = (PACTIVE_SERVICE)(ULONG_PTR)ControlPacket->hClient;
-    if (lpService == NULL)
-    {
-        TRACE("Service not found\n");
-        return ERROR_SERVICE_DOES_NOT_EXIST;
-    }
+    /* Set the service status handle */
+    lpService->hServiceStatus = ControlPacket->hServiceStatus;
 
     lpService->Arguments = HeapAlloc(GetProcessHeap(),
                                      HEAP_ZERO_MEMORY,
@@ -309,21 +306,13 @@ ScStartService(PSCM_CONTROL_PACKET ControlPacket)
 
 
 static DWORD
-ScControlService(PSCM_CONTROL_PACKET ControlPacket)
+ScControlService(PACTIVE_SERVICE lpService,
+                 PSCM_CONTROL_PACKET ControlPacket)
 {
-    PACTIVE_SERVICE lpService;
-
     TRACE("ScControlService() called\n");
     TRACE("Size: %lu\n", ControlPacket->dwSize);
     TRACE("Service: %S\n", &ControlPacket->szArguments[0]);
 
-    lpService = (PACTIVE_SERVICE)(ULONG_PTR)ControlPacket->hClient;
-    if (lpService == NULL)
-    {
-        TRACE("Service not found\n");
-        return ERROR_SERVICE_DOES_NOT_EXIST;
-    }
-
     if (lpService->HandlerFunction)
     {
         (lpService->HandlerFunction)(ControlPacket->dwControl);
@@ -356,6 +345,8 @@ ScServiceDispatcher(HANDLE hPipe,
     DWORD Count;
     BOOL bResult;
     DWORD dwRunningServices = 0;
+    LPWSTR lpServiceName;
+    PACTIVE_SERVICE lpService;
 
     TRACE("ScDispatcherLoop() called\n");
 
@@ -379,24 +370,32 @@ ScServiceDispatcher(HANDLE hPipe,
             return FALSE;
         }
 
-        /* Execute command */
-        switch (ControlPacket->dwControl)
+        lpServiceName = &ControlPacket->szArguments[0];
+        TRACE("Service: %S\n", lpServiceName);
+
+        lpService = ScLookupServiceByServiceName(lpServiceName);
+        if (lpService != NULL)
         {
-            case SERVICE_CONTROL_START:
-                TRACE("Start command - recieved SERVICE_CONTROL_START\n");
-                if (ScStartService(ControlPacket) == ERROR_SUCCESS)
-                    dwRunningServices++;
-                break;
-
-            case SERVICE_CONTROL_STOP:
-                TRACE("Stop command - recieved SERVICE_CONTROL_STOP\n");
-                if (ScControlService(ControlPacket) == ERROR_SUCCESS)
-                    dwRunningServices--;
-                break;
-
-            default:
-                TRACE("Unknown command %lu", ControlPacket->dwControl);
-                continue;
+            /* Execute command */
+            switch (ControlPacket->dwControl)
+            {
+                case SERVICE_CONTROL_START:
+                    TRACE("Start command - recieved SERVICE_CONTROL_START\n");
+                    if (ScStartService(lpService, ControlPacket) == ERROR_SUCCESS)
+                        dwRunningServices++;
+                    break;
+
+                case SERVICE_CONTROL_STOP:
+                    TRACE("Stop command - recieved SERVICE_CONTROL_STOP\n");
+                    if (ScControlService(lpService, ControlPacket) == ERROR_SUCCESS)
+                        dwRunningServices--;
+                    break;
+
+                default:
+                    TRACE("Command %lu received", ControlPacket->dwControl);
+                    ScControlService(lpService, ControlPacket);
+                    continue;
+            }
         }
 
         if (dwRunningServices == 0)
@@ -454,15 +453,15 @@ RegisterServiceCtrlHandlerW(LPCWSTR lpServiceName,
     Service = ScLookupServiceByServiceName((LPWSTR)lpServiceName);
     if (Service == NULL)
     {
-        return INVALID_HANDLE_VALUE;
+        return (SERVICE_STATUS_HANDLE)NULL;
     }
 
     Service->HandlerFunction = lpHandlerProc;
     Service->HandlerFunctionEx = NULL;
 
-    TRACE("RegisterServiceCtrlHandler returning %lu\n", Service->hService);
+    TRACE("RegisterServiceCtrlHandler returning %lu\n", Service->hServiceStatus);
 
-    return (SERVICE_STATUS_HANDLE)Service->hService;
+    return Service->hServiceStatus;
 }
 
 
@@ -519,9 +518,9 @@ RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName,
     Service->HandlerFunctionEx = lpHandlerProc;
     Service->HandlerContext = lpContext;
 
-    TRACE("RegisterServiceCtrlHandlerEx returning %lu", Service->hService);
+    TRACE("RegisterServiceCtrlHandlerEx returning %lu\n", Service->hServiceStatus);
 
-    return (SERVICE_STATUS_HANDLE)Service->hService;
+    return Service->hServiceStatus;
 }
 
 
@@ -541,7 +540,7 @@ I_ScSetServiceBitsA(SERVICE_STATUS_HANDLE hServiceStatus,
 {
     BOOL bResult;
 
-    _SEH2_TRY
+    RpcTryExcept
     {
         /* Call to services.exe using RPC */
         bResult = RI_ScSetServiceBitsA((RPC_SERVICE_STATUS_HANDLE)hServiceStatus,
@@ -550,12 +549,12 @@ I_ScSetServiceBitsA(SERVICE_STATUS_HANDLE hServiceStatus,
                                        bUpdateImmediately,
                                        lpString);
     }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         SetLastError(ScmRpcStatusToWinError(RpcExceptionCode()));
         bResult = FALSE;
     }
-    _SEH2_END;
+    RpcEndExcept;
 
     return bResult;
 }
@@ -577,7 +576,7 @@ I_ScSetServiceBitsW(SERVICE_STATUS_HANDLE hServiceStatus,
 {
     BOOL bResult;
 
-    _SEH2_TRY
+    RpcTryExcept
     {
         /* Call to services.exe using RPC */
         bResult = RI_ScSetServiceBitsW((RPC_SERVICE_STATUS_HANDLE)hServiceStatus,
@@ -586,12 +585,12 @@ I_ScSetServiceBitsW(SERVICE_STATUS_HANDLE hServiceStatus,
                                        bUpdateImmediately,
                                        lpString);
     }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         SetLastError(ScmRpcStatusToWinError(RpcExceptionCode()));
         bResult = FALSE;
     }
-    _SEH2_END;
+    RpcEndExcept;
 
     return bResult;
 }
@@ -652,7 +651,7 @@ SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus,
  * @implemented
  */
 BOOL WINAPI
-StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA lpServiceStartTable)
+StartServiceCtrlDispatcherA(const SERVICE_TABLE_ENTRYA * lpServiceStartTable)
 {
     ULONG i;
     HANDLE hPipe;
@@ -682,7 +681,7 @@ StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA lpServiceStartTable)
         RtlCreateUnicodeStringFromAsciiz(&lpActiveServices[i].ServiceName,
                                          lpServiceStartTable[i].lpServiceName);
         lpActiveServices[i].Main.lpFuncA = lpServiceStartTable[i].lpServiceProc;
-        lpActiveServices[i].hService = (CLIENT_HANDLE)&lpActiveServices[i];
+        lpActiveServices[i].hServiceStatus = 0;
         lpActiveServices[i].bUnicode = FALSE;
     }
 
@@ -742,7 +741,7 @@ StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA lpServiceStartTable)
  * @implemented
  */
 BOOL WINAPI
-StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW lpServiceStartTable)
+StartServiceCtrlDispatcherW(const SERVICE_TABLE_ENTRYW * lpServiceStartTable)
 {
     ULONG i;
     HANDLE hPipe;
@@ -772,7 +771,7 @@ StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW lpServiceStartTable)
         RtlCreateUnicodeString(&lpActiveServices[i].ServiceName,
                                lpServiceStartTable[i].lpServiceName);
         lpActiveServices[i].Main.lpFuncW = lpServiceStartTable[i].lpServiceProc;
-        lpActiveServices[i].hService = (CLIENT_HANDLE)&lpActiveServices[i];
+        lpActiveServices[i].hServiceStatus = 0;
         lpActiveServices[i].bUnicode = TRUE;
     }