[ros-diffs] [hpoussin] 24477: - Start NetLogon service (lsass.exe) - Fix lots of problems in error handling - Some general cleanup

hpoussin at svn.reactos.org hpoussin at svn.reactos.org
Mon Oct 9 21:19:29 CEST 2006


Author: hpoussin
Date: Mon Oct  9 23:19:28 2006
New Revision: 24477

URL: http://svn.reactos.org/svn/reactos?rev=24477&view=rev
Log:
- Start NetLogon service (lsass.exe)
- Fix lots of problems in error handling
- Some general cleanup

Modified:
    trunk/reactos/base/system/winlogon/sas.c
    trunk/reactos/base/system/winlogon/screensaver.c
    trunk/reactos/base/system/winlogon/setup.c
    trunk/reactos/base/system/winlogon/setup.h
    trunk/reactos/base/system/winlogon/winlogon.c
    trunk/reactos/base/system/winlogon/winlogon.h
    trunk/reactos/base/system/winlogon/wlx.c

Modified: trunk/reactos/base/system/winlogon/sas.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/sas.c?rev=24477&r1=24476&r2=24477&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/sas.c (original)
+++ trunk/reactos/base/system/winlogon/sas.c Mon Oct  9 23:19:28 2006
@@ -28,16 +28,29 @@
 StartTaskManager(
 	IN OUT PWLSESSION Session)
 {
+	LPVOID lpEnvironment;
+
+	if (!Session->Gina.Functions.WlxStartApplication)
+		return FALSE;
+
+	if (!CreateEnvironmentBlock(
+		&lpEnvironment,
+		Session->UserToken,
+		TRUE))
+	{
+		return FALSE;
+	}
+
 	return Session->Gina.Functions.WlxStartApplication(
 		Session->Gina.Context,
 		L"Default",
-		NULL,
+		lpEnvironment,
 		L"taskmgr.exe");
 }
 
 BOOL
 SetDefaultLanguage(
-	IN BOOLEAN UserProfile)
+	IN BOOL UserProfile)
 {
 	HKEY BaseKey;
 	LPCWSTR SubKey;
@@ -146,11 +159,11 @@
 HandleLogon(
 	IN OUT PWLSESSION Session)
 {
-	PROFILEINFOW ProfileInfo = { 0 };
+	PROFILEINFOW ProfileInfo = { 0, };
 	LPVOID lpEnvironment = NULL;
 	BOOLEAN Old;
 
-	if (!(Session->Options & WLX_LOGON_OPT_NO_PROFILE))
+	if (0 == (Session->Options & WLX_LOGON_OPT_NO_PROFILE))
 	{
 		/* Load the user profile */
 		ProfileInfo.dwSize = sizeof(PROFILEINFOW);
@@ -165,7 +178,6 @@
 		if (!LoadUserProfileW(Session->UserToken, &ProfileInfo))
 		{
 			ERR("WL: LoadUserProfileW() failed\n");
-			CloseHandle(Session->UserToken);
 			return FALSE;
 		}
 	}
@@ -177,9 +189,12 @@
 		TRUE))
 	{
 		ERR("WL: CreateEnvironmentBlock() failed\n");
-		if (!(Session->Options & WLX_LOGON_OPT_NO_PROFILE))
+		if (0 == (Session->Options & WLX_LOGON_OPT_NO_PROFILE))
+		{
 			UnloadUserProfile(WLSession->UserToken, ProfileInfo.hProfile);
-		CloseHandle(Session->UserToken);
+			CloseHandle(Session->UserToken);
+			Session->UserToken = NULL;
+		}
 		return FALSE;
 	}
 	/* FIXME: use Session->Profile.pszEnvironment */
@@ -195,7 +210,15 @@
 
 	/* Set default language */
 	if (!SetDefaultLanguage(TRUE))
