1 /*
2  * PROJECT:     ReactOS Automatic Testing Utility
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Helper function for shutting down the system
5  * COPYRIGHT:   Copyright 2008-2009 Colin Finck (colin@reactos.org)
6  */
7 
8 #include "precomp.h"
9 
10 /**
11  * Shuts down the system.
12  *
13  * @return
14  * true if everything went well, false if there was a problem while trying to shut down the system.
15  */
ShutdownSystem()16 bool ShutdownSystem()
17 {
18     HANDLE hToken;
19     TOKEN_PRIVILEGES Privileges;
20 
21     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
22     {
23         StringOut("OpenProcessToken failed\n");
24         return false;
25     }
26 
27     /* Get the LUID for the Shutdown privilege */
28     if (!LookupPrivilegeValueW(NULL, SE_SHUTDOWN_NAME, &Privileges.Privileges[0].Luid))
29     {
30         StringOut("LookupPrivilegeValue failed\n");
31         return false;
32     }
33 
34     /* Assign the Shutdown privilege to our process */
35     Privileges.PrivilegeCount = 1;
36     Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
37 
38     if (!AdjustTokenPrivileges(hToken, FALSE, &Privileges, 0, NULL, NULL))
39     {
40         StringOut("AdjustTokenPrivileges failed\n");
41         return false;
42     }
43 
44     /* Finally shut down the system */
45     if(!ExitWindowsEx(EWX_POWEROFF, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED))
46     {
47         StringOut("ExitWindowsEx failed\n");
48         return false;
49     }
50 
51     return true;
52 }
53