windows-8.1-boot-optionWindows 8~8.1で、完全なシャットダウンやセーフモードで起動したいときなどに使う「オプションの選択」の画面(右側画像のあれ、チャーム→PC設定→……などの手順で再起動すると出てくる)をWindows APIで呼び出す方法の話です。

その方法は、「InitiateShutdown関数に、SHUTDOWN_RESTART_BOOTOPTIONSとSHUTDOWN_RESTARTのORを指定する」です。SHUTDOWN_RESTART_BOOTOPTIONSはMSDNライブラリには説明されていませんが、他の定数とともにwinreg.hで定義されています。

#define _ATL_NO_AUTOMATIC_NAMESPACE
#include <iostream>
#include <windows.h>
#include <atlsecurity.h>
 
int main()
{
  ATL::CAccessToken token;
  if (!token.GetProcessToken(TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY))
  {
    DWORD e = GetLastError();
    std::clog << "CAccessToken::GetProcessToken failed: " << e << std::endl;
    return 1;
  }
  if (!token.EnablePrivilege(SE_SHUTDOWN_NAME))
  {
    DWORD e = GetLastError();
    std::clog << "CAccessToken::EnablePrivilege failed: " << e << std::endl;
    return 1;
  }
 
  InitiateShutdown(nullptr, nullptr, 0,
    SHUTDOWN_RESTART_BOOTOPTIONS | SHUTDOWN_RESTART, 0);
}

シャットダウン処理なので、もちろん特権SE_SHUTDOWN_NAMEが必要です。

SHUTDOWN_RESTART_BOOTOPTIONS単独ではただの再起動になってしまいました。SHUTDOWN_RESTARTを組み合わせないとダメなようです。なお、それに加え、SHUTDOWN_GRACE_OVERRIDEなど更に他の値を組み合わせるのは大丈夫でした。

shutdownコマンドの/oオプションを指定したときの動作を追いかけてみて、判明しました。

スポンサード リンク

この記事のカテゴリ

  • ⇒ Windows 8.1再起動時の「オプションの選択」画面をAPIで呼び出す
  • ⇒ Windows 8.1再起動時の「オプションの選択」画面をAPIで呼び出す