Windows10

32bitソフトの64bit環境での動作

レジストリリフレクション

[このトピックの情報は、Windows Server 2008、Windows Vista、Windows Server 2003、およびWindows XPに適用されます。 Windows 7およびWindows Server 2008 R2以降、WOW64はレジストリリフレクションを使用しなくなり、以前に反映されたキーが代わりに共有されます。詳細については、「WOW64の影響を受けるレジストリキー」を参照してください。]

レジストリリダイレクタは、WOW64上のレジストリの特定部分の個別の論理ビューを提供することにより、32ビットアプリケーションと64ビットアプリケーションを分離します。ただし、一部のレジストリキーの値は、32ビットビューと64ビットビューの両方で同じである必要があります。

レジストリリフレクションのプロセスでは、2つのレジストリビュー間でレジストリキーと値をコピーして、それらの同期を維持します。各ビューには、反映された各レジストリキーの個別の物理コピーがあり、1つは32ビットレジストリビュー用、もう1つは64ビットレジストリビュー用です。

RegCloseKeyを呼び出してキーを閉じると、反映されたキーがコピーされます。これにより、競合状態が発生する可能性があることに注意してください。複数のプロセスが反映されたキーを変更した場合、最後のRegCloseKey呼び出しがキーの最終値を決定します。

リフレクターは、ビュー間でローカルサーバーのCOMアクティベーションデータをコピーしますが、64ビットWindowsでは32/64インプロセスデータの混合が許可されていないため、インプロセスデータはコピーしません。

リフレクションは、共有レジストリキーまたはリダイレクトされないレジストリキーでは有効になっていません。たとえば、HKEY_LOCAL_MACHINE \ Systemキーのリフレクションは有効になっていません。リダイレクト、共有、または反映されるレジストリキーの一覧については、「WOW64の影響を受けるレジストリキー」を参照してください。

レジストリリフレクションは、次の例に示すように、「最後の書き込み優先」ポリシーを使用します。

  • 64ビットWindowsのクリーンインストール後、64ビットWordpad.exeが.docファイルを処理するために登録されます。リフレクターは、64ビットレジストリビューから32ビットレジストリビューに.doc登録をコピーします。
  • 管理者は32ビットのOfficeをインストールし、32ビットのレジストリビューで.docファイルを処理するために32ビットのWinword.exeを登録します。レジストリリフレクターはこの情報を64ビットのレジストリビューにコピーするため、32ビットと64ビットの両方のアプリケーションが.docファイルに対して32ビットバージョンのWinword.exeを起動します。
  • 管理者が64ビットのOfficeをインストールすると、64ビットのレジストリビューで.docファイルを処理するために64ビットのWinword.exeが登録されます。レジストリリフレクタはこの情報を32ビットレジストリにコピーするため、32ビットアプリケーションと64ビットアプリケーションの両方が.docファイルに対して64ビットバージョンのWinword.exeを起動します。

したがって、ファイルの関連付け情報は、最後にインストールされたアプリケーションに対して保持されます。

32ビットアプリケーションと64ビットアプリケーションが、通常は別々のレジストリビューに書き込まれる特定のレジストリキー値を共有すると便利です。たとえば、32ビットと64ビットの両方のクライアントからの要求を処理できる32ビットのOLEサーバーは、32ビットのレジストリデータをシステムレジストリの64ビットのビューで使用できるようにすることができます。

コンポーネントがシステムレジストリにデータを書き込むと、WOW64はその情報を分析し、必要に応じてレジストリの代替ビューにデータのコピーを作成します。通常、このプロセスは、同じレジストリキーの2つの個別の物理コピーをレジストリの両方のビューに保持します。これは、レジストリリフレクションまたはレジストリミラーリングと呼ばれます。

クラスルートの下のほとんどのキーはこのカテゴリにあります。キーの更新は、更新が完了し、キーへのハンドルが閉じると反映されます。特定のケースでは、キーにビット依存性がある場合、キーへの書き込みは反映されません。たとえば、32ビットのInprocServer32キーは64ビットアプリケーションには関係がないため、InprocServer32キーは64ビットのレジストリビューに反映されません。ただし、64ビットアプリケーションは32ビットのLocalServer32キーを使用でき、LocalServer32キーが反映されます。

HKEY_LOCAL_MACHINE \ Software \ Classes \ CLSIDおよびHKEY_CURRENT_USER \ Software \ Classes \ CLSIDの場合、InprocServer32またはInprocHandler32を指定していないCLSIDのみが反映されます。プロセス外で実行され、32ビットまたは64ビットアプリケーションでアクティブ化できるため、LocalServer32 CLSIDのみが反映されます。 InProcServer32 CLSIDは反映されません。これは、64ビットプロセスで実行するための32ビットDLL、または32ビットプロセスで実行するために64ビットDLLをロードできないためです。

HKEY_LOCAL_MACHINE \ Software \ Classes \ AppidおよびHKEY_CURRENT_USER \ Software \ Classes \ Appidの場合、DllSurrogateおよびDllSurrogateExecutableレジストリ値は、その値が空の文字列の場合は反映されません。

特定のリフレクトされたキーのレジストリリフレクションを無効および有効にするには、RegDisableReflectionKey関数とRegEnableReflectionKey関数を使用します。これらの関数は、このトピックの前半で反映されたキーのリストにないキーには影響しません。アプリケーションは、作成したレジストリキーに対してのみリフレクションを無効にする必要があり、HKEY_LOCAL_MACHINEHKEY_CURRENT_USERなどの定義済みキーに対するリフレクションを無効にしないでください。リフレクションリストのキーが無効になっているかどうかを確認するには、RegQueryReflectionKey関数を使用します。

反映されたキーは、トランザクションレジストリ操作では使用しないでください。トランザクション中に反映されたキーに書き込むと、トランザクションが失敗する可能性があります。トランザクションの詳細については、カーネルトランザクションマネージャーを参照してください。

参考記事:Registry Reflection

 

関連トピック

レジストリリダイレクタ

Windowsでのレジストリリフレクション

WOW64の影響を受けるレジストリキー

おすすめサイトをご紹介

  • この記事を書いた人

山本

はじめまして。「山本まこと」と申します。フリーランスでシステムエンジニアを現役でさせて頂いています。業務内容はシステム設計、プログラム作成等何でさせて頂いています。 特にサーバ構築、業務端末(パソコン)の構築の仕事を多くさせて頂いています。サーバ構築はOSが24時間止まらず高パフォーマンスで動作する用に設定したり セキュリティ対策(脆弱性)を実施することやデータベースの構築も実施します。業務端末(パソコン)の構築は業務アプリケーションが快適に動作するようOSの設定を実施します。パソコンは日進月歩で性能はどんどん向上しています。 またマイクロソフトのOSもWinows7からWindows10へ移行する段階を迎えています。Windows10においては、使い勝手はとても良くなっていますが、自動化が進み、一度不調になってしまうと設定変更での修復するにはコツが必要です。 また、マシンスペックについてもある程度のものが要求されます。このホームページでは、皆さんがパソコンを快適に使っていただけるようにお役に立てたらと思い、記事を書かせて頂いています。

-32bitソフトの64bit環境での動作
-,

Copyright© 幸せになれるPCライフ , 2020 All Rights Reserved.