[SERVICES]
[reactos.git] / reactos / base / system / services / services.c
index 2d97ce4..0c213d3 100644 (file)
@@ -47,6 +47,38 @@ PrintString(LPCSTR fmt, ...)
 }
 
 
+VOID
+ScmLogError(DWORD dwEventId,
+            WORD wStrings,
+            LPCWSTR *lpStrings)
+{
+    HANDLE hLog;
+
+    hLog = RegisterEventSourceW(NULL,
+                                L"Service Control Manager");
+    if (hLog == NULL)
+    {
+        DPRINT1("ScmLogEvent: RegisterEventSourceW failed %d\n", GetLastError());
+        return;
+    }
+
+    if (!ReportEventW(hLog,
+                      EVENTLOG_ERROR_TYPE,
+                      0,
+                      dwEventId,
+                      NULL, // Sid,
+                      wStrings,
+                      0,
+                      lpStrings,
+                      NULL))
+    {
+        DPRINT1("ScmLogEvent: ReportEventW failed %d\n", GetLastError());
+    }
+
+    DeregisterEventSource(hLog);
+}
+
+
 BOOL
 ScmCreateStartEvent(PHANDLE StartEvent)
 {
@@ -80,6 +112,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 +372,6 @@ wWinMain(HINSTANCE hInstance,
 
     DPRINT("SERVICES: Service Control Manager\n");
 
-    /* Acquire privileges to load drivers */
-    AcquireLoadDriverPrivilege();
-
     /* Create start event */
     if (!ScmCreateStartEvent(&hScmStartEvent))
     {
@@ -346,6 +411,14 @@ 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();
+
+    ScmInitNamedPipeCriticalSection();
+
     /* Start auto-start services */
     ScmAutoStartServices();
 
@@ -365,6 +438,8 @@ wWinMain(HINSTANCE hInstance,
     }
 #endif
 
+    ScmDeleteNamedPipeCriticalSection();
+
     CloseHandle(hScmStartEvent);
 
     DPRINT("SERVICES: Finished.\n");