[SERVICES]
[reactos.git] / reactos / base / system / services / services.c
index 0c5327d..0c213d3 100644 (file)
@@ -47,35 +47,104 @@ 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
-ScmCreateEvent(PHANDLE Event,
-               LPCWSTR Name)
+ScmCreateStartEvent(PHANDLE StartEvent)
+{
+    HANDLE hEvent;
+
+    hEvent = CreateEvent(NULL,
+                         TRUE,
+                         FALSE,
+                         TEXT("SvcctrlStartEvent_A3752DX"));
+    if (hEvent == NULL)
+    {
+        if (GetLastError() == ERROR_ALREADY_EXISTS)
+        {
+            hEvent = OpenEvent(EVENT_ALL_ACCESS,
+                               FALSE,
+                               TEXT("SvcctrlStartEvent_A3752DX"));
+            if (hEvent == NULL)
+            {
+                return FALSE;
+            }
+        }
+        else
+        {
+            return FALSE;
+        }
+    }
+
+    *StartEvent = hEvent;
+
+    return TRUE;
+}
+
+
+static VOID
+ScmWaitForLsass(VOID)
 {
     HANDLE hEvent;
+    DWORD dwError;
 
     hEvent = CreateEventW(NULL,
                           TRUE,
                           FALSE,
-                          Name);
+                          L"LSA_RPC_SERVER_ACTIVE");
     if (hEvent == NULL)
     {
-        if (GetLastError() == ERROR_ALREADY_EXISTS)
+        dwError = GetLastError();
+        DPRINT("Failed to create the notication event (Error %lu)\n", dwError);
+
+        if (dwError == ERROR_ALREADY_EXISTS)
         {
-            hEvent = OpenEventW(EVENT_ALL_ACCESS,
+            hEvent = OpenEventW(SYNCHRONIZE,
                                 FALSE,
-                                Name);
+                                L"LSA_RPC_SERVER_ACTIVE");
+            if (hEvent == NULL)
+            {
+               DPRINT1("Could not open the notification event (Error %lu)\n", GetLastError());
+               return;
+            }
         }
     }
 
-    if (hEvent)
-    {
-        DPRINT("SERVICES: created event %S with handle %x\n", Name, hEvent);
-        *Event = hEvent;
-        return TRUE;
-    }
+    DPRINT("Wait for the LSA server!\n");
+    WaitForSingleObject(hEvent, INFINITE);
+    DPRINT("LSA server running!\n");
 
-    DPRINT1("SERVICES: Failed to create event %S\n", Name);
-    return FALSE;
+    CloseHandle(hEvent);
 }
 
 
@@ -278,7 +347,7 @@ ShutdownHandlerRoutine(DWORD dwCtrlType)
 {
     DPRINT1("ShutdownHandlerRoutine() called\n");
 
-    if (dwCtrlType == CTRL_SHUTDOWN_EVENT)
+    if (dwCtrlType & (CTRL_SHUTDOWN_EVENT | CTRL_LOGOFF_EVENT))
     {
         DPRINT1("Shutdown event received!\n");
         ScmShutdown = TRUE;
@@ -298,25 +367,19 @@ wWinMain(HINSTANCE hInstance,
          int nShowCmd)
 {
     HANDLE hScmStartEvent;
-    HANDLE hScmAutoStartCompleteEvent;
     HANDLE hEvent;
     DWORD dwError;
 
     DPRINT("SERVICES: Service Control Manager\n");
 
-    /* Acquire privileges to load drivers */
-    AcquireLoadDriverPrivilege();
-
-    /* Create events */
-    if (!ScmCreateEvent(&hScmAutoStartCompleteEvent, L"SC_AutoStartComplete"))
+    /* Create start event */
+    if (!ScmCreateStartEvent(&hScmStartEvent))
     {
+        DPRINT1("SERVICES: Failed to create start event\n");
         ExitThread(0);
     }
 
-    if (!ScmCreateEvent(&hScmStartEvent, L"SvcctrlStartEvent_A3752DX"))
-    {
-        ExitThread(0);
-    }
+    DPRINT("SERVICES: created start event with handle %x.\n", hScmStartEvent);
 
 //    ScmInitThreadManager();
 
@@ -348,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();
 
@@ -356,9 +427,6 @@ wWinMain(HINSTANCE hInstance,
 
     DPRINT("SERVICES: Running.\n");
 
-    /* Signal complete event */
-    SetEvent(hScmAutoStartCompleteEvent);
-
 #if 1
     hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
     if (hEvent)
@@ -370,6 +438,8 @@ wWinMain(HINSTANCE hInstance,
     }
 #endif
 
+    ScmDeleteNamedPipeCriticalSection();
+
     CloseHandle(hScmStartEvent);
 
     DPRINT("SERVICES: Finished.\n");