こんにちは、阿久津です。以前、サーバを仮想化した話を本連載で述べましたが、ここに来てトラブルが発生するようになりました。ホストマシンとなるWindows 7がKernel-Power 41病にかかってしまったのです。朝起きるとホストマシンが必ずと言ってよいほどフリーズしており、泣く泣くコンピュータを再起動。もちろん仮想サーバもリセットされてしまいます。

巷で述べられているように、パワーマネージメント関係を調整してみましたが結果は一緒。電圧チェックも問題なし。そこで時間のある週末にホストマシンを監視していますと……グラフィックスカードの温度がみるみるうちに急上昇。そう、GPUは何ら問題ありませんが、ファンコントローラが死んでいたというオチでした。その結果、コンピュータが熱暴走していたのです。

そもそもKernel-Power 41は、Microsoftが述べているように、コンピュータが予期せぬシャットダウンもしくは、再起動された場合に発生するメッセージであり、特定のエラーを示すものではありません。そのため、問題の切り分けや推測、検証といった作業が必要となります。

今回は原因が簡単だったため、ハードウェア監視ツールによって原因を突き止めましたが、前述のパワーマネージメントに起因するエラーや、何らかのタイミングで導入したデバイスドライバが原因の場合、自動生成されるダンプファイルをデバッグツールで細かく確認しなければなりません。

結局のところ、Kernel-Power 41はWindows 7側の問題というよりも、ハードウェアを活かすためのデバイスドライバや拡張ツールに起因するという、Windows 9x時代のトラブルシューティングに近いという印象です。久しぶりのハードウェアトラブルに四苦八苦した週末でした。

現在では安定しているホストマシンですが、さすがに再起動のリスクが高いため、以前購入したQNAPをネットワークサーバ化することにしましたが、この話はまた別の機会に。

さて、最近はデスクトップの何もないところを右クリックすると開くコンテキストメニューの拡張に勤しんでいます。同機能はオブジェクト(ファイルやフォルダなど)のコンテキストメニューと異なり、参照するエントリが少ないため、小気味よく動作するのが最大のポイント。素早く参照できるのも活用しやすい特徴の一つでしょう。

そこで思いついたのが、電源ボタン関連機能をコンテキストメニューに加えるチューニング。今週はコンテキストメニューから電源操作を行うチューニングをお届けします。

1.管理者権限でレジストリエディターを起動します。
2.HKEY_CLASSES_ROOT \ DesktopBackground \ Shell \ PC_Restartキーを開きます(ない場合は作成します)。
3.文字列値「icon」を作成します。
4.同値を開き、データ値を「shell32.dll,-290」に変更します。
5.文字列値「Position」を作成します。
6.同値を開き、データ値を「Bottom」に変更します。
7.文字列値「MUIVerb」を作成します。
8.同値を開き、データ値を「再起動(&R)」に変更します。
9.HKEY_CLASSES_ROOT \ DesktopBackground \ Shell \ PC_Restart \ commandキーを開きます(ない場合は作成します)。
10.「(既定)」を開き、データ値を「shutdown.exe -r -t 00 -f」に変更します。
11.下記表を参考に、ほかのエントリーも作成します。
12.[F5]キーを押してからレジストリエディターを終了します。

作成するエントリ

これでチューニングが終了しました(図01~17)。

図01: [Win]+[R]キーを押して「ファイル名を指定して実行」を起動し、テキストボックスに「regedit」と入力して<OK>ボタンをクリックします

図02: レジストリエディターが起動したら、HKEY_CLASSES_ROOT \ DesktopBackground \ Shellまでキーをたどって開きます

図03: Shellキーを右クリックし、メニューから<新規>→<キー>とクリックします

図04: 「新しいキー #1」の名前を「PC_Restart」に変更します

図05: 右ペインの何もないところを右クリックし、メニューから<新規>→<文字列値>とクリックします

図06: 「新しい値 #1」の名前を「icon」に変更します

図07: 文字列値「icon」をダブルクリックし、値のデータを「shell32.dll,-290」に変更して<OK>ボタンをクリックします

図08: 右ペインの何もないところを右クリックし、メニューから<新規>→<文字列値>とクリックします

図09: 「新しい値 #1」の名前を「Position」に変更します

図10: 文字列値「Position」をダブルクリックし、値のデータを「Bottom」に変更して<OK>ボタンをクリックします

図11: 右ペインの何もないところを右クリックし、メニューから<新規>→<文字列値>とクリックします

図12: 「新しい値 #1」の名前を「MUIVerb」に変更します

図13: 文字列値「MUIVerb」をダブルクリックし、値のデータを「再起動(&R)」に変更して<OK>ボタンをクリックします

図14: Shellキーを右クリックし、メニューから<新規>→<キー>とクリックします

図15: 「新しいキー #1」の名前を「command」に変更します

図16: 文字列値「(既定)」をダブルクリックし、値のデータを「shutdown.exe -r -t 00 -f」に変更して<OK>ボタンをクリックします

図17: 操作を終えたら[F5]キーを押してから、<×>ボタンをクリックしてレジストリエディターを終了させます

早速結果を確認しましょう。デスクトップの何もないところを右クリックして、コンテキストメニューを表示させてください。同メニューに<ロック><ログオフ><再起動><シャットダウン><スリープ>が並んでいればチューニング成功です(図18)。

図18: デスクトップの何もないところを右クリックすると表示されるコンテキストメニューには、<ロック>など電源ボタンの各項目が並びます

エントリをご覧になるとお判りのとおり、大半の操作はshutdown.exeもしくは、DLLファイルのAPIを直接実行していますので、一部の項目はコマンドプロンプトのウィンドウが一瞬表示されてしまうのはご了承ください。

また、<スリープ>は環境によって動作が異なるので注意してください。休止状態機能が有効な環境では、スリープではなく休止状態が実行され、休止状態機能が無効な環境では、ハイブリッドスリープではなく通常のスリープが実行されます。

APIであるSetSuspendState側の問題ですが、環境によってはタスクスケジューラなどトリガーによる復帰が動作しない場合も。筆者が確認した限りでは問題なく動作しましたが、念のため注意してください。なお、本チューニングは操作が冗長なのでレジストリファイルを用意しました。必要な方はお使いください。

ContextMenu_PowerOperation.reg (レジストリファイルのzip)

それでは、また次号でお会いしましょう。

阿久津良和(Cactus)