From 46d89d3a50ce448a4a911a9dd5263a268ab0926b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 12 Sep 2010 16:29:43 +0000 Subject: [PATCH] Make Services.exe and Winlogon.exe wait for the LSA server to be up and running. Otherwise calls to any LSA function might fail. Thanks to Roel Messiant for testing and analyzing the debug logs. See issue #5497 for more details. svn path=/trunk/; revision=48757 --- reactos/base/system/services/services.c | 45 +++++++++++++++++++++++-- reactos/base/system/winlogon/winlogon.c | 41 ++++++++++++++++++++++ reactos/dll/win32/lsasrv/lsasrv.c | 5 +-- 3 files changed, 86 insertions(+), 5 deletions(-) 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; } } }