Dmitry Timoshkov : msiexec: MSI service should report SERVICE_STOPPED when appropriate.

Alexandre Julliard julliard at winehq.org
Wed Dec 11 13:05:46 CST 2013


Module: wine
Branch: master
Commit: 955de31fad16da6453d0a67d2510955cb255ab46
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=955de31fad16da6453d0a67d2510955cb255ab46

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Wed Dec 11 17:16:07 2013 +0900

msiexec: MSI service should report SERVICE_STOPPED when appropriate.

---

 programs/msiexec/service.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/programs/msiexec/service.c b/programs/msiexec/service.c
index 4b72fe0..fdd29bd 100644
--- a/programs/msiexec/service.c
+++ b/programs/msiexec/service.c
@@ -81,6 +81,8 @@ static BOOL UpdateSCMStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
 
 static void WINAPI ServiceCtrlHandler(DWORD code)
 {
+    DWORD state = SERVICE_RUNNING;
+
     WINE_TRACE("%d\n", code);
 
     switch (code)
@@ -89,13 +91,14 @@ static void WINAPI ServiceCtrlHandler(DWORD code)
         case SERVICE_CONTROL_STOP:
             UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
             KillService();
+            state = SERVICE_STOPPED;
             return;
         default:
             fprintf(stderr, "Unhandled service control code: %d\n", code);
             break;
     }
 
-    UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
+    UpdateSCMStatus(state, NO_ERROR, 0);
 }
 
 static DWORD WINAPI ServiceExecutionThread(LPVOID param)
@@ -135,12 +138,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;
     }
 
@@ -148,6 +153,8 @@ static void WINAPI ServiceMain(DWORD argc, LPSTR *argv)
 
     WaitForSingleObject(kill_event, INFINITE);
     KillService();
+
+    UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
 }
 
 DWORD DoService(void)




More information about the wine-cvs mailing list