* Sync up to trunk head (r64716).
[reactos.git] / base / system / msiexec / service.c
index 831a680..1ffead6 100644 (file)
@@ -73,6 +73,8 @@ static BOOL UpdateSCMStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
 
 static void WINAPI ServiceCtrlHandler(DWORD code)
 {
+    DWORD state = SERVICE_RUNNING;
+
     WINE_TRACE("%u\n", code);
 
     switch (code)
@@ -81,21 +83,19 @@ static void WINAPI ServiceCtrlHandler(DWORD code)
         case SERVICE_CONTROL_STOP:
             UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
             KillService();
-            return;
+            state = SERVICE_STOPPED;
+            break;
         default:
             fprintf(stderr, "Unhandled service control code: %u\n", code);
             break;
     }
 
-    UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
+    UpdateSCMStatus(state, NO_ERROR, 0);
 }
 
 static DWORD WINAPI ServiceExecutionThread(LPVOID param)
 {
-    while (TRUE)
-    {
-        /* do nothing */
-    }
+    WaitForSingleObject(kill_event, INFINITE);
 
     return 0;
 }
@@ -130,12 +130,14 @@ static void WINAPI ServiceMain(DWORD argc, LPSTR *argv)
     {
         fprintf(stderr, "Failed to create event\n");
         KillService();
+        UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
         return;
     }
 
     if (!StartServiceThread())
     {
         KillService();
+        UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
         return;
     }
 
@@ -143,6 +145,8 @@ static void WINAPI ServiceMain(DWORD argc, LPSTR *argv)
 
     WaitForSingleObject(kill_event, INFINITE);
     KillService();
+
+    UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
 }
 
 DWORD DoService(void)