diff --git a/reactos/base/system/services/services.c b/reactos/base/system/services/services.c index 2d97ce44f4f..96aecd2a77b 100644 --- a/reactos/base/system/services/services.c +++ b/reactos/base/system/services/services.c @@ -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(); diff --git a/reactos/base/system/winlogon/winlogon.c b/reactos/base/system/winlogon/winlogon.c index 68cf2d13c3a..3f977d0f9be 100644 --- a/reactos/base/system/winlogon/winlogon.c +++ b/reactos/base/system/winlogon/winlogon.c @@ -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" */ diff --git a/reactos/dll/win32/lsasrv/lsasrv.c b/reactos/dll/win32/lsasrv/lsasrv.c index fee42913afe..c6468a47e03 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.c +++ b/reactos/dll/win32/lsasrv/lsasrv.c @@ -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; } } }