快速关机[原创]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 以下代码实现在NT以上系统的快速关机,关机速度在2秒以内,不保存资料,不伤硬盘
typedef enum _SHUTDOWN_ACTION {
     ShutdownNoReboot,      // 关机
     ShutdownReboot,        // 重启
     ShutdownPowerOff       // 这个没有试,有心的人试下
} SHUTDOWN_ACTION;

DWORD (__stdcall *NtShutdownSystem)(SHUTDOWN_ACTION);

VOID ShutDown()
{
     HANDLE hToken;
     // 得到关机权限 
     if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
     {
         TOKEN_PRIVILEGES tkp;

         LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
        
         tkp.PrivilegeCount = 1;
         tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

         AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
         CloseHandle(hToken);
     }

     // 加载未公开API,强行关机(快速)
     HMODULE mod;
     mod = LoadLibrary("ntdll.dll");
     NtShutdownSystem = (DWORD(__stdcall *)(SHUTDOWN_ACTION))GetProcAddress(mod, "NtShutdownSystem");
     NtShutdownSystem(ShutdownNoReboot);
}