+	{
+		if (0 == (Session->Options & WLX_LOGON_OPT_NO_PROFILE))
+		{
+			UnloadUserProfile(WLSession->UserToken, ProfileInfo.hProfile);
+			CloseHandle(Session->UserToken);
+			Session->UserToken = NULL;
+		}
 		return FALSE;
+	}
 
 	if (!Session->Gina.Functions.WlxActivateUserShell(
 		Session->Gina.Context,
@@ -203,6 +226,12 @@
 		NULL, /* FIXME */
 		lpEnvironment))
 	{
+		if (0 == (Session->Options & WLX_LOGON_OPT_NO_PROFILE))
+		{
+			UnloadUserProfile(WLSession->UserToken, ProfileInfo.hProfile);
+			CloseHandle(Session->UserToken);
+			Session->UserToken = NULL;
+		}
 		return FALSE;
 	}
 	   /*if(!GinaInst->Functions->WlxActivateUserShell(GinaInst->Context,
@@ -222,7 +251,7 @@
    */
 
 	if (!InitializeScreenSaver(Session))
-		ERR("WL: Failed to initialize screen saver\n");
+		WARN("WL: Failed to initialize screen saver\n");
 
 	return TRUE;
 }
@@ -241,7 +270,7 @@
 {
 	PLOGOFF_SHUTDOWN_DATA LSData = (PLOGOFF_SHUTDOWN_DATA)Parameter;
 
-	if (LSData->Session->UserToken && !ImpersonateLoggedOnUser(LSData->Session->UserToken))
+	if (LSData->Session->UserToken != NULL && !ImpersonateLoggedOnUser(LSData->Session->UserToken))
 	{
 		ERR("ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
 		return 0;
@@ -363,7 +392,7 @@
 	UnregisterClassW(WINLOGON_SAS_CLASS, hAppInstance);
 }
 
-BOOL
+NTSTATUS
 HandleShutdown(
 	IN OUT PWLSESSION Session,
 	IN DWORD wlxAction)
@@ -423,11 +452,11 @@
 		if (FALSE)
 		{
 			/* FIXME - only show this dialog if it's a shutdown and the computer doesn't support APM */
-			DialogBox(hAppInstance, MAKEINTRESOURCE(IDD_SHUTDOWNCOMPUTER), 0, ShutdownComputerWindowProc);
+			DialogBox(hAppInstance, MAKEINTRESOURCE(IDD_SHUTDOWNCOMPUTER), GetDesktopWindow(), ShutdownComputerWindowProc);
 		}
 		NtShutdownSystem(ShutdownNoReboot);
 	}
-	return TRUE;
+	return STATUS_SUCCESS;
 }
 
 static VOID
@@ -508,9 +537,9 @@
 	DWORD wlxAction = WLX_SAS_ACTION_NONE;
 
 	if (Session->LogonStatus == WKSTA_IS_LOGGED_ON)
-		wlxAction = Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType, NULL);
+		wlxAction = (DWORD)Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType, NULL);
 	else if (Session->LogonStatus == WKSTA_IS_LOCKED)
