Author: ekohl Date: Sat Dec 13 08:47:07 2008 New Revision: 38041
URL: http://svn.reactos.org/svn/reactos?rev=38041&view=rev Log: 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.
Modified: trunk/reactos/base/system/lsass/lsass.c trunk/reactos/base/system/winlogon/winlogon.c trunk/reactos/boot/bootdata/hivesys_i386.inf trunk/reactos/dll/win32/lsasrv/lsasrv.c
Modified: trunk/reactos/base/system/lsass/lsass.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/lsass/lsass.c?r... ============================================================================== --- trunk/reactos/base/system/lsass/lsass.c [iso-8859-1] (original) +++ trunk/reactos/base/system/lsass/lsass.c [iso-8859-1] Sat Dec 13 08:47:07 2008 @@ -37,23 +37,6 @@ #define NDEBUG #include <debug.h>
-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 @@
/* FIXME: More initialization */
- StartServiceCtrlDispatcher(ServiceTable); - DPRINT(" Done...\n");
ByeBye:
Modified: trunk/reactos/base/system/winlogon/winlogon.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/winlog... ============================================================================== --- trunk/reactos/base/system/winlogon/winlogon.c [iso-8859-1] (original) +++ trunk/reactos/base/system/winlogon/winlogon.c [iso-8859-1] Sat Dec 13 08:47:07 2008 @@ -89,70 +89,39 @@ 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; - - LsassInitEvent = CreateEventW( - NULL, - TRUE, + STARTUPINFOW StartupInfo; + PROCESS_INFORMATION ProcessInformation; + LPCWSTR ServiceString = L"lsass.exe"; + BOOL res; + + /* 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, FALSE, - L"Global\SECURITY_SERVICES_STARTED"); - if (!LsassInitEvent) - { - ERR("WL: Failed to create lsass notification event (error %lu)\n", GetLastError()); - return FALSE; - } - - /* 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; + DETACHED_PROCESS, + NULL, + NULL, + &StartupInfo, + &ProcessInformation); + + return res; }
BOOL
Modified: trunk/reactos/boot/bootdata/hivesys_i386.inf URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/bootdata/hivesys_i386.... ============================================================================== --- trunk/reactos/boot/bootdata/hivesys_i386.inf [iso-8859-1] (original) +++ trunk/reactos/boot/bootdata/hivesys_i386.inf [iso-8859-1] Sat Dec 13 08:47:07 2008 @@ -968,12 +968,12 @@ 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","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
Modified: trunk/reactos/dll/win32/lsasrv/lsasrv.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/lsasrv/lsasrv.c?r... ============================================================================== --- trunk/reactos/dll/win32/lsasrv/lsasrv.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/lsasrv/lsasrv.c [iso-8859-1] Sat Dec 13 08:47:07 2008 @@ -14,19 +14,39 @@ 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; }