レジストリを格納したファイル(レジストリハイブ)をバイナリエディタで編集するという荒業?を経験したので、その記録。
数ヶ月前のことになるが、レジストリが壊れた。
PCがブルースクリーンで落ち、どうもそのときに壊れたらしい。
丸ごと吹っ飛んだのならあきらめもつくが、中途半端に自動復旧されたらしく、動作がおかしくなった。
レジストリだなあと検討をつけ、レジストリクリーナー的なツールを何通りか使ってみたが、どのツールも使用中に落ちる。
試行錯誤して、ある特定のレジストリエントリで落ちているらしいことが判明。
次いで、そのエントリをレジストリエディタで見てみると、サブキーが無限に開ける状態になっていた。
つまり、
・エントリを開く→キーがひとつある
・そのキーを開く→さらにその中に同じ名前のサブキーがある
以降、この2番目が延々と続く状態。
これを普通のツールで開いたら、無限ループになるかメモリ不足で落ちてしまうか、という事態は避けられない。
手に入る限りのレジストリ関連ツールを試してみたが、どれもだめ。
で、ここでさっさと「システムの復元」を試せばよかったのだと思う。
しかし、私は毎日復旧ポイントが自動生成されるのを知らず、システムの復元をやったらPCがずっと前の状態に戻ってしまうと信じ込んでいた。
復旧ポイントは直近1ヶ月しか保存されないようだ。
気づいたときには、もうまともな復旧ポイントは残っていなかった。
そしてさらに数ヶ月。このページを見つけた。
レジストリ・レジストリハイブファイルの内部構造 – 【アダ被の部屋】Wiki
このファイル構造を直にいじれば、レジストリを直せるかもしれない!
だめもとでやってみることにした。
以下、非常に危険なので実際にやるのはオススメしない。
まず、レジストリを保存しているファイル(レジストリハイブ)を取り出す。
最新のレジストリハイブはシステムがロックしているので、復旧ポイントのファイルを使う。
これは
C:System Volume Information
の中に格納されている。
詳しくはこちら。
私の場合、壊れたエントリが含まれているのはユーザ個別のレジストリ(HKEY_USERS)で、これが格納されているのはユーザ個別のファイルなので、それをコピーしてきた。
といっても、ファイル名からではどれがどのユーザのファイルかわからないのだが、現在のレジストリファイル(Documents and Settings{userid}
tuser.dat)のファイルサイズと見比べて、見当をつけた。
つぎに、これをバイナリエディタで開く。
私はStirlingを使用した。
異常が起きているキーの場所を文字列検索で捜し、それを上述のファイル構造資料を基にチェック。
「サブキーの数」が1になっていたのを0に書き換え、保存。
こんどはこれをシステムに書き戻さなければならない。
現在のレジストリファイル(Documents and Settings{userid}
tuser.dat)はロックされていて上書きできない。
そこで、システムをセーフモードで起動し、Administratorでログインして試したら上書きできた。
そして再起動。
めでたく、異常なレジストリキーは消えてなくなった。
やれやれ。
メモはしたけれど、もう一度やりたくはないな…
システムがおかしくなったら、とにかく「システムの復元」!
肝に銘じよう。

コメント