}
+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);
}
{
DPRINT1("ShutdownHandlerRoutine() called\n");
- if (dwCtrlType == CTRL_SHUTDOWN_EVENT)
+ if (dwCtrlType & (CTRL_SHUTDOWN_EVENT | CTRL_LOGOFF_EVENT))
{
DPRINT1("Shutdown event received!\n");
ScmShutdown = TRUE;
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();
/* 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();
DPRINT("SERVICES: Running.\n");
- /* Signal complete event */
- SetEvent(hScmAutoStartCompleteEvent);
-
#if 1
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (hEvent)
}
#endif
+ ScmDeleteNamedPipeCriticalSection();
+
CloseHandle(hScmStartEvent);
DPRINT("SERVICES: Finished.\n");