●
KK法・幽霊キー
三井
「何ですか、『
幽霊キー
』って・・・。」
片原
「例えばですね、日本製のアプリケーションの中には、アンインストール情報を
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
に格納するときに、日本語でキーを作成するものがあるんです。」
片原
「ところが、
日本語名のレジストリキーをリアルモードで取り込むと、以後、GUI のレジストリエディタでも Windows API 経由でも、そのレジストリキー自身を含む以下のレジストリツリーにアクセスできなくなってしまう
のです。」
麻績村
「何でよ?」
片原
「レジストリエディタで状態を見てみると、取り込んだ日本語名のキーは存在しているのですが、マウスでクリックしてもカーソルキーで選んでもエラーが出てしまいます。選べなくては、直接の修正も削除もできず、結局1つ上の階層のレジストリキー以下を全て削除するしかなくなります。」
片原
「このように
名前はあるのに実体にアクセスできず、ユーザがどうすることも出来ないレジストリキー
を、似たような性質(?)の幽霊に喩えて、KK法では『
幽霊キー
』と呼んでいます。」
三井
「どうしてそんな現象が?」
片原
「レジストリの構造の話を思い出していただけますか?
RGKN ブロックのレコードには、それに対応する RGDB レコードに含まれるレジストリキー名の
チェックサム
が格納されています
。」
三井
「説明を見ると・・・確かに書いてあるわね。」
片原
「この
チェックサム
の計算方法が、GUI のレジストリエディタとリアルモードのレジストリエディタで異なる
ことが原因で、幽霊キーが発生するのです。」
GUI のレジストリエディタでのキー名チェックサム計算式
(1バイト毎に分けたキー名文字列)
ただし、次の変換を行う:
・
半角英小文字
→半角英大文字
・
半角カナ、半角カナ記号
→(合計しない)
・
全角文字すべて
→上下バイトともに最上位ビットを反転
・
その他の文字
→そのまま加算
リアルモードのレジストリエディタでのキー名チェックサム計算式
(1バイト毎に分けたキー名文字列)
ただし、次の変換を行う:
・
半角英小文字
→半角英大文字
・
最上位ビットが1(0x80...0xff)
→(合計しない)
・
その他の文字
→そのまま加算
麻績村
「また細かい話だぞ・・・でも、
リアルモードの方は随分とシンプルな計算をしている
な。」
片原
「そのせいで、
・
日本語キーをリアルモードで取り込んだときに RGKN レコードに記録されたキー名チェックサム
・
GUI でアクセスしようとしたときにシステムが計算するチェックサム
が一致しなくなり、
不正なキー
として扱われるのです。これが『
幽霊キー
』の正体です。」
三井
「これは厄介ですねぇえ? 日本語のレジストリキーって結構あるんですか?」
片原
「2バイトコードでレジストリキーを作ることは、本当は SDK 規約に反しているらしいのですが、割とあります。まあ仕方ないでしょうね。しかし、
Win9x 自体も、
MenuOrder
などで日本語名のキーを使用しています
。個人的には問題だと思っているのですけどね。」
片原
「起動最小レジストリを作るのに、
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
、
HKEY_USERS\.Default\Software\Microsoft\Windows
以下のキーをごっそり使うのが一番スマートなのですが(これが
KK法A1方式
だった)、幽霊キーの問題により、
これらのキーのツリーの下にあってシステムが起動するのに必須のもののみ選び出す必要が出てきた
わけです。」
片原
「Win98 付属のレジストリエディタからは、リアルモードでの日本語キー取り込み問題が解消されているようです。いくら元がアメリカ製の OS だからといっても、手を抜きすぎではないかと、思ったりもしますが。」
入り口へ戻る
次ページへ進める
ページを戻るときはブラウザの戻りボタンで