VOID NTAPI PopGracefulShutdown(IN PVOID Context) { PEPROCESS Process = NULL; /* Process the registered waits and work items */ PopProcessShutDownLists(); /* Loop every process */ Process = PsGetNextProcess(Process); while (Process) { /* Make sure this isn't the idle or initial process */ if ((Process != PsInitialSystemProcess) && (Process != PsIdleProcess)) { /* Print it */ DPRINT1("%15s is still RUNNING (%p)\n", Process->ImageFileName, Process->UniqueProcessId); } /* Get the next process */ Process = PsGetNextProcess(Process); } /* First, the HAL handles any "end of boot" special functionality */ DPRINT("HAL shutting down\n"); HalEndOfBoot(); /* In this step, the I/O manager does first-chance shutdown notification */ DPRINT("I/O manager shutting down in phase 0\n"); IoShutdownSystem(0); /* In this step, all workers are killed and hives are flushed */ DPRINT("Configuration Manager shutting down\n"); CmShutdownSystem(); /* Note that modified pages should be written here (MiShutdownSystem) */ #ifdef NEWCC /* Flush all user files before we start shutting down IO */ /* This is where modified pages are written back by the IO manager */ CcShutdownSystem(); #endif /* In this step, the I/O manager does last-chance shutdown notification */ DPRINT("I/O manager shutting down in phase 1\n"); IoShutdownSystem(1); CcWaitForCurrentLazyWriterActivity(); /* Note that here, we should broadcast the power IRP to devices */ /* In this step, the HAL disables any wake timers */ DPRINT("Disabling wake timers\n"); HalSetWakeEnable(FALSE); /* And finally the power request is sent */ DPRINT("Taking the system down\n"); PopShutdownSystem(PopAction.Action); }
NTSTATUS NtShutdownSystem( IN SHUTDOWN_ACTION Action ) /*++ Routine Description: This service is used to safely shutdown the system. N.B. The caller must have SeShutdownPrivilege to shut down the system. Arguments: Action - Supplies an action that is to be taken after having shutdown. Return Value: !NT_SUCCESS - The operation failed or the caller did not have appropriate priviledges. --*/ { POWER_ACTION SystemAction; KPROCESSOR_MODE PreviousMode; NTSTATUS Status; // // Convert shutdown action to system action // switch (Action) { case ShutdownNoReboot: SystemAction = PowerActionShutdown; break; case ShutdownReboot: SystemAction = PowerActionShutdownReset; break; case ShutdownPowerOff: SystemAction = PowerActionShutdownOff; break; default: return STATUS_INVALID_PARAMETER; } // // Check to determine if the caller has the privilege to shutdown the // system. // PreviousMode = KeGetPreviousMode(); if (PreviousMode != KernelMode) { // // Check to see if the caller has the privilege to make this // call. // if (!SeSinglePrivilegeCheck( SeShutdownPrivilege, PreviousMode )) { return STATUS_PRIVILEGE_NOT_HELD; } return ZwShutdownSystem(Action); } else { MmLockPagableCodeSection((PVOID)MmShutdownSystem); } // // Prevent further hard error popups. // ExpTooLateForErrors = TRUE; // // Invoke each component of the executive that needs to be notified // that a shutdown is about to take place. // ExShutdownSystem(); IoShutdownSystem(0); CmShutdownSystem(); MmShutdownSystem(); IoShutdownSystem(1); // // If the system is to be rebooted or powered off, then perform the // final operations. // if (Action != ShutdownNoReboot) { DbgUnLoadImageSymbols( NULL, (PVOID)-1, 0 ); if (Action == ShutdownReboot) { HalReturnToFirmware( HalRebootRoutine ); } else { HalReturnToFirmware( HalPowerDownRoutine ); } } // // Bypass policy manager and pass directly to SetSystemPowerState // Status = NtSetSystemPowerState ( SystemAction, PowerSystemSleeping3, POWER_ACTION_OVERRIDE_APPS | POWER_ACTION_DISABLE_WAKES | POWER_ACTION_CRITICAL ); return STATUS_SUCCESS; }