一部の HKLM エントリは 64 ビット PC で読み取ることができるのに、一部は VB6 では読み取れないのはなぜですか?

一部の HKLM エントリは 64 ビット PC で読み取ることができるのに、一部は VB6 では読み取れないのはなぜですか?

弊社のソフトウェアは、産業用で隔離された環境にあるお客様によって、Windows XP と多数の古いサーバーしか稼働していないため、従来の Windows バージョンで使用されています。これらのサーバーのうちいくつかは 64 ビットです。

レジストリを読んでみると、場合によっては 32 ビット アプリが 64 ビット ウィンドウで以下のエントリを直接読み取ることができることに気付きました。これは理論的には不可能なはずです。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer文字列値「Version」からバージョン番号を取得します。

ただし、同じ PC 上にキーを作成し HKEY_LOCAL_MACHINE\SOFTWARE\Our Software、「Last Serviced」のような文字列値を追加しても、読み取ることはできません。

権限と所有権は IE エントリと同じですが、そこに追加しようとしても効果がありません。

もちろん、これで\\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Our Software\Last Service Date動作しますが、他の一部のものはレジストリの「通常の」部分に入れて読み取り可能になるのに、他のものは読み取れないのはなぜでしょうか。サービス日付を読み取るためにアプリケーションからデータを取得する場合、より簡単でクリーンになります。また、不注意によって標準の HKEY_LOCAL_MACHINE に誤って追加されると重大です。

何か見逃しているのでしょうか?

答え1

あなたは遭遇しました レジストリリダイレクタ:

レジストリ リダイレクタは、WOW64 上のレジストリの特定の部分の論理ビューを別々に提供することで、32 ビット アプリケーションと 64 ビット アプリケーションを分離します。レジストリ リダイレクタは、それぞれの論理レジストリ ビューへの 32 ビット レジストリと 64 ビット レジストリの呼び出しをインターセプトし、対応する物理レジストリの場所にマップします。リダイレクト プロセスはアプリケーションに対して透過的です。したがって、32 ビット アプリケーションは、データが 64 ビット Windows 上の別の場所に格納されている場合でも、32 ビット Windows で実行されているかのようにレジストリ データにアクセスできます。

などの一部のアプリケーション レジストリ キーはHKEY_LOCAL_MACHINE\Software 常にリダイレクトされます。レジストリ ハイブのほとんどはリダイレクトされません。

32/64ビットプログラムは、記事で説明されているように、リクエストに特別なフラグを含めることで、64/32ビットバージョンのレジストリに強制的にアクセスすることができます。 代替レジストリビューへのアクセス参照 WOW64 でのレジストリ リダイレクトの例

関連情報