From 8fb679dc7cb7415582145b3088173fcfd0287f6d Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 13 Dec 2008 14:47:07 +0000 Subject: [PATCH] Do not start LSASS as a service but as an ordinary process because: 1) LSASS and the NetLogon service are not the same. 2) The service manager must wait for LSASS to finish initialization. If LSASS is started as a service we will have a classic deadlock scenario. svn path=/trunk/; revision=38041 --- reactos/base/system/lsass/lsass.c | 19 ------ reactos/base/system/winlogon/winlogon.c | 81 ++++++++----------------- reactos/boot/bootdata/hivesys_i386.inf | 14 ++--- reactos/dll/win32/lsasrv/lsasrv.c | 32 ++++++++-- 4 files changed, 58 insertions(+), 88 deletions(-) diff --git a/reactos/base/system/lsass/lsass.c b/reactos/base/system/lsass/lsass.c index 50bb405d426..f8a819f1e85 100644 --- a/reactos/base/system/lsass/lsass.c +++ b/reactos/base/system/lsass/lsass.c @@ -37,23 +37,6 @@ #define NDEBUG #include -static VOID CALLBACK -ServiceMain(DWORD argc, LPTSTR *argv); - -static SERVICE_TABLE_ENTRY ServiceTable[2] = -{ - {TEXT("NetLogon"), ServiceMain}, - {NULL, NULL} -}; - -static VOID CALLBACK -ServiceMain( - IN DWORD argc, - IN LPWSTR *argv) -{ - DPRINT("ServiceMain() called\n"); -} - INT WINAPI wWinMain( IN HINSTANCE hInstance, @@ -86,8 +69,6 @@ wWinMain( /* FIXME: More initialization */ - StartServiceCtrlDispatcher(ServiceTable); - DPRINT(" Done...\n"); ByeBye: diff --git a/reactos/base/system/winlogon/winlogon.c b/reactos/base/system/winlogon/winlogon.c index 7c9a79e7c26..0a7f61ad3e4 100644 --- a/reactos/base/system/winlogon/winlogon.c +++ b/reactos/base/system/winlogon/winlogon.c @@ -89,70 +89,39 @@ StartServicesManager(VOID) return TRUE; } -static BOOL -StartCustomService( - IN LPCWSTR ServiceName) -{ - SC_HANDLE hSCManager = NULL; - SC_HANDLE hService = NULL; - BOOL ret = FALSE; - - hSCManager = OpenSCManager(NULL, NULL, 0); - if (!hSCManager) - { - ERR("WL: Failed to OpenSCManager\n"); - goto cleanup; - } - - hService = OpenServiceW(hSCManager, ServiceName, SERVICE_START); - if (!hService) - { - ERR("WL: Failed to open the service\n"); - goto cleanup; - } - if (!StartServiceW(hService, 0, NULL)) - { - ERR("WL: Failed to start the service\n"); - goto cleanup; - } - - ret = TRUE; - -cleanup: - if (hService) - CloseServiceHandle(hService); - if (hSCManager) - CloseServiceHandle(hSCManager); - return ret; -} static BOOL StartLsass(VOID) { - HANDLE LsassInitEvent; + STARTUPINFOW StartupInfo; + PROCESS_INFORMATION ProcessInformation; + LPCWSTR ServiceString = L"lsass.exe"; + BOOL res; - LsassInitEvent = CreateEventW( + /* Start the service control manager (services.exe) */ + StartupInfo.cb = sizeof(StartupInfo); + StartupInfo.lpReserved = NULL; + StartupInfo.lpDesktop = NULL; + StartupInfo.lpTitle = NULL; + StartupInfo.dwFlags = 0; + StartupInfo.cbReserved2 = 0; + StartupInfo.lpReserved2 = 0; + + TRACE("WL: Creating new process - %S\n", ServiceString); + + res = CreateProcessW( + ServiceString, + NULL, + NULL, NULL, - TRUE, FALSE, - L"Global\\SECURITY_SERVICES_STARTED"); - if (!LsassInitEvent) - { - ERR("WL: Failed to create lsass notification event (error %lu)\n", GetLastError()); - return FALSE; - } + DETACHED_PROCESS, + NULL, + NULL, + &StartupInfo, + &ProcessInformation); - /* Start the local security authority subsystem (Netlogon service) */ - if (!StartCustomService(L"Netlogon")) - { - ERR("WL: Failed to start NetLogon service (error %lu)\n", GetLastError()); - return FALSE; - } - - WaitForSingleObject(LsassInitEvent, INFINITE); - CloseHandle(LsassInitEvent); - - return TRUE; + return res; } BOOL diff --git a/reactos/boot/bootdata/hivesys_i386.inf b/reactos/boot/bootdata/hivesys_i386.inf index 441b0e3770d..8e49b075d66 100644 --- a/reactos/boot/bootdata/hivesys_i386.inf +++ b/reactos/boot/bootdata/hivesys_i386.inf @@ -968,12 +968,12 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","Start",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","Type",0x00010001,0x00000001 ; NetLogon -HKLM,"SYSTEM\CurrentControlSet\Services\NetLogon","DisplayName",0x00000000,"Net Logon" -HKLM,"SYSTEM\CurrentControlSet\Services\NetLogon","Description",0x00000000,"Sets up a secure channel to a domain controller for domain authentication" -HKLM,"SYSTEM\CurrentControlSet\Services\NetLogon","ErrorControl",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\Netlogon","ImagePath",0x00020000,"%SystemRoot%\system32\lsass.exe" -HKLM,"SYSTEM\CurrentControlSet\Services\NetLogon","Start",0x00010001,0x00000003 -HKLM,"SYSTEM\CurrentControlSet\Services\Netlogon","Type",0x00010001,0x00000020 +;HKLM,"SYSTEM\CurrentControlSet\Services\NetLogon","DisplayName",0x00000000,"Net Logon" +;HKLM,"SYSTEM\CurrentControlSet\Services\NetLogon","Description",0x00000000,"Sets up a secure channel to a domain controller for domain authentication" +;HKLM,"SYSTEM\CurrentControlSet\Services\NetLogon","ErrorControl",0x00010001,0x00000001 +;HKLM,"SYSTEM\CurrentControlSet\Services\Netlogon","ImagePath",0x00020000,"%SystemRoot%\system32\lsass.exe" +;HKLM,"SYSTEM\CurrentControlSet\Services\NetLogon","Start",0x00010001,0x00000003 +;HKLM,"SYSTEM\CurrentControlSet\Services\Netlogon","Type",0x00010001,0x00000020 ; Named Pipe filesystem driver HKLM,"SYSTEM\CurrentControlSet\Services\Npfs","ErrorControl",0x00010001,0x00000000 @@ -1127,6 +1127,6 @@ HKLM,"SYSTEM\Setup","SystemPartition",0x00000000,"\Device\Harddisk0\Partition1" HKLM,"SYSTEM\Setup","SystemSetupInProgress",0x00010001,0x00000001 ; Debug channels -;HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","DEBUGCHANNEL",0x00020000,"+ole,+rpc" +HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","DEBUGCHANNEL",0x00020000,"+lsasrv,+advapi" ; EOF diff --git a/reactos/dll/win32/lsasrv/lsasrv.c b/reactos/dll/win32/lsasrv/lsasrv.c index 3867438bc77..8481f80b646 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.c +++ b/reactos/dll/win32/lsasrv/lsasrv.c @@ -14,19 +14,39 @@ NTSTATUS WINAPI LsapInitLsa(VOID) { HANDLE hEvent; + DWORD dwError; TRACE("LsapInitLsa()\n"); + /* Start the RPC server */ LsarStartRpcServer(); - hEvent = OpenEventW(EVENT_MODIFY_STATE, - FALSE, - L"Global\\SECURITY_SERVICES_STARTED"); - if (hEvent != NULL) + /* Notify the service manager */ + hEvent = CreateEventW(NULL, + TRUE, + FALSE, + L"LSA_RPC_SERVER_ACTIVE"); + if (hEvent == NULL) { - SetEvent(hEvent); - CloseHandle(hEvent); + dwError = GetLastError(); + TRACE("Failed to create the notication event (Error %lu)\n", dwError); + + if (dwError == ERROR_ALREADY_EXISTS) + { + hEvent = OpenEventW(GENERIC_WRITE, + FALSE, + L"LSA_RPC_SERVER_ACTIVE"); + if (hEvent != NULL) + { + ERR("Could not open the notification event!"); + } + } } + + SetEvent(hEvent); + + /* NOTE: Do not close the event handle!!!! */ + return STATUS_SUCCESS; }