ブルースクリーンで起動しない:PROCESS1_INITIALIZATION_FAILED,STOP: 0x0000006B

会社のPCがブルースクリーンで死んで起動しなくなった。

エラーメッセージは、

PROCESS1_INITIALIZATION_FAILED
STOP: 0x0000006B

と書いている。たぶん、Windows Updateをかけてからおかしくなったと思う。

自動的に走る「スタートアップ修復」を行うと、一旦は修復したように見えるが、またしばらくすると起動時にこの画面が現れ、死んでしまう。意味がわからない。

まず、windbgで知ってるコマンドを叩いてみた。どうも、「ntkrnlpa.exe」で死んでるらしい。怪しいドライバやプロセスは…見当たらない。たぶん…。そもそも、最近新しい何かをインストールした記憶がない。DEFAULT_BUCKET_IDはVISTA_DRIVER_FAULTと書いている。ちょっとよくわからない。

ネットで検索してみると、「PAEモードの設定をデフォルトにするとよい」といろんなところに書いてあった。

ブルースクリーン(BSOD)連発 ntkrnlpa.exeが原因か | 餅と輪

ただ、症状が若干違うのと、一次ソースが見当たらないのとで、なんか違う気がする。やってみたが改善されず。

次に試したのが、とりあえず復元ポイントでWindowsUpdate実行前に戻り、アップデートを停止させてみよう、ということだった。しかし、会社のPCなので、所属しているドメインのグループポリシーで自動的にアップデート以外の選択肢が選べなかった。くそ。

次に見つけたのは%SystemRoot%\system32\codeintegrity\Bootcat.cacheファイルを削除すると良いというもの。

Windows 7 または Windows Server 2008 R2 を搭載しているコンピューターの起動中に "STOP: 0x0000006B" という Stop エラー メッセージが表示される | Microsoft Support

ソースがMSなので信頼がおける。しかし、これを試してみたが、修正されず。

それから、システム復元を繰り返しているうちに気づいた。正常に起動するときのBootcat.cacheファイルのサイズが3MB程度であるのに対し、正常に起動しない時のBootcat.cacheファイルのサイズは20KB程度だった。なんかこれが原因な気がする。

最終的に、以下のような手順で正常起動することがわかった。

  1. BIOSが終わったらF8キーを押し、正常起動していたときの状態を復元ポイントから復元する
  2. 復元された3MBくらいのBootcat.cacheファイルをどこかにバックアップ
  3. 正常起動する
  4. ほうっておくと正常起動しなくなる
  5. Bootcat.cacheファイルを確認すると20KBになってる(この状態だとブルースクリーンで起動しない)
  6. 再度BIOSが終わったらF8を押し、コマンドプロンプトを立ち上げる
  7. バックアップした3MBくらいのBootcat.cacheファイルを復元
  8. 正常起動する

つまり、Bootcat.cacheファイルが無い、もしくは、20KBである時にブルー・スクリーンになる。Microsoftはこのファイルを消せと言っているが、消したら私の環境だと起動しなくなる。

ちょっと注意が必要なのは、コマンドプロンプトを立ち上げるとX:\windows\system32がカレントディレクトリとなっていると思う。Xドライブは回復コンソール用のRAMディスクなので、正しいシステムドライブを選ぶ必要がある。が、OSが入っているドライブがCドライブに割りあたっているわけではない。どうも、HDDのパーティションの頭からドライブ番号をC,D,E...と割り当てているみたいだ。それぞれのドライブの中身をみて判断してほしい。ちなみに、cdコマンドはcd /d c:\ のように/dオプションを付けないとドライブが切り替わらないので注意。(余談だが、PC-98向けのMS-DOSは/dオプションが要らなかった。/dオプションをなぜ導入したのかよくわからない。無くていい)

で、この方法を使ってもやはり使っている最中に勝手に何かのプロセスによってBootcat.cacheファイルが書き換えられ、ファイルサイズが20KBになって起動しなくなってしまう。

どうも、このファイルを書き換えているのはWindowsアップデートの関連プロセスの一つのようだ。コントロールパネルからWindowsアップデートを選び、最新のパッチが無いか手動で検索をかけたあたりでこれが更新される。放っておいても自動的にパッチがないか見に行くので、いつかBootcat.cacheファイルが書き換えられてしまう。

Windowsアップデートの関連サービスを止めて強制的にアップデートしないようにするという方法も考えたが、従業員が使用しているPCのパッチ適用状況を監視するソフトを見た管理者がすっ飛んできて「お前のPCにはこのパッチが入ってない。どうなってるんだ」とか文句たれるので気が進まない。

最終的に、リードオンリー属性を設定するという投げやりな方法で忘れ去ることにした。Bootcat.cacheファイルがどういうふうに作られて、何のために利用されるのか知らないが、「cache」とか銘打ってるのに消すと起動しなくなる、壊れたファイルを消して再生成させてもやっぱり壊れてる、とか、どう考えてもおかしいと思う。

ここまで調べたらMSに教えてあげるべきなのかも知れないけど、俺はそんなにやさしくないので放置。