Make Services.exe and Winlogon.exe wait for the LSA server to be up and running....
authorEric Kohl <eric.kohl@reactos.org>
Sun, 12 Sep 2010 16:29:43 +0000 (16:29 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 12 Sep 2010 16:29:43 +0000 (16:29 +0000)
Thanks to Roel Messiant for testing and analyzing the debug logs.

See issue #5497 for more details.

svn path=/trunk/; revision=48757

reactos/base/system/services/services.c
reactos/base/system/winlogon/winlogon.c
reactos/dll/win32/lsasrv/lsasrv.c

index 2d97ce4..96aecd2 100644 (file)
@@ -80,6 +80,42 @@ ScmCreateStartEvent(PHANDLE StartEvent)
 }
 
 
+static VOID
+ScmWaitForLsass(VOID)
+{
+    HANDLE hEvent;
+    DWORD dwError;
+
+    hEvent = CreateEventW(NULL,
+                          TRUE,
+                          FALSE,
+                          L"LSA_RPC_SERVER_ACTIVE");
+    if (hEvent == NULL)
+    {
+        dwError = GetLastError();
+        DPRINT("Failed to create the notication event (Error %lu)\n", dwError);
+
+        if (dwError == ERROR_ALREADY_EXISTS)
+        {
+            hEvent = OpenEventW(SYNCHRONIZE,
+                                FALSE,
+                                L"LSA_RPC_SERVER_ACTIVE");
+            if (hEvent == NULL)
+            {
+               DPRINT1("Could not open the notification event (Error %lu)\n", GetLastError());
+               return;
+            }
+        }
+    }
+
+    DPRINT("Wait for the LSA server!\n");
+    WaitForSingleObject(hEvent, INFINITE);
+    DPRINT("LSA server running!\n");
+
+    CloseHandle(hEvent);
+}
+
+
 BOOL
 ScmNamedPipeHandleRequest(PVOID Request,
                           DWORD RequestSize,
@@ -304,9 +340,6 @@ wWinMain(HINSTANCE hInstance,
 
     DPRINT("SERVICES: Service Control Manager\n");
 
-    /* Acquire privileges to load drivers */
-    AcquireLoadDriverPrivilege();
-
     /* Create start event */
     if (!ScmCreateStartEvent(&hScmStartEvent))
     {
@@ -346,6 +379,12 @@ wWinMain(HINSTANCE hInstance,
     /* Register event handler (used for system shutdown) */
     SetConsoleCtrlHandler(ShutdownHandlerRoutine, TRUE);
 
+    /* Wait for the LSA server */
+    ScmWaitForLsass();
+
+    /* Acquire privileges to load drivers */
+    AcquireLoadDriverPrivilege();
+
     /* Start auto-start services */
     ScmAutoStartServices();
 
index 68cf2d1..3f977d0 100644 (file)
@@ -199,6 +199,43 @@ StartLsass(VOID)
        return res;
 }
 
+
+static VOID
+WaitForLsass(VOID)
+{
+    HANDLE hEvent;
+    DWORD dwError;
+
+    hEvent = CreateEventW(NULL,
+                          TRUE,
+                          FALSE,
+                          L"LSA_RPC_SERVER_ACTIVE");
+    if (hEvent == NULL)
+    {
+        dwError = GetLastError();
+        TRACE("WL: Failed to create the notication event (Error %lu)\n", dwError);
+
+        if (dwError == ERROR_ALREADY_EXISTS)
+        {
+            hEvent = OpenEventW(SYNCHRONIZE,
+                                FALSE,
+                                L"LSA_RPC_SERVER_ACTIVE");
+            if (hEvent == NULL)
+            {
+               ERR("WL: Could not open the notification event (Error %lu)\n", GetLastError());
+               return;
+            }
+        }
+    }
+
+    TRACE("WL: Wait for the LSA server!\n");
+    WaitForSingleObject(hEvent, INFINITE);
+    TRACE("WL: LSA server running!\n");
+
+    CloseHandle(hEvent);
+}
+
+
 BOOL
 DisplayStatusMessage(
        IN PWLSESSION Session,
@@ -348,6 +385,10 @@ WinMain(
 
        DisplayStatusMessage(WLSession, WLSession->WinlogonDesktop, IDS_REACTOSISSTARTINGUP);
 
+
+       /* Wait for the LSA server */
+       WaitForLsass();
+
 #if 0
        /* Connect to NetLogon service (lsass.exe) */
        /* Real winlogon uses "Winlogon" */
index fee4291..c6468a4 100644 (file)
@@ -45,9 +45,10 @@ LsapInitLsa(VOID)
             hEvent = OpenEventW(GENERIC_WRITE,
                                 FALSE,
                                 L"LSA_RPC_SERVER_ACTIVE");
-            if (hEvent != NULL)
+            if (hEvent == NULL)
             {
-               ERR("Could not open the notification event!");
+               ERR("Could not open the notification event (Error %lu)\n", GetLastError());
+               return STATUS_UNSUCCESSFUL;
             }
         }
     }