#define WIN32_LEAN_AND_MEAN

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    HANDLE hHandle;
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hHandle);
    
    LUID lLuid;
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &lLuid);

    LUID_AND_ATTRIBUTES lLuidAttr;
    lLuidAttr.Luid       = lLuid;
    lLuidAttr.Attributes = SE_PRIVILEGE_ENABLED;

    TOKEN_PRIVILEGES Newtoken;
    Newtoken.PrivilegeCount = 1;
    Newtoken.Privileges[0]  = lLuidAttr;

    AdjustTokenPrivileges(hHandle, FALSE, &Newtoken, 0, NULL, NULL);
    CloseHandle(hHandle);

/*
    EWX_LOGOFF   = 0  ログオフ
    EWX_SHUTDOWN = 1  シャットダウン
    EWX_REBOOT   = 2  リブート
    EWX_FORCE    = 4  強制(他のデータとor結合 例:強制リブート = EWX_FORCE | EWX_REBOOT)
    EWX_POWEROFF = 8  パワーオフ
*/
    ExitWindowsEx(EWX_POWEROFF, 0);
    return 0;
}