-		wlxAction = Session->Gina.Functions.WlxWkstaLockedSAS(Session->Gina.Context, dwSasType);
+		wlxAction = (DWORD)Session->Gina.Functions.WlxWkstaLockedSAS(Session->Gina.Context, dwSasType);
 	else
 	{
 		/* Display a new dialog (if necessary) */
@@ -528,7 +557,7 @@
 				ZeroMemory(&Session->Profile, sizeof(Session->Profile));
 				Session->Options = 0;
 
-				wlxAction = Session->Gina.Functions.WlxLoggedOutSAS(
+				wlxAction = (DWORD)Session->Gina.Functions.WlxLoggedOutSAS(
 					Session->Gina.Context,
 					Session->SASAction,
 					&Session->LogonId,

Modified: trunk/reactos/base/system/winlogon/screensaver.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/screensaver.c?rev=24477&r1=24476&r2=24477&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/screensaver.c (original)
+++ trunk/reactos/base/system/winlogon/screensaver.c Mon Oct  9 23:19:28 2006
@@ -244,7 +244,7 @@
 	PROCESS_INFORMATION ProcessInformation;
 	HANDLE HandleArray[2];
 	LONG rc;
-	NTSTATUS Status;
+	DWORD Status;
 	BOOL ret = FALSE;
 
 	if (!ImpersonateLoggedOnUser(Session->UserToken))

Modified: trunk/reactos/base/system/winlogon/setup.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/setup.c?rev=24477&r1=24476&r2=24477&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/setup.c (original)
+++ trunk/reactos/base/system/winlogon/setup.c Mon Oct  9 23:19:28 2006
@@ -70,7 +70,7 @@
 }
 
 
-BOOL
+static BOOL
 SetSetupType (DWORD dwSetupType)
 {
   DWORD dwError;

Modified: trunk/reactos/base/system/winlogon/setup.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/setup.h?rev=24477&r1=24476&r2=24477&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/setup.h (original)
+++ trunk/reactos/base/system/winlogon/setup.h Mon Oct  9 23:19:28 2006
@@ -28,7 +28,6 @@
 #define __SETUP_H__
 
 DWORD GetSetupType (VOID);
-BOOL SetSetupType (DWORD dwSetupType);
 BOOL RunSetup (VOID);
 
 #endif /* __SETUP_H__ */

Modified: trunk/reactos/base/system/winlogon/winlogon.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/winlogon.c?rev=24477&r1=24476&r2=24477&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/winlogon.c (original)
+++ trunk/reactos/base/system/winlogon/winlogon.c Mon Oct  9 23:19:28 2006
@@ -102,10 +102,8 @@
 	hService = OpenServiceW(hSCManager, ServiceName, SERVICE_START);
 	if (!hService)
 		goto cleanup;
-#if 0
 	if (!StartServiceW(hService, 0, NULL))
 		goto cleanup;
-#endif
 
 	ret = TRUE;
 
@@ -140,9 +138,7 @@
 		return FALSE;
 	}
 
-#if 0
 	WaitForSingleObject(LsassInitEvent, INFINITE);
-#endif
 	CloseHandle(LsassInitEvent);
 
 	return TRUE;
@@ -360,6 +356,7 @@
 	ULONG AuthenticationPackage;
 	NTSTATUS Status;
 #endif
+	ULONG HardErrorResponse;
 	MSG Msg;
 
 	UNREFERENCED_PARAMETER(hPrevInstance);
@@ -377,27 +374,27 @@
 	}
 
 	WLSession = (PWLSESSION)HeapAlloc(GetProcessHeap(), 0, sizeof(WLSESSION));
+	if (!WLSession)
+	{
+		ERR("WL: Could not allocate memory for winlogon instance\n");
+		NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
+		ExitProcess(1);
+	}
 	ZeroMemory(WLSession, sizeof(WLSESSION));
-	if (!WLSession)
-	{
-		ERR("WL: Could not allocate memory for winlogon instance\n");
-		NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, 0, 0);
+	WLSession->DialogTimeout = 120; /* 2 minutes */
+
+	if (!CreateWindowStationAndDesktops(WLSession))
+	{
+		ERR("WL: Could not create window station and desktops\n");
+		NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
 		ExitProcess(1);
 	}
-	WLSession->DialogTimeout = 120; /* 2 minutes */
-
-	if (!CreateWindowStationAndDesktops(WLSession))
-	{
-		ERR("WL: Could not create window station and desktops\n");
-		NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, 0, 0);
-		ExitProcess(1);
-	}
 	LockWorkstation(WLSession);
 
 	if (!StartServicesManager())
 	{
 		ERR("WL: Could not start services.exe\n");
-		NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, 0, 0);
+		NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
 		ExitProcess(1);
 	}
 
