ReactOS  0.4.15-dev-1203-g0e5a4d5
poshtdwn.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Kernel
3  * LICENSE: BSD - See COPYING.ARM in the top level directory
4  * FILE: ntoskrnl/po/poshtdwn.c
5  * PURPOSE: Power Manager Shutdown Code
6  * PROGRAMMERS: ReactOS Portable Systems Group
7  */
8 
9 /* INCLUDES ******************************************************************/
10 
11 #include <ntoskrnl.h>
12 #ifdef NEWCC
13 #include <cache/newcc.h>
14 #endif
15 
16 #define NDEBUG
17 #include <debug.h>
18 
19 #include "inbv/logo.h"
20 
21 /* GLOBALS *******************************************************************/
22 
29 
30 
31 /* PRIVATE FUNCTIONS *********************************************************/
32 
33 VOID
34 NTAPI
36 {
37  PAGED_CODE();
38 
39  /* Initialize the global shutdown event */
41 
42  /* Initialize the shutdown lists */
45 
46  /* Initialize the shutdown list lock */
48 
49  /* The list is available now */
51 }
52 
54 NTAPI
57 {
58  PPOP_SHUTDOWN_WAIT_ENTRY ShutDownWaitEntry;
60  PAGED_CODE();
61 
62  /* Allocate a new shutdown wait entry */
63  ShutDownWaitEntry = ExAllocatePoolWithTag(PagedPool, sizeof(*ShutDownWaitEntry), 'LSoP');
64  if (ShutDownWaitEntry == NULL)
65  {
66  return STATUS_NO_MEMORY;
67  }
68 
69  /* Reference the thread and save it in the wait entry */
71  ShutDownWaitEntry->Thread = Thread;
72 
73  /* Acquire the shutdown list lock */
75 
76  /* Check if the list is still available */
78  {
79  /* Insert the item in the list */
80  ShutDownWaitEntry->NextEntry = PopShutdownThreadList;
81  PopShutdownThreadList = ShutDownWaitEntry;
82 
83  /* We are successful */
85  }
86  else
87  {
88  /* We cannot proceed, cleanup and return failure */
90  ExFreePoolWithTag(ShutDownWaitEntry, 'LSoP');
92  }
93 
94  /* Release the list lock */
96 
97  /* Return the status */
98  return Status;
99 }
100 
101 VOID
102 NTAPI
104 {
105  PPOP_SHUTDOWN_WAIT_ENTRY ShutDownWaitEntry;
106  PWORK_QUEUE_ITEM WorkItem;
107  PLIST_ENTRY ListEntry;
108 
109  /* First signal the shutdown event */
111 
112  /* Acquire the shutdown list lock */
114 
115  /* Block any further attempts to register a shutdown event */
117 
118  /* Release the list lock, since we are exclusively using the lists now */
120 
121  /* Process the shutdown queue */
122  while (!IsListEmpty(&PopShutdownQueue))
123  {
124  /* Get the head entry */
125  ListEntry = RemoveHeadList(&PopShutdownQueue);
126  WorkItem = CONTAINING_RECORD(ListEntry, WORK_QUEUE_ITEM, List);
127 
128  /* Call the shutdown worker routine */
129  WorkItem->WorkerRoutine(WorkItem->Parameter);
130  }
131 
132  /* Now process the shutdown thread list */
133  while (PopShutdownThreadList != NULL)
134  {
135  /* Get the top entry and remove it from the list */
136  ShutDownWaitEntry = PopShutdownThreadList;
138 
139  /* Wait for the thread to finish and dereference it */
140  KeWaitForSingleObject(ShutDownWaitEntry->Thread, 0, 0, 0, 0);
141  ObDereferenceObject(ShutDownWaitEntry->Thread);
142 
143  /* Finally free the entry */
144  ExFreePoolWithTag(ShutDownWaitEntry, 'LSoP');
145  }
146 }
147 
148 VOID
149 NTAPI
151 {
152  PUCHAR Logo1, Logo2;
153  ULONG i;
154 
155  /* Stop all interrupts */
157  _disable();
158 
159  /* Do we have boot video */
161  {
162  /* Yes we do, cleanup for shutdown screen */
168 
169  /* Display shutdown logo and message */
172  if ((Logo1) && (Logo2))
173  {
176  }
177  }
178  else
179  {
180  /* Do it in text-mode */
181  for (i = 0; i < 25; i++) InbvDisplayString("\r\n");
182  InbvDisplayString(" ");
183  InbvDisplayString("The system may be powered off now.\r\n");
184  }
185 
186  /* Hang the system */
187  for (;;) HalHaltSystem();
188 }
189 
190 VOID
191 NTAPI
193 {
194  /* Note should notify caller of NtPowerInformation(PowerShutdownNotification) */
195 
196  /* Unload symbols */
197  DPRINT("It's the final countdown...%lx\n", SystemAction);
199 
200  /* Run the thread on the boot processor */
202 
203  /* Now check what the caller wants */
204  switch (SystemAction)
205  {
206  /* Reset */
208 
209  /* Try platform driver first, then legacy */
210  //PopInvokeSystemStateHandler(PowerStateShutdownReset, NULL);
213  break;
214 
215  case PowerActionShutdown:
216 
217  /* Check for group policy that says to use "it is now safe" screen */
219  {
220  /* FIXFIX: Switch to legacy shutdown handler */
221  //PopPowerStateHandlers[PowerStateShutdownOff].Handler = PopShutdownHandler;
222  }
223 
225 
226  /* Call shutdown handler */
227  //PopInvokeSystemStateHandler(PowerStateShutdownOff, NULL);
228 
229  /* ReactOS Hack */
232 
233  /* If that didn't work, call the HAL */
235  break;
236 
237  default:
238  break;
239  }
240 
241  /* Anything else should not happen */
242  KeBugCheckEx(INTERNAL_POWER_ERROR, 5, 0, 0, 0);
243 }
244 
245 VOID
246 NTAPI
248 {
250 
251  /* Process the registered waits and work items */
253 
254  /* Loop every process */
256  while (Process)
257  {
258  /* Make sure this isn't the idle or initial process */
260  {
261  /* Print it */
262  DPRINT1("%15s is still RUNNING (%p)\n", Process->ImageFileName, Process->UniqueProcessId);
263  }
264 
265  /* Get the next process */
267  }
268 
269  /* First, the HAL handles any "end of boot" special functionality */
270  DPRINT("HAL shutting down\n");
271  HalEndOfBoot();
272 
273  /* Shut down the Shim cache if enabled */
275 
276  /* In this step, the I/O manager does first-chance shutdown notification */
277  DPRINT("I/O manager shutting down in phase 0\n");
278  IoShutdownSystem(0);
279 
280  /* In this step, all workers are killed and hives are flushed */
281  DPRINT("Configuration Manager shutting down\n");
283 
284  /* Shut down the Executive */
285  DPRINT("Executive shutting down\n");
287 
288  /* Note that modified pages should be written here (MiShutdownSystem) */
289  MmShutdownSystem(0);
290 
291  /* Flush all user files before we start shutting down IO */
292  /* This is where modified pages are written back by the IO manager */
294 
295  /* In this step, the I/O manager does last-chance shutdown notification */
296  DPRINT("I/O manager shutting down in phase 1\n");
297  IoShutdownSystem(1);
299 
300  /* FIXME: Calling Mm shutdown phase 1 here to get page file dereference
301  * but it shouldn't be called here. Only phase 2 should be called.
302  */
303  MmShutdownSystem(1);
304 
305  /* Note that here, we should broadcast the power IRP to devices */
306 
307  /* In this step, the HAL disables any wake timers */
308  DPRINT("Disabling wake timers\n");
310 
311  /* And finally the power request is sent */
312  DPRINT("Taking the system down\n");
314 }
315 
316 VOID
317 NTAPI
319 {
320  UNICODE_STRING KeyString;
324  ULONG Length;
325  UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)];
327 
328  /* Setup object attributes */
329  RtlInitUnicodeString(&KeyString,
330  L"\\Registry\\Machine\\Software\\Policies\\Microsoft\\Windows NT");
332  &KeyString,
334  NULL,
335  NULL);
336 
337  /* Open the key */
338  Status = ZwOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
339  if (NT_SUCCESS(Status))
340  {
341  /* Open the policy value and query it */
342  RtlInitUnicodeString(&KeyString, L"DontPowerOffAfterShutdown");
343  Status = ZwQueryValueKey(KeyHandle,
344  &KeyString,
346  &Info,
347  sizeof(Info),
348  &Length);
349  if ((NT_SUCCESS(Status)) && (Info->Type == REG_DWORD))
350  {
351  /* Read the policy */
352  PopShutdownPowerOffPolicy = *Info->Data == 1;
353  }
354 
355  /* Close the key */
357  }
358 }
359 
360 /* PUBLIC FUNCTIONS **********************************************************/
361 
362 /*
363  * @unimplemented
364  */
365 NTSTATUS
366 NTAPI
368  _In_ PWORK_QUEUE_ITEM WorkItem)
369 {
371 
372  /* Acquire the shutdown list lock */
374 
375  /* Check if the list is (already/still) available */
377  {
378  /* Insert the item into the list */
379  InsertTailList(&PopShutdownQueue, &WorkItem->List);
381  }
382  else
383  {
384  /* We are already in shutdown */
386  }
387 
388  /* Release the list lock */
390 
391  return Status;
392 }
393 
394 /*
395  * @implemented
396  */
397 NTSTATUS
398 NTAPI
400 {
402  PAGED_CODE();
403 
404  /* Initialize to NULL */
405  if (Event) *Event = NULL;
406 
407  /* Request a shutdown wait */
409  if (!NT_SUCCESS(Status))
410  {
411  return Status;
412  }
413 
414  /* Return the global shutdown event */
415  if (Event) *Event = &PopShutdownEvent;
416  return STATUS_SUCCESS;
417 }
418 
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
struct _POP_SHUTDOWN_WAIT_ENTRY * NextEntry
Definition: po.h:260
#define IN
Definition: typedefs.h:39
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG IN OUT PLONG IN LONG Increment KeRaiseIrqlToDpcLevel
Definition: CrNtStubs.h:67
ULONG PopShutdownPowerOffPolicy
Definition: poshtdwn.c:23
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
VOID NTAPI IoShutdownSystem(IN ULONG Phase)
Definition: device.c:133
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4711
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
Definition: gmutex.c:42
#define KEY_READ
Definition: nt_native.h:1023
#define TRUE
Definition: types.h:120
POWER_ACTION Action
Definition: po.h:216
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
BOOLEAN NTAPI InbvDisplayString(IN PCHAR String)
Definition: inbv.c:569
unsigned char * PUCHAR
Definition: retypes.h:3
VOID MmShutdownSystem(IN ULONG Phase)
Definition: shutdown.c:41
LIST_ENTRY PopShutdownQueue
Definition: poshtdwn.c:26
LONG NTSTATUS
Definition: precomp.h:26
#define SCREEN_WIDTH
Definition: pc98video.c:27
#define HalSetWakeEnable
Definition: halfuncs.h:39
VOID NTAPI PopGracefulShutdown(IN PVOID Context)
Definition: poshtdwn.c:247
VOID NTAPI InbvSolidColorFill(IN ULONG Left, IN ULONG Top, IN ULONG Right, IN ULONG Bottom, IN ULONG Color)
Definition: inbv.c:716
NTSTATUS NTAPI PoRequestShutdownWait(_In_ PETHREAD Thread)
Definition: poshtdwn.c:55
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
#define InsertTailList(ListHead, Entry)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
Definition: eventobj.c:159
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: wait.c:416
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
volatile PVOID Parameter
Definition: extypes.h:205
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
struct TraceInfo Info
VOID NTAPI KeSetSystemAffinityThread(IN KAFFINITY Affinity)
Definition: thrdobj.c:1116
PEPROCESS PsIdleProcess
Definition: psmgr.c:51
NTSTATUS NTAPI PoRequestShutdownEvent(OUT PVOID *Event)
Definition: poshtdwn.c:399
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define VID_SHUTDOWN_MSG_TOP
Definition: logo.h:21
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define FALSE
Definition: types.h:117
PEPROCESS PsInitialSystemProcess
Definition: psmgr.c:50
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
void DPRINT(...)
Definition: polytest.cpp:61
VOID NTAPI PopShutdownSystem(IN POWER_ACTION SystemAction)
Definition: poshtdwn.c:192
Definition: bufpool.h:45
#define HalEndOfBoot
Definition: haltypes.h:296
void * PVOID
Definition: retypes.h:9
#define IDB_LOGO_DEFAULT
Definition: resource.h:15
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define SCREEN_HEIGHT
Definition: pc98video.c:28
NTSTATUS NTAPI CcWaitForCurrentLazyWriterActivity(VOID)
Definition: lazyrite.c:30
VOID NTAPI DbgUnLoadImageSymbols(_In_ PSTRING Name, _In_ PVOID Base, _In_ ULONG_PTR ProcessId)
VOID NTAPI CcShutdownSystem(VOID)
Definition: cachesub.c:299
LIST_ENTRY List
Definition: psmgr.c:57
#define VID_SHUTDOWN_LOGO_LEFT
Definition: logo.h:18
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define VID_SHUTDOWN_LOGO_TOP
Definition: logo.h:19
VOID NTAPI PopShutdownHandler(VOID)
Definition: poshtdwn.c:150
VOID NTAPI CmShutdownSystem(VOID)
Definition: cmsysini.c:2088
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
#define HalHaltSystem
Definition: halfuncs.h:43
VOID NTAPI HalReturnToFirmware(IN FIRMWARE_REENTRY Action)
Definition: reboot.c:22
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
POP_POWER_ACTION PopAction
Definition: power.c:27
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define IDB_SHUTDOWN_MSG
Definition: resource.h:13
VOID NTAPI InbvAcquireDisplayOwnership(VOID)
Definition: inbv.c:528
unsigned char UCHAR
Definition: xmlstorage.h:181
Status
Definition: gdiplustypes.h:24
BOOLEAN PopShutdownListAvailable
Definition: poshtdwn.c:28
static const WCHAR L[]
Definition: oid.c:1250
#define VID_SHUTDOWN_MSG_LEFT
Definition: logo.h:20
POWER_ACTION
Definition: ntpoapi.h:122
PWORKER_THREAD_ROUTINE WorkerRoutine
Definition: extypes.h:204
PEPROCESS NTAPI PsGetNextProcess(IN PEPROCESS OldProcess OPTIONAL)
Definition: process.c:128
KEVENT PopShutdownEvent
Definition: poshtdwn.c:24
Definition: typedefs.h:119
BOOLEAN NTAPI InbvEnableDisplayString(IN BOOLEAN Enable)
Definition: inbv.c:606
#define _In_
Definition: no_sal2.h:158
BOOLEAN NTAPI InbvIsBootDriverInstalled(VOID)
Definition: inbv.c:630
VOID NTAPI PopProcessShutDownLists(VOID)
Definition: poshtdwn.c:103
PPOP_SHUTDOWN_WAIT_ENTRY PopShutdownThreadList
Definition: poshtdwn.c:25
VOID FASTCALL KeInitializeGuardedMutex(OUT PKGUARDED_MUTEX GuardedMutex)
Definition: gmutex.c:31
BOOLEAN NTAPI InbvResetDisplay(VOID)
Definition: inbv.c:664
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
struct _KEY_VALUE_PARTIAL_INFORMATION KEY_VALUE_PARTIAL_INFORMATION
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
VOID NTAPI InbvBitBlt(IN PUCHAR Buffer, IN ULONG X, IN ULONG Y)
Definition: inbv.c:810
#define BV_COLOR_BLACK
Definition: display.h:15
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
Definition: gmutex.c:53
#define DPRINT1
Definition: precomp.h:8
Definition: po.h:258
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define OUT
Definition: typedefs.h:40
#define ObReferenceObject
Definition: obfuncs.h:204
PETHREAD Thread
Definition: po.h:261
VOID NTAPI ExShutdownSystem(VOID)
Definition: shutdown.c:21
void __cdecl _disable(void)
Definition: intrin_arm.h:365
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:581
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSTATUS NTAPI PopSetSystemPowerState(SYSTEM_POWER_STATE PowerState, POWER_ACTION PowerAction)
Definition: power.c:325
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
PUCHAR NTAPI InbvGetResourceAddress(IN ULONG ResourceNumber)
Definition: inbv.c:905
NTSTATUS NTAPI PoQueueShutdownWorkItem(_In_ PWORK_QUEUE_ITEM WorkItem)
Definition: poshtdwn.c:367
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
VOID NTAPI InbvSetScrollRegion(IN ULONG Left, IN ULONG Top, IN ULONG Right, IN ULONG Bottom)
Definition: inbv.c:681
BOOLEAN NTAPI InbvCheckDisplayOwnership(VOID)
Definition: inbv.c:553
return STATUS_SUCCESS
Definition: btrfs.c:3014
#define REG_DWORD
Definition: sdbapi.c:596
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
Definition: rtlcompat.c:108
VOID NTAPI PopReadShutdownPolicy(VOID)
Definition: poshtdwn.c:318
VOID NTAPI PopInitShutdownList(VOID)
Definition: poshtdwn.c:35
KGUARDED_MUTEX PopShutdownListMutex
Definition: poshtdwn.c:27
VOID NTAPI ApphelpCacheShutdown(VOID)
Definition: apphelp.c:466
#define STATUS_SYSTEM_SHUTDOWN
Definition: ntstatus.h:855
#define PAGED_CODE()