Something went wrong. Try again.
Reactos
Something went wrong. Try again.
4.5 kB · 181 lines
C
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182/* * PROJECT: ReactOS Task Manager * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) * PURPOSE: System Shutdown. * COPYRIGHT: Copyright 1999-2001 Brian Palmer <brianp@reactos.org> * Copyright 2011 Mário Kacmár /Mario Kacmar/ aka Kario <kario@szm.sk> * Copyright 2014 Robert Naumann <gonzomdx@gmail.com> */
#include "precomp.h"#include <ndk/exfuncs.h>#include <ndk/pofuncs.h>#include <ndk/rtlfuncs.h>
// Uncomment when NtInitiatePowerAction() is implemented// #define NT_INITIATE_POWERACTION_IMPLEMENTED
static BOOLEnablePrivilege(LPCWSTR lpszPrivilegeName, BOOL bEnablePrivilege){ BOOL Success; HANDLE hToken; TOKEN_PRIVILEGES tp;
Success = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); if (!Success) return Success;
Success = LookupPrivilegeValueW(NULL, lpszPrivilegeName, &tp.Privileges[0].Luid); if (!Success) goto Quit;
tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = (bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0);
Success = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
Quit: CloseHandle(hToken); return Success;}
VOIDShutDown_StandBy(VOID){ NTSTATUS Status;
if (!EnablePrivilege(SE_SHUTDOWN_NAME, TRUE)) { ShowWin32Error(GetLastError()); return; }
#ifdef NT_INITIATE_POWERACTION_IMPLEMENTED Status = NtInitiatePowerAction(PowerActionSleep, PowerSystemSleeping1, 0, FALSE);#else Status = NtSetSystemPowerState(PowerActionSleep, PowerSystemSleeping1, 0);#endif
if (!NT_SUCCESS(Status)) ShowWin32Error(RtlNtStatusToDosError(Status));
EnablePrivilege(SE_SHUTDOWN_NAME, FALSE);}
VOIDShutDown_Hibernate(VOID){ NTSTATUS Status;
if (!EnablePrivilege(SE_SHUTDOWN_NAME, TRUE)) { ShowWin32Error(GetLastError()); return; }
#ifdef NT_INITIATE_POWERACTION_IMPLEMENTED Status = NtInitiatePowerAction(PowerActionHibernate, PowerSystemHibernate, 0, FALSE);#else Status = NtSetSystemPowerState(PowerActionHibernate, PowerSystemHibernate, 0);#endif
if (!NT_SUCCESS(Status)) ShowWin32Error(RtlNtStatusToDosError(Status));
EnablePrivilege(SE_SHUTDOWN_NAME, FALSE);}
VOIDShutDown_PowerOff(VOID){ /* Trick: on Windows, pressing the CTRL key forces shutdown via NT API */ BOOL ForceShutdown = !!(GetKeyState(VK_CONTROL) & 0x8000);
if (!EnablePrivilege(SE_SHUTDOWN_NAME, TRUE)) { ShowWin32Error(GetLastError()); return; }
if (ForceShutdown) { NTSTATUS Status = NtShutdownSystem(ShutdownPowerOff); if (!NT_SUCCESS(Status)) ShowWin32Error(RtlNtStatusToDosError(Status)); } else { // The choice of EWX_SHUTDOWN or EWX_POWEROFF may be done with NtPowerInformation if (!ExitWindowsEx(EWX_POWEROFF /* EWX_SHUTDOWN */, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER)) ShowWin32Error(GetLastError()); }
EnablePrivilege(SE_SHUTDOWN_NAME, FALSE);}
VOIDShutDown_Reboot(VOID){ /* Trick: on Windows, pressing the CTRL key forces reboot via NT API */ BOOL ForceReboot = !!(GetKeyState(VK_CONTROL) & 0x8000);
if (!EnablePrivilege(SE_SHUTDOWN_NAME, TRUE)) { ShowWin32Error(GetLastError()); return; }
if (ForceReboot) { NTSTATUS Status = NtShutdownSystem(ShutdownReboot); if (!NT_SUCCESS(Status)) ShowWin32Error(RtlNtStatusToDosError(Status)); } else { if (!ExitWindowsEx(EWX_REBOOT, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER)) ShowWin32Error(GetLastError()); }
EnablePrivilege(SE_SHUTDOWN_NAME, FALSE);}
VOIDShutDown_LogOffUser(VOID){ if (!ExitWindowsEx(EWX_LOGOFF, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER)) ShowWin32Error(GetLastError());}
VOIDShutDown_SwitchUser(VOID){}
VOIDShutDown_LockComputer(VOID){ if (!LockWorkStation()) ShowWin32Error(GetLastError());}
VOIDShutDown_Disconnect(VOID){}
VOIDShutDown_EjectComputer(VOID){}