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?…
==============================================================================
--- 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/winlo…
==============================================================================
--- 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?…
==============================================================================
--- 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;
}