[MSIEXEC] Sync with Wine Staging 2.16. CORE-13762
[reactos.git] / base / system / msiexec / service.c
index 1ffead6..3c8b690 100644 (file)
@@ -39,7 +39,9 @@ static BOOL UpdateSCMStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
     status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
     status.dwCurrentState = dwCurrentState;
 
-    if (dwCurrentState == SERVICE_START_PENDING)
+    if (dwCurrentState == SERVICE_START_PENDING
+            || dwCurrentState == SERVICE_STOP_PENDING
+            || dwCurrentState == SERVICE_STOPPED)
         status.dwControlsAccepted = 0;
     else
     {
@@ -73,8 +75,6 @@ static BOOL UpdateSCMStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
 
 static void WINAPI ServiceCtrlHandler(DWORD code)
 {
-    DWORD state = SERVICE_RUNNING;
-
     WINE_TRACE("%u\n", code);
 
     switch (code)
@@ -83,14 +83,12 @@ static void WINAPI ServiceCtrlHandler(DWORD code)
         case SERVICE_CONTROL_STOP:
             UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
             KillService();
-            state = SERVICE_STOPPED;
             break;
         default:
             fprintf(stderr, "Unhandled service control code: %u\n", code);
+            UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
             break;
     }
-
-    UpdateSCMStatus(state, NO_ERROR, 0);
 }
 
 static DWORD WINAPI ServiceExecutionThread(LPVOID param)
@@ -142,10 +140,7 @@ static void WINAPI ServiceMain(DWORD argc, LPSTR *argv)
     }
 
     UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
-
-    WaitForSingleObject(kill_event, INFINITE);
-    KillService();
-
+    WaitForSingleObject(thread, INFINITE);
     UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
 }