Windowsの終了と再起動【Windows API】

パソコンのシャットダウンなどの制御は「ExitWindowsEx」関数を使用することで行うことができます。しかし、NT系のOSでは適切な権限を取得しないと正常に関数を利用することができません。 そこで、権限取得機能を実装し、パラメータの設定によってWindowsの終了、再起動の両方を 簡単に行なうことができるようにした関数を作成します。 この関数の処理が成功した場合は既に終了処理が開始していますので、この関数を呼び出した後に ウィンドウやファイルの書き換え操作を行なってはいけません。 再起動した場合は自動的にログインするわけではありません。ログイン画面で停止するので注意してください。

// [引数]
// bReboot : 終了後に再起動する場合はTRUE
// bForce  : プロセスを強制的に打ち切る場合はTRUE
//
// [返値]
// 終了指示を発行した : TRUE
// 終了指示が失敗した : FALSE

void ShutdownWindows(BOOL bReboot = FALSE, BOOL bForce = FALSE)
{
    DWORD ret;
    HANDLE hProcess;
    HANDLE hToken;
    LUID   Luid;
    TOKEN_PRIVILEGES tokenNew, tokenPre;
    UINT nFlag;

    hProcess = GetCurrentProcess();

    OpenProcessToken(hProcess,
                    TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken);
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &Luid);

    tokenNew.PrivilegeCount = 1;
    tokenNew.Privileges[0].Luid = Luid;
    tokenNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges(hToken, FALSE, &tokenNew,
                            sizeof(tokenPre), &tokenPre, &ret);

    if (bReboot) {
        nFlag = EWX_REBOOT; // 再起動
    } else {
        nFlag = EWX_POWEROFF; // 電源OFF
    }

    if (bForce) {
        nFlag |= EWX_FORCE; // プロセス強制終了
    }

    ExitWindowsEx(nFlag, 0); // シャットダウン処理

    return;
}

 

Windows API

Posted by @erestage