Windowsをシャットダウンするには ExitWindowsEx APIを使用します。
BOOL ExitWindowsEx(UINT uFlags, DWORD dwReserved);
パラメータ:
| uFlags | シャットダウンの種類。 以下の値を組み合わせて指定します。 |
||||||||||||
|
|||||||||||||
| dwReserved | 予約済み。 このパラメータは無視されます。 |
||||||||||||
EWX_POWEROFF,EWX_REBOOT,EWX_SHUTDOWNを指定する場合
Windows NTの場合呼び出し側のプロセスが、SE_SHUTDOWN_NAME
特権を持っていなければなりません。
戻り値:
成功したとき0以外の値が返ります。
そうでないとき0が返ります。
#include <windows.h>
#include <tchar.h>
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
OSVERSIONINFO osinfo = {0};
osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osinfo);
if(osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { //WinNT
HANDLE hToken;
//アクセストークンをオープンする
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
LUID luid;
if(LookupPrivilegeValue(TEXT(""), SE_SHUTDOWN_NAME, &luid)) {
//SE_SHUTDOWN_NAME 特権を有効にする
TOKEN_PRIVILEGES tokenPrivileges = {0};
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Luid = luid;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, NULL, NULL, NULL)) {
if(GetLastError() == ERROR_SUCCESS) {
ExitWindowsEx(EWX_SHUTDOWN, 0);
}
}
}
CloseHandle(hToken);
}
}
else { //Windows
ExitWindowsEx(EWX_SHUTDOWN, 0);
}
return 0;
}