none
ExitWindowsEx の仕様について RRS feed

  • 質問

  • 株式会社インターコム 岡野と申します。

    特定条件でWindows PCをシャットダウンさせるため、

    Win32 API の ExitWindowsExを使ったプログラムを作成しようと考えています。

    ExitWindowsEx関数の仕様を確認すると、引数にEWX_FORCEを使用した場合

    アプリケーションがデータを失う可能性もあります。したがって、このフラグは、緊急時にのみ指定してください。

    という記載があります。

    そこで質問なのですが、Windows Update中にEWX_FORCEを使用してExitWindowsExを呼び出した場合、

    Windows Updateも強制中断され、OS環境破損といった問題が起こり得るのでしょうか。

    それとも、Windows Updateについては考慮された動きになっているのでしょうか。

    よろしくお願いいたします。

    2018年6月26日 2:01

回答

  • ExitWindowsEx関数の仕様を確認すると、引数にEWX_FORCEを使用した場合「アプリケーションがデータを失う可能性もあります。したがって、このフラグは、緊急時にのみ指定してください。」という記載があります。

    そこで質問なのですが、Windows Update中にEWX_FORCEを使用してExitWindowsExを呼び出した場合、Windows Updateも強制中断され、OS環境破損といった問題が起こり得るのでしょうか。

    よく読んでください。「アプリケーションがデータを失う」であり「OSが」とは書かれていません。

    例えばメモ帳で編集中にシャットダウンを行うと「保存しますか?」のメッセージボックスが表示されるのみで保存が行われることはありません。そのままシャットダウンを続行すればメモ帳が保持していたデータは保存されることなく失われます。ドキュメントではこのことを言及しているものと思われます。

    なお、日本語版ドキュメントはWindows 2000 / xp向けに更新された後、15年以上放置されています。2000 / xp向けアプリケーションを作成しているのでなければ、順次更新されている英語版を参照されることをお勧めします。

    • 回答としてマーク m.okano 2018年7月2日 1:06
    2018年6月26日 2:17
  • Windows Update 実行中の Shutdown 処理を考慮するのであれば、ExitWindowsEx() ではなく InitiateShutdown() を使えば良いのでは?

    -----------------------------------------
    InitiateShutdownA function
    https://docs.microsoft.com/ja-jp/windows/desktop/api/winreg/nf-winreg-initiateshutdowna

    SHUTDOWN_INSTALL_UPDATES
    0x00000040 (0x40)
    The computer installs any updates before starting the shutdown.
    -----------------------------------------

    ちなみに。。。。
    ExitWindowsEx() のリファレンスには、下記説明があります。

    -----------------------------------------
    ExitWindowsEx function
    https://docs.microsoft.com/ja-jp/windows/desktop/api/winuser/nf-winuser-exitwindowsex

    Remarks
    The ExitWindowsEx function returns as soon as it has initiated the shutdown process.
    The shutdown or logoff then proceeds asynchronously.
    The function is designed to stop all processes in the caller's logon session.
    Therefore, if you are not the interactive user,
    the function can succeed without actually shutting down the computer.
    If you are not the interactive user,
    use the InitiateSystemShutdown or InitiateSystemShutdownEx function.
    -----------------------------------------

    上記説明を読む限り、ExitWindowsEx() は実行中のアプリやサービス等すべてのプロセスを停止させるので、実行中の "Windows Update" のプロセスも例外なく停止させられると考えられます。
    ただしファイル等の更新は下位ファイル システム側でのトランザクション処理により管理されているはずなので、Windows Update 中に ExitWindowsEx() によるシャットダウン要求が発生しても、更新が失敗することはあっても、システム クラッシュ等の重大な問題が起きることはないはずです。

    • 回答としてマーク m.okano 2018年7月2日 1:06
    2018年6月26日 2:59

すべての返信

  • m.okano さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    マイクロソフト コミュニティーからの続きのご質問ですね。
    https://answers.microsoft.com/ja-jp/windows/forum/windows_10-update/exitwindowsex/0629eeaa-2824-4b85-8394-d455dae53538

    何か情報をお持ちの方がいれば情報をお寄せいただけると思いますので
    お待ちください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年6月26日 2:12
    モデレータ
  • ExitWindowsEx関数の仕様を確認すると、引数にEWX_FORCEを使用した場合「アプリケーションがデータを失う可能性もあります。したがって、このフラグは、緊急時にのみ指定してください。」という記載があります。

    そこで質問なのですが、Windows Update中にEWX_FORCEを使用してExitWindowsExを呼び出した場合、Windows Updateも強制中断され、OS環境破損といった問題が起こり得るのでしょうか。

    よく読んでください。「アプリケーションがデータを失う」であり「OSが」とは書かれていません。

    例えばメモ帳で編集中にシャットダウンを行うと「保存しますか?」のメッセージボックスが表示されるのみで保存が行われることはありません。そのままシャットダウンを続行すればメモ帳が保持していたデータは保存されることなく失われます。ドキュメントではこのことを言及しているものと思われます。

    なお、日本語版ドキュメントはWindows 2000 / xp向けに更新された後、15年以上放置されています。2000 / xp向けアプリケーションを作成しているのでなければ、順次更新されている英語版を参照されることをお勧めします。

    • 回答としてマーク m.okano 2018年7月2日 1:06
    2018年6月26日 2:17
  • Windows Update 実行中の Shutdown 処理を考慮するのであれば、ExitWindowsEx() ではなく InitiateShutdown() を使えば良いのでは?

    -----------------------------------------
    InitiateShutdownA function
    https://docs.microsoft.com/ja-jp/windows/desktop/api/winreg/nf-winreg-initiateshutdowna

    SHUTDOWN_INSTALL_UPDATES
    0x00000040 (0x40)
    The computer installs any updates before starting the shutdown.
    -----------------------------------------

    ちなみに。。。。
    ExitWindowsEx() のリファレンスには、下記説明があります。

    -----------------------------------------
    ExitWindowsEx function
    https://docs.microsoft.com/ja-jp/windows/desktop/api/winuser/nf-winuser-exitwindowsex

    Remarks
    The ExitWindowsEx function returns as soon as it has initiated the shutdown process.
    The shutdown or logoff then proceeds asynchronously.
    The function is designed to stop all processes in the caller's logon session.
    Therefore, if you are not the interactive user,
    the function can succeed without actually shutting down the computer.
    If you are not the interactive user,
    use the InitiateSystemShutdown or InitiateSystemShutdownEx function.
    -----------------------------------------

    上記説明を読む限り、ExitWindowsEx() は実行中のアプリやサービス等すべてのプロセスを停止させるので、実行中の "Windows Update" のプロセスも例外なく停止させられると考えられます。
    ただしファイル等の更新は下位ファイル システム側でのトランザクション処理により管理されているはずなので、Windows Update 中に ExitWindowsEx() によるシャットダウン要求が発生しても、更新が失敗することはあっても、システム クラッシュ等の重大な問題が起きることはないはずです。

    • 回答としてマーク m.okano 2018年7月2日 1:06
    2018年6月26日 2:59
  • 回答ありがとうございます。

    InitiateShutdownも含め、あらためて検討しようとお問います。

    2018年7月2日 1:07