ReactOS  0.4.14-dev-49-gfb4591c
shutdown.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Console Server DLL
4  * FILE: win32ss/user/winsrv/consrv/shutdown.c
5  * PURPOSE: Processes Shutdown
6  * PROGRAMMERS: Alex Ionescu
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include "consrv.h"
12 #include <psapi.h>
13 
14 #define NDEBUG
15 #include <debug.h>
16 
17 /* FUNCTIONS ******************************************************************/
18 
19 static void
21  IN PCONSOLE_PROCESS_DATA ProcessData,
22  IN ULONG Flags)
23 {
24  DPRINT1("ConsoleClientShutdown(0x%p, 0x%x) - Console process [0x%x, 0x%x]\n",
25  CsrProcess, Flags, CsrProcess->ClientId.UniqueProcess, CsrProcess->ClientId.UniqueThread);
26 
27  /* Send a log-off event. In reality this should be way more complex */
30 }
31 
32 static BOOL
34  IN ULONG Flags)
35 {
36  /* FIXME: Implement the generic process shutdown handler */
38 
39  return TRUE;
40 }
41 
42 ULONG
43 NTAPI
45  IN ULONG Flags)
46 {
48  {
49  /* Terminate this process */
50 #if DBG
52  if (!GetProcessImageFileNameW(Process->ProcessHandle, buffer, MAX_PATH))
53  {
54  DPRINT1("Terminating process %x\n", Process->ClientId.UniqueProcess);
55  }
56  else
57  {
58  DPRINT1("Terminating process %x (%S)\n", Process->ClientId.UniqueProcess, buffer);
59  }
60 #endif
61 
62  NtTerminateProcess(Process->ProcessHandle, 0);
64  }
65 
67  return CsrShutdownCsrProcess;
68 }
69 
70 // NOTE: See http://blogs.msdn.com/b/ntdebugging/archive/2007/06/09/how-windows-shuts-down.aspx
71 ULONG
72 NTAPI
74  IN ULONG Flags,
75  IN BOOLEAN FirstPhase)
76 {
77  PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess);
78 
79  /* Do not kill system processes when a user is logging off */
80  if ((Flags & EWX_SHUTDOWN) == EWX_LOGOFF &&
81  (CsrProcess->ShutdownFlags & (CsrShutdownSystem | CsrShutdownOther)))
82  {
83  DPRINT("Do not kill a system process in a logoff request!\n");
85  }
86 
87  /* Is it a console process? */
88  if ( ProcessData->ConsoleHandle != NULL ||
89  ProcessData->HandleTable != NULL )
90  {
91  NotifyConsoleProcessForShutdown(CsrProcess, ProcessData, Flags);
92 
93  /* We are done with the process itself */
94  CsrDereferenceProcess(CsrProcess);
95  return CsrShutdownCsrProcess;
96  }
97  else
98  {
99  DPRINT("ConsoleClientShutdown(0x%p, 0x%x, %s) - Non-console process [0x%x, 0x%x]\n",
100  CsrProcess, Flags, FirstPhase ? "FirstPhase" : "LastPhase",
101  CsrProcess->ClientId.UniqueProcess, CsrProcess->ClientId.UniqueThread);
102 
103  /* On first pass, let the gui server terminate all the processes that it owns */
104  if (FirstPhase) return CsrShutdownNonCsrProcess;
105 
106  /* Use the generic handler since this isn't a gui process */
107  return NonConsoleProcessShutdown(CsrProcess, Flags);
108  }
109 
111 }
112 
113 /* EOF */
#define UNIMPLEMENTED_ONCE
Definition: debug.h:138
HANDLE ConsoleHandle
Definition: consrv.h:45
#define IN
Definition: typedefs.h:38
#define TRUE
Definition: types.h:120
NTSTATUS ConSrvConsoleCtrlEventTimeout(IN ULONG CtrlEvent, IN PCONSOLE_PROCESS_DATA ProcessData, IN ULONG Timeout)
Definition: console.c:809
GLuint buffer
Definition: glext.h:5915
VOID NTAPI CsrDereferenceProcess(IN PCSR_PROCESS CsrProcess)
Definition: procsup.c:690
#define EWX_LOGOFF
Definition: winuser.h:631
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define EWX_SHUTDOWN
Definition: winuser.h:634
unsigned int BOOL
Definition: ntddk_ex.h:94
ULONG ProcessTerminateTimeout
Definition: winsrv.h:52
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
static BOOL NotifyGenericProcessForShutdown(IN PCSR_PROCESS CsrProcess, IN ULONG Flags)
Definition: shutdown.c:33
static void NotifyConsoleProcessForShutdown(IN PCSR_PROCESS CsrProcess, IN PCONSOLE_PROCESS_DATA ProcessData, IN ULONG Flags)
Definition: shutdown.c:20
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define ConsoleGetPerProcessData(Process)
Definition: consrv.h:37
ULONG NTAPI NonConsoleProcessShutdown(IN PCSR_PROCESS Process, IN ULONG Flags)
Definition: shutdown.c:44
#define MAX_PATH
Definition: compat.h:26
#define CTRL_LOGOFF_EVENT
Definition: wincon.h:69
ULONG WaitToKillAppTimeout
Definition: winsrv.h:50
SHUTDOWN_SETTINGS ShutdownSettings
Definition: init.c:24
struct _CONSOLE_IO_HANDLE * HandleTable
Definition: consrv.h:50
#define DPRINT1
Definition: precomp.h:8
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
DWORD WINAPI GetProcessImageFileNameW(HANDLE hProcess, LPWSTR lpImageFileName, DWORD nSize)
Definition: psapi.c:1179
unsigned int ULONG
Definition: retypes.h:1
NTSTATUS NTAPI NtTerminateProcess(HANDLE ProcessHandle, LONG ExitStatus)
ULONG NTAPI ConsoleClientShutdown(IN PCSR_PROCESS CsrProcess, IN ULONG Flags, IN BOOLEAN FirstPhase)
Definition: shutdown.c:73