#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
bool improvePv()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken)) return false;
if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)) return false;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, NULL, NULL, NULL)) return false;
return true;
}
bool powerOffProc()
{
if (!improvePv() || !ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, SHTDN_REASON_MAJOR_APPLICATION)) return false;
return true;
}
bool logOffProc()
{
if (!improvePv() || !ExitWindowsEx(EWX_LOGOFF | EWX_FORCE, SHTDN_REASON_MAJOR_APPLICATION)) return false;
return true;
}
bool reBootProc()
{
if (!improvePv() || !ExitWindowsEx(EWX_REBOOT | EWX_FORCE, SHTDN_REASON_MAJOR_APPLICATION)) return false;
return true;
}
int main(void)
{
CHAR ch;
printf(">>>>>>>>>>>>>>>>>>>>>> Demo >>>>>>>>>>>>>>>>>\n*\n");
printf("* 1. Power_Off\n*\n");
printf("* 2. Log_Off\n*\n");
printf("* 3. ReBoot\n*\n");
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
ch = getch();
while (1)
{
switch (ch)
{
case '1':
if (!powerOffProc())
{
printf("Process Error!\n");
continue;
}
return 0;
case '2':
if (!logOffProc())
{
printf("Process Error!\n");
continue;
}
return 0;
case '3':
if (!reBootProc())
{
printf("Process Error!\n");
continue;
}
return 0;
default:
printf("Error!\n");
}
}
system("pause");
return 0;
}
__