Windows 2000とXPのShutdown.exe -a について 詳しく調査
Windows 2000やXPで Shutdown.exe -a が使えない件について、さらに詳しく調べてみました。
まず、Shutdown.exe -a は何をしているかと言うと
・プロセスにシャットダウンに関する権利を付与。
・AbortSystemShutdown() を呼び出す。
と言う処理を行っています。
この関数の説明を見ると。InitiateSystemShutdown 関数でダイアログが出ている間だけキャンセルが出来るとあります。
試しに、AbortSystemShutdownを随時実行できるアプリケーションを作って見たところ、Windowsのシャットダウンを食い止める事は出来ませんでした。
この、AbortSystemShutdownをさらに分析して見ると
\Pipe\InitShutdown を呼び出していることが分かりました。
という訳で、それ以外の方法を試して見る実験もしました。
・WM_QUERYENDSESSION で待機して一定時間以内に ユーザーから中断要求があれば 0を返すプログラムを作成。
ところが、5秒程度過ぎると、Windows が痺れを切らして、別のプロセスの終了処理に移ってしまうらしく。それ以降に0を返しても中断できなくなってしまう。
・shutdown.exe -a が特別な事をやっているのか、確認のためにデバッガでエントリーポイントまで実行して、プログラムを停止する。
・シャットダウン実行後、プログラムを継続させて見た。
これでも、シャットダウンは食い止められません。
ちなみに、NTDLLの中の、シャットダウン中フラグを調べて見ると、シャットダウン中の状態を解除するような処理が無いので、ここまで来てしまうと、シャットダウン出来ないのかもしれません。
何か良い方法が見つかったら、追ってお知らせします。
Comments