[ros-diffs] [ekohl] 38041: 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.

ekohl at svn.reactos.org ekohl at svn.reactos.org
Sat Dec 13 15:47:08 CET 2008


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?rev=38041&r1=38040&r2=38041&view=diff
==============================================================================
--- 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/winlogon.c?rev=38041&r1=38040&r2=38041&view=diff
==============================================================================
--- 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.inf?rev=38041&r1=38040&r2=38041&view=diff
==============================================================================
--- 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?rev=38041&r1=38040&r2=38041&view=diff
==============================================================================
--- 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;
 }
 



More information about the Ros-diffs mailing list