[SYSSETUP] SetupStartService: Wait until the service is running
authorEric Kohl <eric.kohl@reactos.org>
Sun, 5 Aug 2018 18:02:22 +0000 (20:02 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 5 Aug 2018 18:02:22 +0000 (20:02 +0200)
dll/win32/syssetup/install.c

index 63fa4a2..e9b5745 100644 (file)
@@ -1508,7 +1508,9 @@ SetupStartService(
 {
     SC_HANDLE hManager = NULL;
     SC_HANDLE hService = NULL;
+    SERVICE_STATUS ServiceStatus;
     DWORD dwError = ERROR_SUCCESS;
+    DWORD dwRetries = 0;
 
     hManager = OpenSCManagerW(NULL,
                               NULL,
@@ -1521,7 +1523,7 @@ SetupStartService(
 
     hService = OpenServiceW(hManager,
                             lpServiceName,
-                            SERVICE_START);
+                            SERVICE_START | (bWait) ? SERVICE_QUERY_STATUS : 0);
     if (hService == NULL)
     {
         dwError = GetLastError();
@@ -1531,7 +1533,27 @@ SetupStartService(
     if (!StartService(hService, 0, NULL))
     {
         dwError = GetLastError();
-        goto done;
+        if (dwError != ERROR_SERVICE_ALREADY_RUNNING)
+            goto done;
+
+        if (bWait)
+        {
+            for (;;)
+            {
+                if (!QueryServiceStatus(hService, &ServiceStatus))
+                    break;
+
+                if (ServiceStatus.dwCurrentState != SERVICE_START_PENDING)
+                    break;
+
+                if (dwRetries == 30)
+                    break;
+
+                dwRetries++;
+
+                Sleep(5000);
+            }
+        }
     }
 
 done: