}
+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)
{
}
+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,
DPRINT("SERVICES: Service Control Manager\n");
- /* Acquire privileges to load drivers */
- AcquireLoadDriverPrivilege();
-
/* Create start event */
if (!ScmCreateStartEvent(&hScmStartEvent))
{
/* 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();
}
#endif
+ ScmDeleteNamedPipeCriticalSection();
+
CloseHandle(hScmStartEvent);
DPRINT("SERVICES: Finished.\n");