Windows 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オプションを指定したときの動作を追いかけてみて、判明しました。
スポンサード リンク |