mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 18:31:56 +00:00
Shutdown step 1: inform winlogon
svn path=/trunk/; revision=10094
This commit is contained in:
parent
16a868a4e7
commit
4ce7742222
18 changed files with 385 additions and 76 deletions
28
reactos/include/reactos/winlogon.h
Normal file
28
reactos/include/reactos/winlogon.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* $Id: winlogon.h,v 1.1 2004/07/12 20:09:35 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: include/reactos/winlogon.h
|
||||
* PURPOSE: Interface to winlogon
|
||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
||||
* REVISIONS:
|
||||
* 1999-11-06 (ea)
|
||||
* Moved from include/internal in include/reactos
|
||||
* to be used by buildno.
|
||||
* 2002-01-17 (ea)
|
||||
* KERNEL_VERSION removed. Use
|
||||
* reactos/buildno.h:KERNEL_VERSION_STR instead.
|
||||
*/
|
||||
|
||||
#ifndef REACTOS_WINLOGON_H_INCLUDED
|
||||
#define REACTOS_WINLOGON_H_INCLUDED
|
||||
|
||||
#define WINLOGON_DESKTOP L"Winlogon"
|
||||
#define WINLOGON_SAS_CLASS L"SAS window class"
|
||||
#define WINLOGON_SAS_TITLE L"SAS"
|
||||
|
||||
#define PM_WINLOGON_EXITWINDOWS WM_APP
|
||||
|
||||
#endif /* REACTOS_WINLOGON_H_INCLUDED */
|
||||
|
||||
/* EOF */
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: exit.c,v 1.4 2004/04/09 20:03:14 navaraf Exp $
|
||||
/* $Id: exit.c,v 1.5 2004/07/12 20:09:34 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS user32.dll
|
||||
|
@ -13,6 +13,60 @@
|
|||
#include <ntos.h>
|
||||
#include <ntdll/csr.h>
|
||||
|
||||
/*
|
||||
* Sequence of events:
|
||||
*
|
||||
* - App (usually explorer) calls ExitWindowsEx()
|
||||
* - ExitWindowsEx() sends a message to CSRSS (note: investigation shows it
|
||||
* doesn't transfer to kernel mode)
|
||||
* - CSRSS impersonates the caller and sends a message to a hidden WinLogon window
|
||||
* - WinLogon sends a SAS event to the GINA, asking for permission (e.g. if the
|
||||
* required rights are granted) to proceed
|
||||
* - WinLogon enters pending log-out state
|
||||
* - WinLogon impersonates the interactive user and calls ExitWindowsEx() again,
|
||||
* passing some special internal flags
|
||||
* - CSRSS loops over all processes of the interactive user (sorted by their
|
||||
* SetProcessShutdownParameters() level), sending WM_QUERYENDSESSION and
|
||||
* WM_ENDSESSION messages to its top-level windows. If the messages aren't
|
||||
* processed within the timeout period (registry key HKCU\Control Panel\Desktop\HungAppTimeout)
|
||||
* CSRSS will put up a dialog box asking if the process should be terminated.
|
||||
* Using the registry key HKCU\Control Panel\Desktop\AutoEndTask you can
|
||||
* specify that the dialog box shouldn't be shown and CSRSS should just
|
||||
* terminates the thread. If the the WM_ENDSESSION message is processed
|
||||
* but the thread doesn't terminate within the timeout specified by
|
||||
* HKCU\Control Panel\Desktop\WaitToKillAppTimeout CSRSS will terminate
|
||||
* the thread. When all the top-level windows have been destroyed CSRSS
|
||||
* will terminate the process.
|
||||
* If the process is a console process, CSRSS will send a CTRL_LOGOFF_EVENT
|
||||
* to the console control handler on logoff. No event is sent on shutdown.
|
||||
* If the handler doesn't respond in time the same activities as for GUI
|
||||
* apps (i.e. display dialog box etc) take place. This also happens if
|
||||
* the handler returns TRUE.
|
||||
* - This ends the processing for the first ExitWindowsEx() call from WinLogon.
|
||||
* Execution continues in WinLogon, which calls ExitWindowsEx() again to
|
||||
* terminate COM processes in the interactive user's session.
|
||||
* - WinLogon stops impersonating the interactive user (whos processes are
|
||||
* all dead by now). and enters log-out state
|
||||
* - If the ExitWindowsEx() request was for a logoff, WinLogon sends a SAS
|
||||
* event (to display the "press ctrl+alt+del") to the GINA. WinLogon then
|
||||
* waits for the GINA to send a SAS event to login.
|
||||
* - If the ExitWindowsEx() request was for shutdown/restart, WinLogon calls
|
||||
* ExitWindowsEx() again in the system process context.
|
||||
* - CSRSS goes through the motions of sending WM_QUERYENDSESSION/WM_ENDSESSION
|
||||
* to GUI processes running in the system process context but won't display
|
||||
* dialog boxes or kill threads/processes. Same for console processes,
|
||||
* using the CTRL_SHUTDOWN_EVENT. The Service Control Manager is one of
|
||||
* these console processes and has a special timeout value WaitToKillServiceTimeout.
|
||||
* - WinLogon calls ADVAPI32.InitiateSystemShutdown()
|
||||
* - ADVAPI32.InitiateSystemShutdown*() issues a "InitiateSystemShutdown" request
|
||||
* to the SM (SMSS API # 1)
|
||||
* - the SM propagates the shutdown request to every environment subsystem it
|
||||
* started since bootstrap time (still active ones, of course)
|
||||
* - each environment subsystem, on shutdown request, releases every resource
|
||||
* it aquired during its life (processes, memory etc), then dies
|
||||
* - when every environment subsystem has gone to bed, the SM actually initiates
|
||||
* to shutdown the kernel and executive by calling NtShutdownSystem.
|
||||
*/
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: misc.c,v 1.6 2004/07/08 14:35:10 ekohl Exp $
|
||||
/* $Id: misc.c,v 1.7 2004/07/12 20:09:34 gvg Exp $
|
||||
*
|
||||
* PROJECT: ReactOS user32.dll
|
||||
* FILE: lib/user32/misc/misc.c
|
||||
|
@ -31,6 +31,7 @@
|
|||
#include <windows.h>
|
||||
#include <user32.h>
|
||||
#include <debug.h>
|
||||
#include <ntdll/csr.h>
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
|
@ -76,3 +77,31 @@ RegisterLogonProcess(DWORD dwProcessId, BOOL bRegister)
|
|||
(DWORD)bRegister,
|
||||
TWOPARAM_ROUTINE_REGISTERLOGONPROC);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
BOOL
|
||||
STDCALL
|
||||
SetLogonNotifyWindow (HWND Wnd, HWINSTA WinSta)
|
||||
{
|
||||
/* Maybe we should call NtUserSetLogonNotifyWindow and let that one inform CSRSS??? */
|
||||
CSRSS_API_REQUEST Request;
|
||||
CSRSS_API_REPLY Reply;
|
||||
NTSTATUS Status;
|
||||
|
||||
Request.Type = CSRSS_SET_LOGON_NOTIFY_WINDOW;
|
||||
Request.Data.SetLogonNotifyWindowRequest.LogonNotifyWindow = Wnd;
|
||||
|
||||
Status = CsrClientCallServer(&Request,
|
||||
&Reply,
|
||||
sizeof(CSRSS_API_REQUEST),
|
||||
sizeof(CSRSS_API_REPLY));
|
||||
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status))
|
||||
{
|
||||
SetLastError(RtlNtStatusToDosError(Status));
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: user.c,v 1.3 2004/04/09 20:03:15 navaraf Exp $
|
||||
/* $Id: user.c,v 1.4 2004/07/12 20:09:34 gvg Exp $
|
||||
*
|
||||
* reactos/subsys/csrss/api/user.c
|
||||
*
|
||||
|
@ -51,15 +51,4 @@ CSR_API(CsrRegisterServicesProcess)
|
|||
return(Status);
|
||||
}
|
||||
|
||||
|
||||
CSR_API(CsrExitReactos)
|
||||
{
|
||||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
|
||||
|
||||
Reply->Status = STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
return(STATUS_NOT_IMPLEMENTED);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: api.h,v 1.5 2004/07/03 17:15:02 hbirr Exp $
|
||||
/* $Id: api.h,v 1.6 2004/07/12 20:09:34 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
|
@ -131,6 +131,9 @@ CSR_API(CsrExitReactos);
|
|||
CSR_API(CsrGetShutdownParameters);
|
||||
CSR_API(CsrSetShutdownParameters);
|
||||
|
||||
CSR_API(CsrSetLogonNotifyWindow);
|
||||
CSR_API(CsrRegisterLogonProcess);
|
||||
|
||||
#endif /* ndef API_H_INCLUDED */
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: init.c,v 1.28 2004/07/03 17:15:02 hbirr Exp $
|
||||
/* $Id: init.c,v 1.29 2004/07/12 20:09:34 gvg Exp $
|
||||
*
|
||||
* reactos/subsys/csrss/init.c
|
||||
*
|
||||
|
@ -207,7 +207,6 @@ CSRSS_API_DEFINITION NativeDefinitions[] =
|
|||
CSRSS_DEFINE_API(CSRSS_TERMINATE_PROCESS, CsrTerminateProcess),
|
||||
CSRSS_DEFINE_API(CSRSS_CONNECT_PROCESS, CsrConnectProcess),
|
||||
CSRSS_DEFINE_API(CSRSS_REGISTER_SERVICES_PROCESS, CsrRegisterServicesProcess),
|
||||
CSRSS_DEFINE_API(CSRSS_EXIT_REACTOS, CsrExitReactos),
|
||||
CSRSS_DEFINE_API(CSRSS_GET_SHUTDOWN_PARAMETERS, CsrGetShutdownParameters),
|
||||
CSRSS_DEFINE_API(CSRSS_SET_SHUTDOWN_PARAMETERS, CsrSetShutdownParameters),
|
||||
CSRSS_DEFINE_API(CSRSS_GET_INPUT_HANDLE, CsrGetInputHandle),
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $Id: makefile,v 1.29 2004/05/28 21:33:41 gvg Exp $
|
||||
# $Id: makefile,v 1.30 2004/07/12 20:09:34 gvg Exp $
|
||||
|
||||
PATH_TO_TOP = ../..
|
||||
|
||||
|
@ -13,7 +13,7 @@ TARGET_SDKLIBS = rosrtl.a ntdll.a
|
|||
|
||||
TARGET_INSTALLDIR = system32
|
||||
|
||||
TARGET_CFLAGS = -D__NTAPP__ -Wall -Werror -Iinclude
|
||||
TARGET_CFLAGS = -D__NTAPP__ -D__USE_W32API -Wall -Werror -Iinclude
|
||||
|
||||
TARGET_LFLAGS = -nostdlib
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $Id: Makefile,v 1.3 2004/01/11 17:31:15 gvg Exp $
|
||||
# $Id: Makefile,v 1.4 2004/07/12 20:09:34 gvg Exp $
|
||||
|
||||
PATH_TO_TOP = ../../..
|
||||
|
||||
|
@ -9,13 +9,13 @@ TARGET_NAME = win32csr
|
|||
TARGET_BASE = 0x5ffb0000
|
||||
|
||||
# require os code to explicitly request A/W version of structs/functions
|
||||
TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror -I../include
|
||||
TARGET_CFLAGS += -D__USE_W32API -D_DISABLE_TIDENTS -Wall -Werror -I../include
|
||||
|
||||
TARGET_LFLAGS = -nostartfiles -nostdlib
|
||||
|
||||
TARGET_SDKLIBS = ntdll.a kernel32.a user32.a gdi32.a
|
||||
|
||||
TARGET_OBJECTS = dllmain.o conio.o desktopbg.o guiconsole.o tuiconsole.o
|
||||
TARGET_OBJECTS = dllmain.o conio.o desktopbg.o exitros.o guiconsole.o tuiconsole.o
|
||||
|
||||
TARGET_ENTRY = _DllMain@12
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: dllmain.c,v 1.5 2004/05/28 21:33:41 gvg Exp $
|
||||
/* $Id: dllmain.c,v 1.6 2004/07/12 20:09:34 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
|
@ -55,6 +55,7 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
|
|||
CSRSS_DEFINE_API(CSRSS_READ_CONSOLE_OUTPUT_CHAR, CsrReadConsoleOutputChar),
|
||||
CSRSS_DEFINE_API(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB, CsrReadConsoleOutputAttrib),
|
||||
CSRSS_DEFINE_API(CSRSS_GET_NUM_INPUT_EVENTS, CsrGetNumberOfConsoleInputEvents),
|
||||
CSRSS_DEFINE_API(CSRSS_EXIT_REACTOS, CsrExitReactos),
|
||||
CSRSS_DEFINE_API(CSRSS_PEEK_CONSOLE_INPUT, CsrPeekConsoleInput),
|
||||
CSRSS_DEFINE_API(CSRSS_READ_CONSOLE_OUTPUT, CsrReadConsoleOutput),
|
||||
CSRSS_DEFINE_API(CSRSS_WRITE_CONSOLE_INPUT, CsrWriteConsoleInput),
|
||||
|
@ -62,6 +63,8 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
|
|||
CSRSS_DEFINE_API(CSRSS_CREATE_DESKTOP, CsrCreateDesktop),
|
||||
CSRSS_DEFINE_API(CSRSS_SHOW_DESKTOP, CsrShowDesktop),
|
||||
CSRSS_DEFINE_API(CSRSS_HIDE_DESKTOP, CsrHideDesktop),
|
||||
CSRSS_DEFINE_API(CSRSS_SET_LOGON_NOTIFY_WINDOW, CsrSetLogonNotifyWindow),
|
||||
CSRSS_DEFINE_API(CSRSS_REGISTER_LOGON_PROCESS, CsrRegisterLogonProcess),
|
||||
{ 0, 0, 0, NULL }
|
||||
};
|
||||
|
||||
|
|
112
reactos/subsys/csrss/win32csr/exitros.c
Normal file
112
reactos/subsys/csrss/win32csr/exitros.c
Normal file
|
@ -0,0 +1,112 @@
|
|||
/* $Id: exitros.c,v 1.1 2004/07/12 20:09:34 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS CSRSS subsystem
|
||||
* FILE: subsys/csrss/win32csr/exitros.c
|
||||
* PURPOSE: Logout/shutdown
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <windows.h>
|
||||
#include <reactos/winlogon.h>
|
||||
#include "api.h"
|
||||
#include "win32csr.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
static HWND LogonNotifyWindow = NULL;
|
||||
static DWORD LogonProcess = 0;
|
||||
|
||||
CSR_API(CsrRegisterLogonProcess)
|
||||
{
|
||||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
|
||||
|
||||
if (Request->Data.RegisterLogonProcessRequest.Register)
|
||||
{
|
||||
if (0 != LogonProcess)
|
||||
{
|
||||
Reply->Status = STATUS_LOGON_SESSION_EXISTS;
|
||||
return Reply->Status;
|
||||
}
|
||||
LogonProcess = Request->Data.RegisterLogonProcessRequest.ProcessId;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((DWORD) Request->Header.ClientId.UniqueProcess != LogonProcess)
|
||||
{
|
||||
DPRINT1("Current logon process 0x%x, can't deregister from process 0x%x\n",
|
||||
LogonProcess, Request->Header.ClientId.UniqueProcess);
|
||||
Reply->Status = STATUS_NOT_LOGON_PROCESS;
|
||||
return Reply->Status;
|
||||
}
|
||||
LogonProcess = 0;
|
||||
}
|
||||
|
||||
Reply->Status = STATUS_SUCCESS;
|
||||
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
CSR_API(CsrSetLogonNotifyWindow)
|
||||
{
|
||||
DWORD WindowCreator;
|
||||
|
||||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
|
||||
|
||||
if (0 == GetWindowThreadProcessId(Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow,
|
||||
&WindowCreator))
|
||||
{
|
||||
DPRINT1("Can't get window creator\n");
|
||||
Reply->Status = STATUS_INVALID_HANDLE;
|
||||
return Reply->Status;
|
||||
}
|
||||
if (WindowCreator != LogonProcess)
|
||||
{
|
||||
DPRINT1("Trying to register window not created by winlogon as notify window\n");
|
||||
Reply->Status = STATUS_ACCESS_DENIED;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
LogonNotifyWindow = Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow;
|
||||
|
||||
Reply->Status = STATUS_SUCCESS;
|
||||
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
CSR_API(CsrExitReactos)
|
||||
{
|
||||
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
||||
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE;
|
||||
|
||||
if (NULL == LogonNotifyWindow)
|
||||
{
|
||||
DPRINT1("No LogonNotifyWindow registered\n");
|
||||
Reply->Status = STATUS_NOT_FOUND;
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
/* FIXME Inside 2000 says we should impersonate the caller here */
|
||||
Reply->Status = SendMessageW(LogonNotifyWindow, PM_WINLOGON_EXITWINDOWS,
|
||||
(WPARAM) Request->Header.ClientId.UniqueProcess,
|
||||
(LPARAM) Request->Data.ExitReactosRequest.Flags);
|
||||
/* If the message isn't handled, the return value is 0, so 0 doesn't indicate success.
|
||||
Success is indicated by a 1 return value, if anything besides 0 or 1 it's a
|
||||
NTSTATUS value */
|
||||
if (1 == Reply->Status)
|
||||
{
|
||||
Reply->Status = STATUS_SUCCESS;
|
||||
}
|
||||
else if (0 == Reply->Status)
|
||||
{
|
||||
Reply->Status = STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
return Reply->Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -1,4 +1,4 @@
|
|||
# $Id: makefile,v 1.10 2004/03/28 12:21:41 weiden Exp $
|
||||
# $Id: makefile,v 1.11 2004/07/12 20:09:35 gvg Exp $
|
||||
|
||||
PATH_TO_TOP = ../../..
|
||||
|
||||
|
@ -14,10 +14,15 @@ TARGET_SDKLIBS = ntdll.a kernel32.a user32.a advapi32.a userenv.a secur32.a
|
|||
|
||||
TARGET_OBJECTS = setup.o winlogon.o wlx.o sas.o
|
||||
|
||||
TARGET_CFLAGS = -Wall -Werror -DUNICODE -D_UNICODE -I./ -I../../../include
|
||||
TARGET_CFLAGS = -Wall -Werror -D__USE_W32API -DUNICODE -D_UNICODE -I./
|
||||
|
||||
include $(PATH_TO_TOP)/rules.mak
|
||||
|
||||
include $(TOOLS_PATH)/helper.mk
|
||||
|
||||
# Automatic dependency tracking
|
||||
DEP_OBJECTS := $(TARGET_OBJECTS)
|
||||
|
||||
include $(PATH_TO_TOP)/tools/depend.mk
|
||||
|
||||
# EOF
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: sas.c,v 1.1 2004/03/28 12:21:41 weiden Exp $
|
||||
/* $Id: sas.c,v 1.2 2004/07/12 20:09:35 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -16,15 +16,22 @@
|
|||
#include <ntsecapi.h>
|
||||
#include <wchar.h>
|
||||
#include <userenv.h>
|
||||
#include <reactos/winlogon.h>
|
||||
|
||||
#include "setup.h"
|
||||
#include "winlogon.h"
|
||||
#include "resource.h"
|
||||
|
||||
#define SAS_CLASS L"SAS window class"
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#define HK_CTRL_ALT_DEL 0
|
||||
#define HK_CTRL_SHIFT_ESC 1
|
||||
|
||||
#ifdef __USE_W32API
|
||||
extern BOOL STDCALL SetLogonNotifyWindow(HWND Wnd, HWINSTA WinSta);
|
||||
#endif
|
||||
|
||||
void
|
||||
DispatchSAS(PWLSESSION Session, DWORD dwSasType)
|
||||
{
|
||||
|
@ -48,7 +55,7 @@ SetupSAS(PWLSESSION Session, HWND hwndSAS)
|
|||
/* Register Ctrl+Alt+Del Hotkey */
|
||||
if(!RegisterHotKey(hwndSAS, HK_CTRL_ALT_DEL, MOD_CONTROL | MOD_ALT, VK_DELETE))
|
||||
{
|
||||
DbgPrint("WL-SAS: Unable to register Ctrl+Alt+Del hotkey!\n");
|
||||
DPRINT1("WL-SAS: Unable to register Ctrl+Alt+Del hotkey!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -56,7 +63,7 @@ SetupSAS(PWLSESSION Session, HWND hwndSAS)
|
|||
Session->TaskManHotkey = RegisterHotKey(hwndSAS, HK_CTRL_SHIFT_ESC, MOD_CONTROL | MOD_SHIFT, VK_ESCAPE);
|
||||
if(!Session->TaskManHotkey)
|
||||
{
|
||||
DbgPrint("WL-SAS: Warning: Unable to register Ctrl+Alt+Esc hotkey!\n");
|
||||
DPRINT1("WL-SAS: Warning: Unable to register Ctrl+Alt+Esc hotkey!\n");
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -76,6 +83,78 @@ DestroySAS(PWLSESSION Session, HWND hwndSAS)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#define EWX_ACTION_MASK 0x0b
|
||||
static LRESULT
|
||||
HandleExitWindows(DWORD RequestingProcessId, UINT Flags)
|
||||
{
|
||||
UINT Action;
|
||||
HANDLE Process;
|
||||
HANDLE Token;
|
||||
BOOL CheckResult;
|
||||
PPRIVILEGE_SET PrivSet;
|
||||
|
||||
/* Check parameters */
|
||||
Action = Flags & EWX_ACTION_MASK;
|
||||
if (EWX_LOGOFF != Action && EWX_SHUTDOWN != Action && EWX_REBOOT != Action
|
||||
&& EWX_POWEROFF != Action)
|
||||
{
|
||||
DPRINT1("Invalid ExitWindows action 0x%x\n", Action);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Check privilege */
|
||||
if (EWX_LOGOFF != Action)
|
||||
{
|
||||
Process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, RequestingProcessId);
|
||||
if (NULL == Process)
|
||||
{
|
||||
DPRINT1("OpenProcess failed with error %d\n", GetLastError());
|
||||
return STATUS_INVALID_HANDLE;
|
||||
}
|
||||
if (! OpenProcessToken(Process, TOKEN_QUERY, &Token))
|
||||
{
|
||||
DPRINT1("OpenProcessToken failed with error %d\n", GetLastError());
|
||||
CloseHandle(Process);
|
||||
return STATUS_INVALID_HANDLE;
|
||||
}
|
||||
CloseHandle(Process);
|
||||
PrivSet = HeapAlloc(GetProcessHeap(), 0, sizeof(PRIVILEGE_SET) + sizeof(LUID_AND_ATTRIBUTES));
|
||||
if (NULL == PrivSet)
|
||||
{
|
||||
DPRINT1("Failed to allocate mem for privilege set\n");
|
||||
CloseHandle(Token);
|
||||
return STATUS_NO_MEMORY;
|
||||
}
|
||||
PrivSet->PrivilegeCount = 1;
|
||||
PrivSet->Control = PRIVILEGE_SET_ALL_NECESSARY;
|
||||
if (! LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &PrivSet->Privilege[0].Luid))
|
||||
{
|
||||
DPRINT1("LookupPrivilegeValue failed with error %d\n", GetLastError());
|
||||
HeapFree(GetProcessHeap(), 0, PrivSet);
|
||||
CloseHandle(Token);
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
if (! PrivilegeCheck(Token, PrivSet, &CheckResult))
|
||||
{
|
||||
DPRINT1("PrivilegeCheck failed with error %d\n", GetLastError());
|
||||
HeapFree(GetProcessHeap(), 0, PrivSet);
|
||||
CloseHandle(Token);
|
||||
return STATUS_ACCESS_DENIED;
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, PrivSet);
|
||||
CloseHandle(Token);
|
||||
if (! CheckResult)
|
||||
{
|
||||
DPRINT1("SE_SHUTDOWN privilege not enabled\n");
|
||||
return STATUS_ACCESS_DENIED;
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME actually start logoff/shutdown now */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK
|
||||
SASProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
@ -91,10 +170,10 @@ SASProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
switch(wParam)
|
||||
{
|
||||
case HK_CTRL_ALT_DEL:
|
||||
DbgPrint("SAS: CTR+ALT+DEL\n");
|
||||
DPRINT1("SAS: CTR+ALT+DEL\n");
|
||||
break;
|
||||
case HK_CTRL_SHIFT_ESC:
|
||||
DbgPrint("SAS: CTR+SHIFT+ESC\n");
|
||||
DPRINT1("SAS: CTR+SHIFT+ESC\n");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
@ -108,6 +187,10 @@ SASProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
case PM_WINLOGON_EXITWINDOWS:
|
||||
{
|
||||
return HandleExitWindows((DWORD) wParam, (UINT) lParam);
|
||||
}
|
||||
case WM_DESTROY:
|
||||
{
|
||||
DestroySAS(Session, hwnd);
|
||||
|
@ -134,33 +217,29 @@ InitializeSAS(PWLSESSION Session)
|
|||
swc.hCursor = NULL;
|
||||
swc.hbrBackground = NULL;
|
||||
swc.lpszMenuName = NULL;
|
||||
swc.lpszClassName = SAS_CLASS;
|
||||
swc.lpszClassName = WINLOGON_SAS_CLASS;
|
||||
swc.hIconSm = NULL;
|
||||
RegisterClassEx(&swc);
|
||||
|
||||
/* create invisible SAS window */
|
||||
Session->SASWindow = CreateWindowEx(0, SAS_CLASS, L"SAS", WS_OVERLAPPEDWINDOW,
|
||||
Session->SASWindow = CreateWindowEx(0, WINLOGON_SAS_CLASS, WINLOGON_SAS_TITLE, WS_POPUP,
|
||||
0, 0, 0, 0, 0, 0, hAppInstance, NULL);
|
||||
if(!Session->SASWindow)
|
||||
{
|
||||
DbgPrint("WL: Failed to create SAS window\n");
|
||||
DPRINT1("WL: Failed to create SAS window\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Save the Session pointer so the window proc can access it */
|
||||
SetWindowLong(Session->SASWindow, GWL_USERDATA, (LONG)Session);
|
||||
|
||||
#if 0
|
||||
/* Register SAS window to receive SAS notifications
|
||||
FIXME - SetLogonNotifyWindow() takes only one parameter,
|
||||
definition in funcs.h is wrong! */
|
||||
if(!SetLogonNotifyWindow(Session->SASWindow))
|
||||
/* Register SAS window to receive SAS notifications */
|
||||
if(!SetLogonNotifyWindow(Session->SASWindow, Session->InteractiveWindowStation))
|
||||
{
|
||||
UninitSAS(Session);
|
||||
DbgPrint("WL: Failed to register SAS window\n");
|
||||
DPRINT1("WL: Failed to register SAS window\n");
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: setup.c,v 1.3 2004/06/04 23:46:02 navaraf Exp $
|
||||
/* $Id: setup.c,v 1.4 2004/07/12 20:09:35 gvg Exp $
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS winlogon
|
||||
* FILE: subsys/system/winlogon/setup.h
|
||||
|
@ -43,7 +43,7 @@ DWORD
|
|||
GetSetupType(VOID)
|
||||
{
|
||||
DWORD dwError;
|
||||
HANDLE hKey;
|
||||
HKEY hKey;
|
||||
DWORD dwType;
|
||||
DWORD dwSize;
|
||||
DWORD dwSetupType;
|
||||
|
@ -79,7 +79,7 @@ BOOL
|
|||
SetSetupType (DWORD dwSetupType)
|
||||
{
|
||||
DWORD dwError;
|
||||
HANDLE hKey;
|
||||
HKEY hKey;
|
||||
|
||||
dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||
L"SYSTEM\\Setup", //TEXT("SYSTEM\\Setup"),
|
||||
|
@ -116,7 +116,7 @@ RunSetup (VOID)
|
|||
WCHAR CommandLine[MAX_PATH];
|
||||
BOOLEAN Result;
|
||||
DWORD dwError;
|
||||
HANDLE hKey;
|
||||
HKEY hKey;
|
||||
DWORD dwType;
|
||||
DWORD dwSize;
|
||||
DWORD dwExitCode;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: winlogon.c,v 1.33 2004/07/11 13:31:28 weiden Exp $
|
||||
/* $Id: winlogon.c,v 1.34 2004/07/12 20:09:35 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -219,7 +219,7 @@ StartLsass (VOID)
|
|||
|
||||
|
||||
static BOOLEAN
|
||||
OpenRegistryKey (HANDLE *WinLogonKey)
|
||||
OpenRegistryKey (HKEY *WinLogonKey)
|
||||
{
|
||||
return ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||
L"SOFTWARE\\ReactOS\\Windows NT\\CurrentVersion\\WinLogon",
|
||||
|
@ -232,7 +232,7 @@ OpenRegistryKey (HANDLE *WinLogonKey)
|
|||
static BOOLEAN StartProcess(PWCHAR ValueName)
|
||||
{
|
||||
BOOL StartIt;
|
||||
HANDLE WinLogonKey;
|
||||
HKEY WinLogonKey;
|
||||
DWORD Type;
|
||||
DWORD Size;
|
||||
DWORD StartValue;
|
||||
|
@ -262,7 +262,7 @@ static BOOLEAN StartProcess(PWCHAR ValueName)
|
|||
/*
|
||||
static BOOL RestartShell(void)
|
||||
{
|
||||
HANDLE WinLogonKey;
|
||||
HKEY WinLogonKey;
|
||||
DWORD Type, Size, Value;
|
||||
|
||||
if(OpenRegistryKey(&WinLogonKey))
|
||||
|
@ -338,7 +338,7 @@ HandleHotKey(MSG *Msg)
|
|||
#if SUPPORT_CONSOLESTART
|
||||
static BOOL StartIntoGUI(VOID)
|
||||
{
|
||||
HANDLE WinLogonKey;
|
||||
HKEY WinLogonKey;
|
||||
DWORD Type, Size, Value;
|
||||
|
||||
if(OpenRegistryKey(&WinLogonKey))
|
||||
|
@ -366,7 +366,7 @@ static BOOL StartIntoGUI(VOID)
|
|||
static PWCHAR
|
||||
GetShell (WCHAR *CommandLine)
|
||||
{
|
||||
HANDLE WinLogonKey;
|
||||
HKEY WinLogonKey;
|
||||
BOOL GotCommandLine;
|
||||
DWORD Type;
|
||||
DWORD Size;
|
||||
|
@ -492,10 +492,6 @@ DoLogonUser (PWCHAR Name,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
/* Process the global hotkeys on #if 0 */
|
||||
#if 0
|
||||
WaitForSingleObject (ProcessInformation.hProcess, INFINITE);
|
||||
#else
|
||||
RegisterHotKeys();
|
||||
|
||||
while (WaitForSingleObject (ProcessInformation.hProcess, 100) != WAIT_OBJECT_0)
|
||||
|
@ -510,7 +506,7 @@ DoLogonUser (PWCHAR Name,
|
|||
}
|
||||
|
||||
UnregisterHotKeys();
|
||||
#endif
|
||||
|
||||
CloseHandle (ProcessInformation.hProcess);
|
||||
CloseHandle (ProcessInformation.hThread);
|
||||
|
||||
|
@ -543,7 +539,7 @@ WinMain(HINSTANCE hInstance,
|
|||
ULONG AuthenticationPackage;
|
||||
#endif
|
||||
NTSTATUS Status;
|
||||
|
||||
|
||||
hAppInstance = hInstance;
|
||||
|
||||
if(!RegisterLogonProcess(GetCurrentProcessId(), TRUE))
|
||||
|
@ -614,18 +610,13 @@ WinMain(HINSTANCE hInstance,
|
|||
|
||||
#if SUPPORT_CONSOLESTART
|
||||
StartConsole = !StartIntoGUI();
|
||||
if(!StartConsole)
|
||||
{
|
||||
#endif
|
||||
if(!InitializeSAS(WLSession))
|
||||
if(!InitializeSAS(WLSession))
|
||||
{
|
||||
DbgPrint("WL: Failed to initialize SAS\n");
|
||||
ExitProcess(2);
|
||||
return 2;
|
||||
}
|
||||
#if SUPPORT_CONSOLESTART
|
||||
}
|
||||
#endif
|
||||
|
||||
InitServices();
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: winlogon.h,v 1.3 2004/03/28 12:21:41 weiden Exp $
|
||||
/* $Id: winlogon.h,v 1.4 2004/07/12 20:09:35 gvg Exp $
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS winlogon
|
||||
* FILE: subsys/system/winlogon/winlogon.h
|
||||
|
@ -110,7 +110,7 @@ typedef struct _MSGINAFUNCTIONS
|
|||
|
||||
typedef struct _MSGINAINSTANCE
|
||||
{
|
||||
HANDLE hDllInstance;
|
||||
HMODULE hDllInstance;
|
||||
MSGINAFUNCTIONS Functions;
|
||||
PVOID Context;
|
||||
DWORD Version;
|
||||
|
@ -125,6 +125,7 @@ typedef struct _WLSESSION
|
|||
BOOL TaskManHotkey;
|
||||
HWND SASWindow;
|
||||
HWINSTA InteractiveWindowStation;
|
||||
LPWSTR InteractiveWindowStationName;
|
||||
HDESK ApplicationDesktop;
|
||||
HDESK WinlogonDesktop;
|
||||
HDESK ScreenSaverDesktop;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: wlx.c,v 1.4 2004/03/28 12:21:41 weiden Exp $
|
||||
/* $Id: wlx.c,v 1.5 2004/07/12 20:09:35 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -16,6 +16,7 @@
|
|||
#include <stdio.h>
|
||||
#include <WinWlx.h>
|
||||
#include <wchar.h>
|
||||
#include <reactos/winlogon.h>
|
||||
|
||||
#include "setup.h"
|
||||
#include "winlogon.h"
|
||||
|
@ -493,7 +494,7 @@ static void
|
|||
GetMsGinaPath(WCHAR *path)
|
||||
{
|
||||
DWORD Status, Type, Size;
|
||||
HANDLE hKey;
|
||||
HKEY hKey;
|
||||
|
||||
Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
|
||||
|
@ -652,7 +653,7 @@ MsGinaInit(void)
|
|||
WLSession->MsGina.Version = GinaDllVersion;
|
||||
WLSession->SuppressStatus = FALSE;
|
||||
|
||||
if(!WLSession->MsGina.Functions.WlxInitialize(WLSession->InteractiveWindowStation,
|
||||
if(!WLSession->MsGina.Functions.WlxInitialize(WLSession->InteractiveWindowStationName,
|
||||
(HANDLE)WLSession,
|
||||
NULL,
|
||||
(PVOID)&FunctionTable,
|
||||
|
@ -670,7 +671,9 @@ WlxCreateWindowStationAndDesktops(PWLSESSION Session)
|
|||
/*
|
||||
* Create the interactive window station
|
||||
*/
|
||||
Session->InteractiveWindowStation = CreateWindowStation(L"WinSta0", 0, GENERIC_ALL, NULL);
|
||||
Session->InteractiveWindowStationName = L"WinSta0";
|
||||
Session->InteractiveWindowStation = CreateWindowStation(Session->InteractiveWindowStationName,
|
||||
0, GENERIC_ALL, NULL);
|
||||
if(!Session->InteractiveWindowStation)
|
||||
{
|
||||
DbgPrint("WL: Failed to create window station (0x%X)\n", GetLastError());
|
||||
|
@ -696,7 +699,7 @@ WlxCreateWindowStationAndDesktops(PWLSESSION Session)
|
|||
/*
|
||||
* Create the winlogon desktop
|
||||
*/
|
||||
Session->WinlogonDesktop = CreateDesktop(L"Winlogon",
|
||||
Session->WinlogonDesktop = CreateDesktop(WINLOGON_DESKTOP,
|
||||
NULL,
|
||||
NULL,
|
||||
0, /* FIXME: Set some flags */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: csr.c,v 1.1 2004/05/28 21:33:41 gvg Exp $
|
||||
/* $Id: csr.c,v 1.2 2004/07/12 20:09:35 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -73,7 +73,7 @@ CsrNotify(PCSRSS_API_REQUEST Request, PCSRSS_API_REPLY Reply)
|
|||
Status = Reply->Status;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: misc.c,v 1.82 2004/07/08 14:36:18 ekohl Exp $
|
||||
/* $Id: misc.c,v 1.83 2004/07/12 20:09:35 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -37,12 +37,14 @@ PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue() {
|
|||
}
|
||||
|
||||
BOOL FASTCALL
|
||||
IntRegisterLogonProcess(DWORD dwProcessId, BOOL bRegister)
|
||||
IntRegisterLogonProcess(DWORD ProcessId, BOOL Register)
|
||||
{
|
||||
PEPROCESS Process;
|
||||
NTSTATUS Status;
|
||||
CSRSS_API_REQUEST Request;
|
||||
CSRSS_API_REPLY Reply;
|
||||
|
||||
Status = PsLookupProcessByProcessId((PVOID)dwProcessId,
|
||||
Status = PsLookupProcessByProcessId((PVOID)ProcessId,
|
||||
&Process);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
|
@ -50,7 +52,7 @@ IntRegisterLogonProcess(DWORD dwProcessId, BOOL bRegister)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (bRegister)
|
||||
if (Register)
|
||||
{
|
||||
/* Register the logon process */
|
||||
if (LogonProcess != NULL)
|
||||
|
@ -75,6 +77,17 @@ IntRegisterLogonProcess(DWORD dwProcessId, BOOL bRegister)
|
|||
|
||||
ObDereferenceObject(Process);
|
||||
|
||||
Request.Type = CSRSS_REGISTER_LOGON_PROCESS;
|
||||
Request.Data.RegisterLogonProcessRequest.ProcessId = ProcessId;
|
||||
Request.Data.RegisterLogonProcessRequest.Register = Register;
|
||||
|
||||
Status = CsrNotify(&Request, &Reply);
|
||||
if (! NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to register logon process with CSRSS\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue