2006-07-30 08:38:35 +00:00
|
|
|
/*
|
1999-06-06 16:40:10 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
2006-07-30 08:38:35 +00:00
|
|
|
* PROJECT: ReactOS Winlogon
|
1999-06-06 16:40:10 +00:00
|
|
|
* FILE: services/winlogon/winlogon.c
|
2005-05-08 04:07:56 +00:00
|
|
|
* PURPOSE: Logon
|
1999-06-06 16:40:10 +00:00
|
|
|
* PROGRAMMER: David Welch (welch@cwcom.net)
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
* Created 22/05/98
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES *****************************************************************/
|
2003-12-01 18:21:04 +00:00
|
|
|
#include "winlogon.h"
|
2003-03-25 19:26:33 +00:00
|
|
|
|
2003-03-20 20:56:52 +00:00
|
|
|
#define NDEBUG
|
2002-02-08 02:57:10 +00:00
|
|
|
#include <debug.h>
|
1999-11-20 21:53:53 +00:00
|
|
|
|
1999-06-08 22:45:53 +00:00
|
|
|
/* GLOBALS ******************************************************************/
|
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
BOOL
|
2003-12-07 00:04:20 +00:00
|
|
|
LoadGina(PMSGINAFUNCTIONS Functions, DWORD *DllVersion);
|
2004-03-28 12:21:41 +00:00
|
|
|
PWLSESSION
|
|
|
|
MsGinaInit(void);
|
|
|
|
void
|
|
|
|
SessionLoop(PWLSESSION Session);
|
2003-12-01 18:21:04 +00:00
|
|
|
BOOL
|
2004-03-28 12:21:41 +00:00
|
|
|
InitServices(void);
|
|
|
|
BOOL
|
|
|
|
WlxCreateWindowStationAndDesktops(PWLSESSION Session);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
|
|
|
HINSTANCE hAppInstance;
|
2004-03-28 12:21:41 +00:00
|
|
|
PWLSESSION WLSession = NULL;
|
2006-07-30 08:38:35 +00:00
|
|
|
HWND hwndSASWindow = NULL;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
1999-06-06 16:40:10 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2004-03-09 15:08:12 +00:00
|
|
|
static void
|
|
|
|
PrintString (WCHAR* fmt,...)
|
2001-01-20 18:40:27 +00:00
|
|
|
{
|
2003-12-01 18:21:04 +00:00
|
|
|
WCHAR buffer[512];
|
2001-01-20 18:40:27 +00:00
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
va_start(ap, fmt);
|
2003-12-01 18:21:04 +00:00
|
|
|
wsprintf(buffer, fmt, ap);
|
2001-01-20 18:40:27 +00:00
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
OutputDebugString(buffer);
|
|
|
|
}
|
|
|
|
|
2004-03-09 15:08:12 +00:00
|
|
|
|
2004-10-11 21:08:06 +00:00
|
|
|
INT_PTR CALLBACK
|
2004-03-09 15:08:12 +00:00
|
|
|
ShutdownComputerProc (HWND hwndDlg,
|
|
|
|
UINT uMsg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam)
|
2003-12-07 00:04:20 +00:00
|
|
|
{
|
|
|
|
switch(uMsg)
|
|
|
|
{
|
|
|
|
case WM_COMMAND:
|
|
|
|
{
|
|
|
|
switch(LOWORD(wParam))
|
|
|
|
{
|
|
|
|
case IDC_BTNSHTDOWNCOMPUTER:
|
|
|
|
EndDialog(hwndDlg, IDC_BTNSHTDOWNCOMPUTER);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
{
|
|
|
|
RemoveMenu(GetSystemMenu(hwndDlg, FALSE), SC_CLOSE, MF_BYCOMMAND);
|
|
|
|
SetFocus(GetDlgItem(hwndDlg, IDC_BTNSHTDOWNCOMPUTER));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2004-03-09 15:08:12 +00:00
|
|
|
static BOOLEAN
|
|
|
|
StartServices (VOID)
|
1999-06-06 16:40:10 +00:00
|
|
|
{
|
2000-08-12 19:33:23 +00:00
|
|
|
HANDLE ServicesInitEvent;
|
|
|
|
BOOLEAN Result;
|
|
|
|
STARTUPINFO StartupInfo;
|
|
|
|
PROCESS_INFORMATION ProcessInformation;
|
2000-12-08 00:45:04 +00:00
|
|
|
DWORD Count;
|
2005-07-12 01:56:14 +00:00
|
|
|
WCHAR ServiceString[] = L"services.exe";
|
2001-01-20 18:40:27 +00:00
|
|
|
|
2005-05-08 04:07:56 +00:00
|
|
|
/* Start the service control manager (services.exe) */
|
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
StartupInfo.cb = sizeof(StartupInfo);
|
|
|
|
StartupInfo.lpReserved = NULL;
|
|
|
|
StartupInfo.lpDesktop = NULL;
|
|
|
|
StartupInfo.lpTitle = NULL;
|
|
|
|
StartupInfo.dwFlags = 0;
|
|
|
|
StartupInfo.cbReserved2 = 0;
|
|
|
|
StartupInfo.lpReserved2 = 0;
|
2003-08-28 13:38:24 +00:00
|
|
|
|
2005-05-08 04:07:56 +00:00
|
|
|
#if 0
|
2003-12-01 18:21:04 +00:00
|
|
|
PrintString(L"WL: Creating new process - \"services.exe\".\n");
|
2003-08-28 13:38:24 +00:00
|
|
|
#endif
|
2002-12-27 13:54:28 +00:00
|
|
|
|
2005-07-12 01:56:14 +00:00
|
|
|
Result = CreateProcess(NULL,
|
|
|
|
ServiceString,
|
2002-12-27 13:54:28 +00:00
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
FALSE,
|
|
|
|
DETACHED_PROCESS,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
&StartupInfo,
|
|
|
|
&ProcessInformation);
|
2000-08-12 19:33:23 +00:00
|
|
|
if (!Result)
|
|
|
|
{
|
2003-12-01 18:21:04 +00:00
|
|
|
PrintString(L"WL: Failed to execute services\n");
|
2002-12-27 13:54:28 +00:00
|
|
|
return FALSE;
|
2000-08-12 19:33:23 +00:00
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-12-08 00:45:04 +00:00
|
|
|
/* wait for event creation (by SCM) for max. 20 seconds */
|
|
|
|
for (Count = 0; Count < 20; Count++)
|
|
|
|
{
|
2002-12-27 13:54:28 +00:00
|
|
|
Sleep(1000);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT("WL: Attempting to open event \"SvcctrlStartEvent_A3725DX\"\n");
|
2002-12-27 13:54:28 +00:00
|
|
|
ServicesInitEvent = OpenEvent(EVENT_ALL_ACCESS, //SYNCHRONIZE,
|
|
|
|
FALSE,
|
2003-12-01 18:21:04 +00:00
|
|
|
L"SvcctrlStartEvent_A3725DX");
|
2002-12-27 13:54:28 +00:00
|
|
|
if (ServicesInitEvent != NULL)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2000-12-08 00:45:04 +00:00
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2002-12-27 13:54:28 +00:00
|
|
|
if (ServicesInitEvent == NULL)
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to open event \"SvcctrlStartEvent_A3725DX\"\n");
|
2002-12-27 13:54:28 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2000-12-08 00:45:04 +00:00
|
|
|
/* wait for event signalization */
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT("WL: Waiting forever on event handle: %x\n", ServicesInitEvent);
|
2000-08-12 19:33:23 +00:00
|
|
|
WaitForSingleObject(ServicesInitEvent, INFINITE);
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT("WL: Closing event object \"SvcctrlStartEvent_A3725DX\"\n");
|
2000-12-08 00:45:04 +00:00
|
|
|
CloseHandle(ServicesInitEvent);
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT("WL: StartServices() Done.\n");
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2001-01-20 18:40:27 +00:00
|
|
|
return TRUE;
|
1999-06-06 16:40:10 +00:00
|
|
|
}
|
1999-06-08 22:45:53 +00:00
|
|
|
|
2004-03-09 15:08:12 +00:00
|
|
|
static BOOLEAN
|
|
|
|
StartLsass (VOID)
|
1999-06-08 22:45:53 +00:00
|
|
|
{
|
2000-08-12 19:33:23 +00:00
|
|
|
HANDLE LsassInitEvent;
|
|
|
|
BOOLEAN Result;
|
|
|
|
STARTUPINFO StartupInfo;
|
|
|
|
PROCESS_INFORMATION ProcessInformation;
|
2006-01-15 13:19:57 +00:00
|
|
|
WCHAR ServiceString[] = L"lsass.exe";
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
LsassInitEvent = CreateEvent(NULL,
|
2002-12-27 13:54:28 +00:00
|
|
|
TRUE,
|
|
|
|
FALSE,
|
2006-01-15 13:19:57 +00:00
|
|
|
L"\\SECURITY_SERVICES_STARTED");
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
if (LsassInitEvent == NULL)
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to create lsass notification event\n");
|
2002-12-27 13:54:28 +00:00
|
|
|
return(FALSE);
|
2000-08-12 19:33:23 +00:00
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-12-05 18:11:51 +00:00
|
|
|
/* Start the local security authority subsystem (lsass.exe) */
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
StartupInfo.cb = sizeof(StartupInfo);
|
|
|
|
StartupInfo.lpReserved = NULL;
|
|
|
|
StartupInfo.lpDesktop = NULL;
|
|
|
|
StartupInfo.lpTitle = NULL;
|
|
|
|
StartupInfo.dwFlags = 0;
|
|
|
|
StartupInfo.cbReserved2 = 0;
|
|
|
|
StartupInfo.lpReserved2 = 0;
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2006-01-15 13:19:57 +00:00
|
|
|
Result = CreateProcess(NULL,
|
|
|
|
ServiceString,
|
2002-12-27 13:54:28 +00:00
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
FALSE,
|
|
|
|
DETACHED_PROCESS,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
&StartupInfo,
|
|
|
|
&ProcessInformation);
|
2000-08-12 19:33:23 +00:00
|
|
|
if (!Result)
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to execute lsass\n");
|
2002-12-27 13:54:28 +00:00
|
|
|
return(FALSE);
|
2000-08-12 19:33:23 +00:00
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
WaitForSingleObject(LsassInitEvent, INFINITE);
|
2000-12-08 00:45:04 +00:00
|
|
|
CloseHandle(LsassInitEvent);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
return(TRUE);
|
1999-06-08 22:45:53 +00:00
|
|
|
}
|
2004-03-09 15:08:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
static BOOLEAN
|
2004-07-12 20:09:35 +00:00
|
|
|
OpenRegistryKey (HKEY *WinLogonKey)
|
2003-02-02 22:38:54 +00:00
|
|
|
{
|
|
|
|
return ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
2003-12-01 18:21:04 +00:00
|
|
|
L"SOFTWARE\\ReactOS\\Windows NT\\CurrentVersion\\WinLogon",
|
2003-02-02 22:38:54 +00:00
|
|
|
0,
|
|
|
|
KEY_QUERY_VALUE,
|
|
|
|
WinLogonKey);
|
|
|
|
}
|
|
|
|
|
2004-03-09 15:08:12 +00:00
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
static BOOLEAN StartProcess(PWCHAR ValueName)
|
2003-02-02 22:38:54 +00:00
|
|
|
{
|
|
|
|
BOOL StartIt;
|
2004-07-12 20:09:35 +00:00
|
|
|
HKEY WinLogonKey;
|
2003-02-02 22:38:54 +00:00
|
|
|
DWORD Type;
|
|
|
|
DWORD Size;
|
|
|
|
DWORD StartValue;
|
|
|
|
|
|
|
|
StartIt = TRUE;
|
|
|
|
if (OpenRegistryKey(&WinLogonKey))
|
|
|
|
{
|
|
|
|
Size = sizeof(DWORD);
|
|
|
|
if (ERROR_SUCCESS == RegQueryValueEx(WinLogonKey,
|
|
|
|
ValueName,
|
|
|
|
NULL,
|
|
|
|
&Type,
|
|
|
|
(LPBYTE) &StartValue,
|
|
|
|
&Size))
|
|
|
|
{
|
|
|
|
if (REG_DWORD == Type)
|
|
|
|
{
|
|
|
|
StartIt = (0 != StartValue);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RegCloseKey(WinLogonKey);
|
|
|
|
}
|
|
|
|
|
|
|
|
return StartIt;
|
|
|
|
}
|
2003-12-07 00:04:20 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
static BOOL RestartShell(void)
|
|
|
|
{
|
2004-07-12 20:09:35 +00:00
|
|
|
HKEY WinLogonKey;
|
2003-12-07 00:04:20 +00:00
|
|
|
DWORD Type, Size, Value;
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
if(OpenRegistryKey(&WinLogonKey))
|
|
|
|
{
|
|
|
|
Size = sizeof(DWORD);
|
|
|
|
if(ERROR_SUCCESS == RegQueryValueEx(WinLogonKey,
|
|
|
|
L"AutoRestartShell",
|
|
|
|
NULL,
|
|
|
|
&Type,
|
|
|
|
(LPBYTE)&Value,
|
|
|
|
&Size))
|
|
|
|
{
|
|
|
|
if(Type == REG_DWORD)
|
|
|
|
{
|
|
|
|
RegCloseKey(WinLogonKey);
|
|
|
|
return (Value != 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RegCloseKey(WinLogonKey);
|
2005-05-08 04:07:56 +00:00
|
|
|
}
|
2003-12-07 00:04:20 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
2004-05-25 15:53:16 +00:00
|
|
|
VOID STDCALL
|
|
|
|
RegisterHotKeys(VOID)
|
|
|
|
{
|
2006-07-30 08:38:35 +00:00
|
|
|
RegisterHotKey(hwndSASWindow, 0, MOD_ALT | MOD_CONTROL, VK_DELETE);
|
2004-05-25 15:53:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VOID STDCALL
|
|
|
|
UnregisterHotKeys(VOID)
|
|
|
|
{
|
|
|
|
UnregisterHotKey(NULL, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID STDCALL
|
|
|
|
HandleHotKey(MSG *Msg)
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("HOTKEY: Got hot key (%d)\n", Msg->wParam);
|
2004-05-25 15:53:16 +00:00
|
|
|
|
|
|
|
/* CTRL-ALT-DEL */
|
|
|
|
if (Msg->wParam == 0)
|
|
|
|
{
|
|
|
|
STARTUPINFO StartupInfo;
|
|
|
|
PROCESS_INFORMATION ProcessInformation;
|
|
|
|
|
|
|
|
StartupInfo.cb = sizeof(StartupInfo);
|
|
|
|
StartupInfo.lpReserved = NULL;
|
|
|
|
StartupInfo.lpDesktop = NULL;
|
|
|
|
StartupInfo.lpTitle = NULL;
|
|
|
|
StartupInfo.dwFlags = 0;
|
|
|
|
StartupInfo.cbReserved2 = 0;
|
|
|
|
StartupInfo.lpReserved2 = 0;
|
|
|
|
|
|
|
|
CreateProcessW(
|
|
|
|
L"taskmgr.exe",
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
FALSE,
|
|
|
|
CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
&StartupInfo,
|
|
|
|
&ProcessInformation);
|
|
|
|
|
|
|
|
CloseHandle (ProcessInformation.hProcess);
|
|
|
|
CloseHandle (ProcessInformation.hThread);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-03-09 15:08:12 +00:00
|
|
|
static PWCHAR
|
2004-12-22 01:22:08 +00:00
|
|
|
GetUserInit (WCHAR *CommandLine)
|
2003-01-23 00:16:47 +00:00
|
|
|
{
|
2004-07-12 20:09:35 +00:00
|
|
|
HKEY WinLogonKey;
|
2003-01-23 00:16:47 +00:00
|
|
|
BOOL GotCommandLine;
|
|
|
|
DWORD Type;
|
|
|
|
DWORD Size;
|
2003-12-01 18:21:04 +00:00
|
|
|
WCHAR Shell[_MAX_PATH];
|
2003-01-23 00:16:47 +00:00
|
|
|
|
|
|
|
GotCommandLine = FALSE;
|
2003-02-02 22:38:54 +00:00
|
|
|
if (OpenRegistryKey(&WinLogonKey))
|
2003-01-23 00:16:47 +00:00
|
|
|
{
|
|
|
|
Size = MAX_PATH;
|
|
|
|
if (ERROR_SUCCESS == RegQueryValueEx(WinLogonKey,
|
2004-12-22 01:22:08 +00:00
|
|
|
L"UserInit",
|
2003-01-23 00:16:47 +00:00
|
|
|
NULL,
|
|
|
|
&Type,
|
2003-02-02 22:38:54 +00:00
|
|
|
(LPBYTE) Shell,
|
2003-12-01 18:21:04 +00:00
|
|
|
&Size))
|
2003-01-23 00:16:47 +00:00
|
|
|
{
|
|
|
|
if (REG_EXPAND_SZ == Type)
|
|
|
|
{
|
|
|
|
ExpandEnvironmentStrings(Shell, CommandLine, _MAX_PATH);
|
|
|
|
GotCommandLine = TRUE;
|
|
|
|
}
|
|
|
|
else if (REG_SZ == Type)
|
|
|
|
{
|
2003-12-01 18:21:04 +00:00
|
|
|
wcscpy(CommandLine, Shell);
|
2003-01-23 00:16:47 +00:00
|
|
|
GotCommandLine = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RegCloseKey(WinLogonKey);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! GotCommandLine)
|
|
|
|
{
|
2004-12-22 01:22:08 +00:00
|
|
|
GetSystemDirectory(CommandLine, MAX_PATH - 15);
|
|
|
|
wcscat(CommandLine, L"\\userinit.exe");
|
2003-01-23 00:16:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return CommandLine;
|
|
|
|
}
|
|
|
|
|
2000-12-08 00:45:04 +00:00
|
|
|
|
2004-03-09 15:08:12 +00:00
|
|
|
static BOOL
|
|
|
|
DoLogonUser (PWCHAR Name,
|
|
|
|
PWCHAR Password)
|
|
|
|
{
|
|
|
|
PROCESS_INFORMATION ProcessInformation;
|
|
|
|
STARTUPINFO StartupInfo;
|
|
|
|
WCHAR CommandLine[MAX_PATH];
|
|
|
|
WCHAR CurrentDirectory[MAX_PATH];
|
2004-03-20 15:58:16 +00:00
|
|
|
PROFILEINFOW ProfileInfo;
|
2004-03-09 15:08:12 +00:00
|
|
|
BOOL Result;
|
2004-03-20 15:58:16 +00:00
|
|
|
LPVOID lpEnvironment = NULL;
|
2004-05-25 15:53:16 +00:00
|
|
|
MSG Msg;
|
2004-03-09 15:08:12 +00:00
|
|
|
|
|
|
|
Result = LogonUserW (Name,
|
|
|
|
NULL,
|
|
|
|
Password,
|
|
|
|
LOGON32_LOGON_INTERACTIVE,
|
|
|
|
LOGON32_PROVIDER_DEFAULT,
|
2005-12-01 22:29:57 +00:00
|
|
|
&WLSession->UserToken);
|
2004-03-09 15:08:12 +00:00
|
|
|
if (!Result)
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1 ("WL: LogonUserW() failed\n");
|
2004-03-20 15:58:16 +00:00
|
|
|
RtlDestroyEnvironment (lpEnvironment);
|
2004-03-09 15:08:12 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2000-12-08 00:45:04 +00:00
|
|
|
|
2004-03-20 15:58:16 +00:00
|
|
|
/* Load the user profile */
|
|
|
|
ProfileInfo.dwSize = sizeof(PROFILEINFOW);
|
|
|
|
ProfileInfo.dwFlags = 0;
|
|
|
|
ProfileInfo.lpUserName = Name;
|
|
|
|
ProfileInfo.lpProfilePath = NULL;
|
|
|
|
ProfileInfo.lpDefaultPath = NULL;
|
|
|
|
ProfileInfo.lpServerName = NULL;
|
|
|
|
ProfileInfo.lpPolicyPath = NULL;
|
|
|
|
ProfileInfo.hProfile = NULL;
|
|
|
|
|
2005-12-01 22:29:57 +00:00
|
|
|
if (!LoadUserProfileW (WLSession->UserToken,
|
2004-03-20 15:58:16 +00:00
|
|
|
&ProfileInfo))
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1 ("WL: LoadUserProfileW() failed\n");
|
2005-12-01 22:29:57 +00:00
|
|
|
CloseHandle (WLSession->UserToken);
|
2004-03-20 15:58:16 +00:00
|
|
|
RtlDestroyEnvironment (lpEnvironment);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!CreateEnvironmentBlock (&lpEnvironment,
|
2005-12-01 22:29:57 +00:00
|
|
|
WLSession->UserToken,
|
2004-03-20 15:58:16 +00:00
|
|
|
TRUE))
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: CreateEnvironmentBlock() failed\n");
|
2004-03-20 15:58:16 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2005-12-01 22:29:57 +00:00
|
|
|
if (ImpersonateLoggedOnUser(WLSession->UserToken))
|
2004-11-20 15:55:45 +00:00
|
|
|
{
|
|
|
|
UpdatePerUserSystemParameters(0, TRUE);
|
|
|
|
RevertToSelf();
|
|
|
|
}
|
|
|
|
|
2004-03-20 15:58:16 +00:00
|
|
|
GetWindowsDirectoryW (CurrentDirectory, MAX_PATH);
|
2004-03-09 15:08:12 +00:00
|
|
|
|
|
|
|
StartupInfo.cb = sizeof(StartupInfo);
|
|
|
|
StartupInfo.lpReserved = NULL;
|
|
|
|
StartupInfo.lpDesktop = NULL;
|
|
|
|
StartupInfo.lpTitle = NULL;
|
|
|
|
StartupInfo.dwFlags = 0;
|
|
|
|
StartupInfo.cbReserved2 = 0;
|
|
|
|
StartupInfo.lpReserved2 = 0;
|
|
|
|
|
2005-12-01 22:29:57 +00:00
|
|
|
Result = CreateProcessAsUserW (WLSession->UserToken,
|
2004-03-09 15:08:12 +00:00
|
|
|
NULL,
|
2004-12-22 01:22:08 +00:00
|
|
|
GetUserInit (CommandLine),
|
2004-03-09 15:08:12 +00:00
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
FALSE,
|
2005-07-12 01:56:14 +00:00
|
|
|
CREATE_UNICODE_ENVIRONMENT,
|
|
|
|
lpEnvironment,
|
2004-03-09 15:08:12 +00:00
|
|
|
CurrentDirectory,
|
|
|
|
&StartupInfo,
|
|
|
|
&ProcessInformation);
|
2004-03-20 15:58:16 +00:00
|
|
|
if (!Result)
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to execute user shell %s\n", CommandLine);
|
2005-12-01 22:29:57 +00:00
|
|
|
if (ImpersonateLoggedOnUser(WLSession->UserToken))
|
2004-11-20 15:55:45 +00:00
|
|
|
{
|
|
|
|
UpdatePerUserSystemParameters(0, FALSE);
|
|
|
|
RevertToSelf();
|
|
|
|
}
|
2005-12-01 22:29:57 +00:00
|
|
|
UnloadUserProfile (WLSession->UserToken,
|
2004-03-20 15:58:16 +00:00
|
|
|
ProfileInfo.hProfile);
|
2005-12-01 22:29:57 +00:00
|
|
|
CloseHandle (WLSession->UserToken);
|
2004-03-20 15:58:16 +00:00
|
|
|
DestroyEnvironmentBlock (lpEnvironment);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2003-01-23 00:16:47 +00:00
|
|
|
|
2004-05-25 15:53:16 +00:00
|
|
|
RegisterHotKeys();
|
|
|
|
|
|
|
|
while (WaitForSingleObject (ProcessInformation.hProcess, 100) != WAIT_OBJECT_0)
|
|
|
|
{
|
2006-07-30 08:38:35 +00:00
|
|
|
if (PeekMessage(&Msg, hwndSASWindow, 0, 0, PM_REMOVE))
|
2004-05-25 15:53:16 +00:00
|
|
|
{
|
|
|
|
TranslateMessage(&Msg);
|
|
|
|
DispatchMessage(&Msg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
UnregisterHotKeys();
|
2004-07-12 20:09:35 +00:00
|
|
|
|
2004-03-20 15:58:16 +00:00
|
|
|
CloseHandle (ProcessInformation.hProcess);
|
|
|
|
CloseHandle (ProcessInformation.hThread);
|
|
|
|
|
2005-12-01 22:29:57 +00:00
|
|
|
if (ImpersonateLoggedOnUser(WLSession->UserToken))
|
2004-11-20 15:55:45 +00:00
|
|
|
{
|
|
|
|
UpdatePerUserSystemParameters(0, FALSE);
|
|
|
|
RevertToSelf();
|
|
|
|
}
|
|
|
|
|
2004-03-20 15:58:16 +00:00
|
|
|
/* Unload user profile */
|
2005-12-01 22:29:57 +00:00
|
|
|
UnloadUserProfile (WLSession->UserToken,
|
2004-03-20 15:58:16 +00:00
|
|
|
ProfileInfo.hProfile);
|
2004-03-09 15:08:12 +00:00
|
|
|
|
2005-12-01 22:29:57 +00:00
|
|
|
CloseHandle (WLSession->UserToken);
|
2004-03-09 15:08:12 +00:00
|
|
|
|
2004-03-20 15:58:16 +00:00
|
|
|
RtlDestroyEnvironment (lpEnvironment);
|
|
|
|
|
2004-03-09 15:08:12 +00:00
|
|
|
return TRUE;
|
1999-06-08 22:45:53 +00:00
|
|
|
}
|
2006-07-30 08:38:35 +00:00
|
|
|
|
|
|
|
static LRESULT CALLBACK
|
|
|
|
SASWindowProc(
|
|
|
|
IN HWND hwndDlg,
|
|
|
|
IN UINT uMsg,
|
|
|
|
IN WPARAM wParam,
|
|
|
|
IN LPARAM lParam)
|
|
|
|
{
|
|
|
|
DbgBreakPoint();
|
|
|
|
switch (uMsg)
|
|
|
|
{
|
|
|
|
case WM_HOTKEY:
|
|
|
|
{
|
|
|
|
switch (lParam)
|
|
|
|
{
|
|
|
|
case MAKELONG(MOD_CONTROL | MOD_ALT, VK_DELETE):
|
|
|
|
{
|
|
|
|
DispatchSAS(WLSession, WLX_SAS_TYPE_CTRL_ALT_DEL);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
|
|
|
|
}
|
1999-06-08 22:45:53 +00:00
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
int STDCALL
|
2000-12-05 02:40:51 +00:00
|
|
|
WinMain(HINSTANCE hInstance,
|
2002-12-27 13:54:28 +00:00
|
|
|
HINSTANCE hPrevInstance,
|
|
|
|
LPSTR lpCmdLine,
|
|
|
|
int nShowCmd)
|
1999-06-08 22:45:53 +00:00
|
|
|
{
|
2006-07-22 16:03:12 +00:00
|
|
|
BOOLEAN Old;
|
2006-07-30 08:38:35 +00:00
|
|
|
WNDCLASS wndClass;
|
2000-08-12 19:33:23 +00:00
|
|
|
#if 0
|
2003-12-01 18:21:04 +00:00
|
|
|
LSA_STRING ProcessName, PackageName;
|
2002-07-17 21:04:57 +00:00
|
|
|
HANDLE LsaHandle;
|
|
|
|
LSA_OPERATIONAL_MODE Mode;
|
2003-12-01 18:21:04 +00:00
|
|
|
ULONG AuthenticationPackage;
|
2003-11-14 17:13:36 +00:00
|
|
|
#endif
|
2004-07-12 20:09:35 +00:00
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
hAppInstance = hInstance;
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-07-11 13:31:28 +00:00
|
|
|
if(!RegisterLogonProcess(GetCurrentProcessId(), TRUE))
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Could not register logon process\n");
|
2004-07-11 13:31:28 +00:00
|
|
|
NtShutdownSystem(ShutdownNoReboot);
|
|
|
|
ExitProcess(0);
|
|
|
|
return 0;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2006-07-22 16:03:12 +00:00
|
|
|
/* Get privilege */
|
|
|
|
RtlAdjustPrivilege(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, TRUE, FALSE, &Old);
|
|
|
|
|
2006-03-25 21:04:40 +00:00
|
|
|
if (StartProcess(L"StartLsass"))
|
|
|
|
{
|
|
|
|
if (!StartLsass())
|
|
|
|
{
|
|
|
|
DPRINT1("WL: Failed to start LSASS (0x%X)\n", GetLastError());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DPRINT1("WL: StartProcess() failed!\n");
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
if(!(WLSession = MsGinaInit()))
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to initialize msgina.dll\n");
|
2004-03-28 12:21:41 +00:00
|
|
|
NtShutdownSystem(ShutdownNoReboot);
|
|
|
|
ExitProcess(0);
|
|
|
|
return 0;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
WLSession->LogonStatus = LOGON_INITIALIZING;
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
if(!WlxCreateWindowStationAndDesktops(WLSession))
|
|
|
|
{
|
|
|
|
NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, 0, 0);
|
|
|
|
ExitProcess(1);
|
|
|
|
return 1;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2002-07-17 21:04:57 +00:00
|
|
|
/*
|
2004-03-28 12:21:41 +00:00
|
|
|
* Switch to winlogon desktop
|
2002-07-17 21:04:57 +00:00
|
|
|
*/
|
2004-03-28 12:21:41 +00:00
|
|
|
/* FIXME: Do start up in the application desktop for now. */
|
|
|
|
SetThreadDesktop(WLSession->ApplicationDesktop);
|
|
|
|
if(!SwitchDesktop(WLSession->ApplicationDesktop))
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Cannot switch to Winlogon desktop (0x%X)\n", GetLastError());
|
2004-03-28 12:21:41 +00:00
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2005-09-08 13:27:17 +00:00
|
|
|
InitServices();
|
|
|
|
|
2003-03-25 19:26:33 +00:00
|
|
|
/* Check for pending setup */
|
|
|
|
if (GetSetupType () != 0)
|
2004-03-28 12:21:41 +00:00
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT("Winlogon: CheckForSetup() in setup mode\n");
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
/* Run setup and reboot when done */
|
|
|
|
RunSetup();
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
NtShutdownSystem(ShutdownReboot);
|
|
|
|
ExitProcess(0);
|
|
|
|
return 0;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2006-03-25 21:04:40 +00:00
|
|
|
if(!InitializeSAS(WLSession))
|
2004-03-28 12:21:41 +00:00
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to initialize SAS\n");
|
2004-03-28 12:21:41 +00:00
|
|
|
ExitProcess(2);
|
|
|
|
return 2;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
#if 0
|
2003-12-01 18:21:04 +00:00
|
|
|
/* real winlogon uses "Winlogon" */
|
|
|
|
RtlInitUnicodeString((PUNICODE_STRING)&ProcessName, L"Winlogon");
|
2000-08-12 19:33:23 +00:00
|
|
|
Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
|
|
|
|
if (!NT_SUCCESS(Status))
|
2003-12-01 18:21:04 +00:00
|
|
|
{
|
|
|
|
switch(Status)
|
2000-08-12 19:33:23 +00:00
|
|
|
{
|
2003-12-01 18:21:04 +00:00
|
|
|
case STATUS_PORT_CONNECTION_REFUSED:
|
|
|
|
/* FIXME - we don't have the 'SeTcbPrivilege' pivilege, so set it or call
|
|
|
|
LsaAddAccountRights() and try again */
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: LsaRegisterLogonProcess() returned STATUS_PORT_CONNECTION_REFUSED\n");
|
2003-12-01 18:21:04 +00:00
|
|
|
break;
|
|
|
|
case STATUS_NAME_TOO_LONG:
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: LsaRegisterLogonProcess() returned STATUS_NAME_TOO_LONG\n");
|
2003-12-01 18:21:04 +00:00
|
|
|
break;
|
|
|
|
default:
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to connect to LSASS\n");
|
2003-12-01 18:21:04 +00:00
|
|
|
break;
|
2000-08-12 19:33:23 +00:00
|
|
|
}
|
2003-12-01 18:21:04 +00:00
|
|
|
return(1);
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
RtlInitUnicodeString((PUNICODE_STRING)&PackageName, L"Kerberos");
|
|
|
|
Status = LsaLookupAuthenticationPackage(LsaHandle, &PackageName, &AuthenticationPackage);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
LsaDeregisterLogonProcess(LsaHandle);
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to lookup authentication package\n");
|
2003-12-01 18:21:04 +00:00
|
|
|
return(1);
|
|
|
|
}
|
2000-08-12 19:33:23 +00:00
|
|
|
#endif
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2001-06-12 17:51:51 +00:00
|
|
|
/* FIXME: Create a window class and associate a Winlogon
|
|
|
|
* window procedure with it.
|
|
|
|
* Register SAS with the window.
|
|
|
|
* Register for logoff notification
|
|
|
|
*/
|
2006-07-30 08:38:35 +00:00
|
|
|
/* Create a window class */
|
|
|
|
ZeroMemory(&wndClass, sizeof(WNDCLASS));
|
|
|
|
wndClass.style = CS_GLOBALCLASS;
|
|
|
|
wndClass.lpfnWndProc = SASWindowProc;
|
|
|
|
wndClass.hInstance = hInstance;
|
|
|
|
wndClass.lpszClassName = L"SAS Window class";
|
|
|
|
RegisterClass(&wndClass);
|
|
|
|
hwndSASWindow = CreateWindow(
|
|
|
|
L"SAS Window class", L"SAS window", 0,
|
|
|
|
0, 0, 0, 0,
|
|
|
|
NULL, NULL, hInstance, NULL);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2000-08-12 19:33:23 +00:00
|
|
|
/* Main loop */
|
2002-02-08 02:57:10 +00:00
|
|
|
#if 0
|
2003-03-20 20:56:52 +00:00
|
|
|
/* Display login prompt */
|
|
|
|
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),
|
|
|
|
LoginPrompt,
|
|
|
|
strlen(LoginPrompt), // wcslen(LoginPrompt),
|
|
|
|
&Result,
|
|
|
|
NULL);
|
|
|
|
i = 0;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
ReadConsole(GetStdHandle(STD_INPUT_HANDLE),
|
|
|
|
&LoginName[i],
|
|
|
|
1,
|
|
|
|
&Result,
|
|
|
|
NULL);
|
|
|
|
i++;
|
|
|
|
} while (LoginName[i - 1] != '\n');
|
|
|
|
LoginName[i - 1] = 0;
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-03-20 20:56:52 +00:00
|
|
|
/* Display password prompt */
|
|
|
|
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),
|
|
|
|
PasswordPrompt,
|
|
|
|
strlen(PasswordPrompt), // wcslen(PasswordPrompt),
|
|
|
|
&Result,
|
|
|
|
NULL);
|
|
|
|
i = 0;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
ReadConsole(GetStdHandle(STD_INPUT_HANDLE),
|
|
|
|
&Password[i],
|
|
|
|
1,
|
|
|
|
&Result,
|
|
|
|
NULL);
|
|
|
|
i++;
|
|
|
|
} while (Password[i - 1] != '\n');
|
|
|
|
Password[i - 1] =0;
|
2002-02-08 02:57:10 +00:00
|
|
|
#endif
|
2003-03-20 20:56:52 +00:00
|
|
|
|
2004-05-25 15:53:16 +00:00
|
|
|
RegisterHotKeys();
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-05-25 15:53:16 +00:00
|
|
|
SessionLoop(WLSession);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-05-25 15:53:16 +00:00
|
|
|
UnregisterHotKeys();
|
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
/* FIXME - Flush disks and registry, ... */
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
if(WLSession->LogonStatus == LOGON_SHUTDOWN)
|
|
|
|
{
|
|
|
|
/* FIXME - only show this dialog if it's a shutdown and the computer doesn't support APM */
|
|
|
|
switch(DialogBox(hInstance, MAKEINTRESOURCE(IDD_SHUTDOWNCOMPUTER), 0, ShutdownComputerProc))
|
|
|
|
{
|
|
|
|
case IDC_BTNSHTDOWNCOMPUTER:
|
|
|
|
NtShutdownSystem(ShutdownReboot);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
NtShutdownSystem(ShutdownNoReboot);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
ExitProcess(0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: LogonStatus != LOGON_SHUTDOWN!!!\n");
|
2004-03-28 12:21:41 +00:00
|
|
|
ExitProcess(0);
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
DisplayStatusMessage(PWLSESSION Session, HDESK hDesktop, DWORD dwOptions, PWSTR pTitle, PWSTR pMessage)
|
|
|
|
{
|
|
|
|
if(Session->SuppressStatus)
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
return Session->MsGina.Functions.WlxDisplayStatusMessage(Session->MsGina.Context, hDesktop, dwOptions, pTitle, pMessage);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
InitServices(void)
|
|
|
|
{
|
|
|
|
WCHAR StatusMsg[256];
|
|
|
|
|
|
|
|
LoadString(hAppInstance, IDS_REACTOSISSTARTINGUP, StatusMsg, 256 * sizeof(WCHAR));
|
|
|
|
DisplayStatusMessage(WLSession, WLSession->ApplicationDesktop, 0, NULL, StatusMsg);
|
|
|
|
|
|
|
|
/* start system processes (services.exe & lsass.exe) */
|
|
|
|
if(StartProcess(L"StartServices"))
|
|
|
|
{
|
|
|
|
if(!StartServices())
|
|
|
|
{
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: Failed to start Services (0x%X)\n", GetLastError());
|
2004-03-28 12:21:41 +00:00
|
|
|
}
|
|
|
|
}
|
2006-03-25 21:04:40 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
DPRINT1("WL: StartProcess() failed!\n");
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
|
|
DoLogin(PWLSESSION Session)
|
|
|
|
{
|
|
|
|
DWORD WlxAction, Options;
|
|
|
|
WLX_MPR_NOTIFY_INFO MprNotifyInfo;
|
|
|
|
PWLX_PROFILE_V2_0 Profile;
|
2004-07-03 17:40:27 +00:00
|
|
|
PSID LogonSid = NULL;
|
2004-03-28 12:21:41 +00:00
|
|
|
HANDLE Token;
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
/* FIXME - Create a Logon Sid
|
|
|
|
if(!(LogonSid = CreateUserLogonSid(NULL)))
|
|
|
|
{
|
|
|
|
return WLX_SAS_ACTION_NONE;
|
|
|
|
}
|
|
|
|
*/
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
Options = 0;
|
|
|
|
WlxAction = Session->MsGina.Functions.WlxLoggedOutSAS(Session->MsGina.Context,
|
|
|
|
Session->SASAction,
|
|
|
|
&Session->LogonId,
|
|
|
|
LogonSid,
|
|
|
|
&Options,
|
|
|
|
&Token,
|
|
|
|
&MprNotifyInfo,
|
|
|
|
(PVOID*)&Profile);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
return WlxAction;
|
|
|
|
}
|
2003-12-01 18:21:04 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
void
|
|
|
|
SessionLoop(PWLSESSION Session)
|
|
|
|
{
|
|
|
|
//WCHAR StatusMsg[256];
|
|
|
|
// HANDLE hShutdownEvent;
|
|
|
|
DWORD WlxAction;
|
|
|
|
MSG Msg;
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
WlxAction = WLX_SAS_ACTION_NONE;
|
|
|
|
Session->LogonStatus = LOGON_NONE;
|
|
|
|
while(WlxAction == WLX_SAS_ACTION_NONE)
|
|
|
|
{
|
|
|
|
RemoveStatusMessage(Session);
|
|
|
|
if(Session->LogonStatus == LOGON_NONE)
|
|
|
|
{
|
|
|
|
Session->LogonStatus = LOGON_SHOWINGLOGON;
|
|
|
|
/* we're ready to display a logon window,
|
|
|
|
don't timeout dialogboxes here */
|
|
|
|
WlxSetTimeout(Session->MsGina.Context, 0);
|
|
|
|
Session->SuppressStatus = TRUE;
|
|
|
|
/* tell msgina to show a window telling the user one can logon */
|
|
|
|
DisplaySASNotice(Session);
|
|
|
|
Session->SuppressStatus = FALSE;
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
if(Session->SASAction == WLX_SAS_ACTION_LOGOFF)
|
|
|
|
{
|
|
|
|
/* the system wants to log off here */
|
|
|
|
Session->LogonStatus = LOGON_SHUTDOWN;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
WlxAction = DoLogin(Session);
|
2006-07-30 08:38:35 +00:00
|
|
|
if (WlxAction == WLX_SAS_ACTION_LOGON)
|
|
|
|
{
|
|
|
|
DoLogonUser(L"Administrator", L"Secret");
|
|
|
|
}
|
|
|
|
else if(WlxAction == WLX_SAS_ACTION_LOGOFF)
|
2004-03-28 12:21:41 +00:00
|
|
|
{
|
|
|
|
/* the user doesn't want to login, instead pressed cancel
|
|
|
|
we should display the window again so one can logon again */
|
|
|
|
/* FIXME - disconnect any connections in case we did a remote logon */
|
2006-03-25 21:04:40 +00:00
|
|
|
DPRINT1("WL: DoLogin failed\n");
|
2004-03-28 12:21:41 +00:00
|
|
|
WlxAction = WLX_SAS_ACTION_NONE;
|
|
|
|
}
|
|
|
|
if(WlxAction == WLX_SAS_ACTION_NONE)
|
|
|
|
{
|
|
|
|
if(Session->SASAction == WLX_SAS_ACTION_LOGOFF)
|
|
|
|
{
|
|
|
|
/* system is about to shut down, leave the main loop */
|
|
|
|
Session->LogonStatus = LOGON_SHUTDOWN;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
Session->LogonStatus = LOGON_NONE;
|
|
|
|
continue;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
/* FIXME - don't leave the loop when suspending the computer */
|
|
|
|
if(WLX_SUSPENDING(WlxAction))
|
|
|
|
{
|
|
|
|
Session->LogonStatus = LOGON_NONE;
|
|
|
|
WlxAction = WLX_SAS_ACTION_NONE;
|
|
|
|
/* don't leave the loop */
|
|
|
|
continue;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
if(WLX_SHUTTINGDOWN(WlxAction))
|
|
|
|
{
|
|
|
|
Session->LogonStatus = LOGON_SHUTDOWN;
|
|
|
|
/* leave the loop here */
|
|
|
|
break;
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
/* Message loop for the SAS window */
|
2006-07-30 08:38:35 +00:00
|
|
|
while(GetMessage(&Msg, hwndSASWindow, 0, 0))
|
2004-03-28 12:21:41 +00:00
|
|
|
{
|
|
|
|
TranslateMessage(&Msg);
|
|
|
|
DispatchMessage(&Msg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
2003-12-01 18:21:04 +00:00
|
|
|
LoadString(hAppInstance, IDS_PREPARENETWORKCONNECTIONS, StatusMsg, 256 * sizeof(WCHAR));
|
|
|
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
|
|
|
ApplicationDesktop,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
StatusMsg);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
Sleep(150);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
LoadString(hAppInstance, IDS_APPLYINGCOMPUTERSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
|
|
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
|
|
|
ApplicationDesktop,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
StatusMsg);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
Sleep(150);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
|
|
|
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
|
|
|
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
|
|
|
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
Sleep(250);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
LoadString(hAppInstance, IDS_LOADINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
|
|
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
|
|
|
ApplicationDesktop,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
StatusMsg);
|
2004-03-28 12:21:41 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
Sleep(150);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
LoadString(hAppInstance, IDS_APPLYINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
|
|
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
|
|
|
ApplicationDesktop,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
StatusMsg);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
Sleep(150);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
|
|
|
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
if(!MsGinaInst->Functions->WlxActivateUserShell(MsGinaInst->Context,
|
|
|
|
L"WinSta0\\Default",
|
|
|
|
NULL,
|
|
|
|
NULL))
|
|
|
|
{
|
|
|
|
LoadString(hAppInstance, IDS_FAILEDACTIVATEUSERSHELL, StatusMsg, 256 * sizeof(WCHAR));
|
|
|
|
MessageBox(0, StatusMsg, NULL, MB_ICONERROR);
|
|
|
|
SetEvent(hShutdownEvent);
|
|
|
|
}
|
2005-05-08 04:07:56 +00:00
|
|
|
|
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
WaitForSingleObject(hShutdownEvent, INFINITE);
|
|
|
|
CloseHandle(hShutdownEvent);
|
2003-03-20 20:56:52 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
LoadString(hAppInstance, IDS_SAVEYOURSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
|
|
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
|
|
|
ApplicationDesktop,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
StatusMsg);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
Sleep(150);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
MsGinaInst->Functions->WlxShutdown(MsGinaInst->Context, WLX_SAS_ACTION_SHUTDOWN);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
LoadString(hAppInstance, IDS_REACTOSISSHUTTINGDOWN, StatusMsg, 256 * sizeof(WCHAR));
|
|
|
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
|
|
|
ApplicationDesktop,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
StatusMsg);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2004-03-28 12:21:41 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
Sleep(250);
|
2005-05-08 04:07:56 +00:00
|
|
|
|
2003-12-07 00:04:20 +00:00
|
|
|
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
|
|
|
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
2004-03-28 12:21:41 +00:00
|
|
|
*/
|
1999-06-18 22:11:21 +00:00
|
|
|
}
|
2004-03-28 12:21:41 +00:00
|
|
|
|