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
#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,
/* FIXME: More initialization */
- StartServiceCtrlDispatcher(ServiceTable);
-
DPRINT(" Done...\n");
ByeBye:
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(
- NULL,
- TRUE,
- FALSE,
- L"Global\\SECURITY_SERVICES_STARTED");
- if (!LsassInitEvent)
- {
- ERR("WL: Failed to create lsass notification event (error %lu)\n", GetLastError());
- return FALSE;
- }
+ /* 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;
- /* 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;
- }
+ TRACE("WL: Creating new process - %S\n", ServiceString);
- WaitForSingleObject(LsassInitEvent, INFINITE);
- CloseHandle(LsassInitEvent);
+ res = CreateProcessW(
+ ServiceString,
+ NULL,
+ NULL,
+ NULL,
+ FALSE,
+ DETACHED_PROCESS,
+ NULL,
+ NULL,
+ &StartupInfo,
+ &ProcessInformation);
- return TRUE;
+ return res;
}
BOOL
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
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
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;
}