@@ -420,7 +417,7 @@
 	if (!StartLsass())
 	{
 		DPRINT1("WL: Failed to start lsass.exe service (error %lu)\n", GetLastError());
-		NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, 0, 0);
+		NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, OptionOk, &HardErrorResponse);
 		ExitProcess(1);
 	}
 
@@ -428,7 +425,7 @@
 	if (!GinaInit(WLSession))
 	{
 		ERR("WL: Failed to initialize Gina\n");
-		DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), 0, GinaLoadFailedWindowProc, (LPARAM)L"");
+		DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), GetDesktopWindow(), GinaLoadFailedWindowProc, (LPARAM)L"");
 		HandleShutdown(WLSession, WLX_SAS_ACTION_SHUTDOWN_REBOOT);
 		ExitProcess(1);
 	}

Modified: trunk/reactos/base/system/winlogon/winlogon.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/winlogon.h?rev=24477&r1=24476&r2=24477&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/winlogon.h (original)
+++ trunk/reactos/base/system/winlogon/winlogon.h Mon Oct  9 23:19:28 2006
@@ -89,7 +89,7 @@
 
 	/* Functions available if WlxVersion >= WLX_VERSION_1_1 (MS Windows 3.5.1) */
 	PFWLXSCREENSAVERNOTIFY    WlxScreenSaverNotify; /* optional */
-	PFWLXSTARTAPPLICATION     WlxStartApplication; /* optional, not called ATM */
+	PFWLXSTARTAPPLICATION     WlxStartApplication; /* optional */
 
 	/* Functions available if WlxVersion >= WLX_VERSION_1_2 (MS Windows NT 4.0) */
 
@@ -179,7 +179,7 @@
 /* sas.c */
 BOOL
 SetDefaultLanguage(
-	IN BOOLEAN UserProfile);
+	IN BOOL UserProfile);
 
 BOOL
 InitializeSAS(
@@ -213,7 +213,7 @@
 CreateWindowStationAndDesktops(
 	IN OUT PWLSESSION Session);
 
-BOOL
+NTSTATUS
 HandleShutdown(
 	IN OUT PWLSESSION Session,
 	IN DWORD wlxAction);

Modified: trunk/reactos/base/system/winlogon/wlx.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/wlx.c?rev=24477&r1=24476&r2=24477&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/wlx.c (original)
+++ trunk/reactos/base/system/winlogon/wlx.c Mon Oct  9 23:19:28 2006
@@ -896,7 +896,10 @@
 	}
 
 	/* FIXME: big HACK */
-	Session->WinlogonDesktop = Session->ApplicationDesktop;
+	CloseDesktop(Session->WinlogonDesktop);
+	CloseDesktop(Session->ScreenSaverDesktop);
+	Session->WinlogonDesktop = OpenDesktopW(L"Default", 0, FALSE, GENERIC_ALL);
+	Session->ScreenSaverDesktop = OpenDesktopW(L"Default", 0, FALSE, GENERIC_ALL);
 
 	/*
 	 * Switch to winlogon desktop
@@ -914,13 +917,25 @@
 	if (!ret)
 	{
 		if (Session->ApplicationDesktop)
+		{
 			CloseDesktop(Session->ApplicationDesktop);
+			Session->ApplicationDesktop = NULL;
+		}
 		if (Session->WinlogonDesktop)
+		{
 			CloseDesktop(Session->WinlogonDesktop);
+			Session->WinlogonDesktop = NULL;
+		}
 		if (Session->ScreenSaverDesktop)
+		{
 			CloseDesktop(Session->ScreenSaverDesktop);
+			Session->ScreenSaverDesktop = NULL;
+		}
 		if (Session->InteractiveWindowStation)
+		{
 			CloseWindowStation(Session->InteractiveWindowStation);
+			Session->InteractiveWindowStation = NULL;
+		}
 	}
 	HeapFree(GetProcessHeap(), 0, pDefaultAcl);
 	HeapFree(GetProcessHeap(), 0, pUserDesktopAcl);




More information about the Ros-diffs mailing list