レジストリ リダイレクター
レジストリ リダイレクターは、WOW64 上のレジストリの特定の部分の個別の論理ビューを提供することで、32 ビットと 64 ビットのアプリケーションを分離します。 レジストリ リダイレクターは、32 ビットと 64 ビットのレジストリ呼び出しをそれぞれの論理レジストリ ビューにインターセプトし、対応する物理レジストリの場所にマップします。 リダイレクト プロセスは、アプリケーションに対して透過的です。 そのため、32 ビット アプリケーションは、データが 64 ビット Windows 上の別の場所に格納されている場合でも、32 ビット Windows で実行されているかのようにレジストリ データにアクセスできます。
ARM 上のWindows 10: x86 アプリケーションの 32 ビット論理ビューに加えて、ARM 上のWindows 10には、32 ビット ARM アプリケーション用の個別の論理ビューが含まれています。
リダイレクトされたレジストリ パスの下にあるキーのサブセットが共有されます。 共有キーへの 32 ビット レジストリ呼び出しはリダイレクトされません。 代わりに、キーの 1 つの物理コピーがレジストリの各論理ビューにマップされます。 リダイレクトされたキーと共有キーの一覧については、「 WOW64 の影響を受けるレジストリ キー」を参照してください。
Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: COM やその他のメカニズムを使用してアプリケーションの相互運用性を有効にするために、リダイレクトされたレジストリ キーのサブセットも 反映されます。 レジストリ リフレクションのプロセスでは、2 つのレジストリ ビュー間でレジストリ キーと値がコピーされ、同期が維持されます。 レジストリ リフレクションは、Windows 7 および Windows Server 2008 R2 以降で削除されました。 詳細については、「 レジストリ リフレクション」を参照してください。
次のシナリオは、これらの論理ビューの使用を示しています。
- 32 ビット x86 アプリケーションは、次のレジストリ キーが存在するかどうかを確認します: HKEY_LOCAL_MACHINE\Software\Hello。 キーが存在しない場合、アプリケーションは既定値の "Hello 32 ビット x86 world" でキーを作成します。それ以外の場合は、値を読み取って表示します。
- 同じアプリケーションは、"Hello 32 ビット x86 world" ではなく "Hello 64 ビットワールド" を記述するように変更され、64 ビット x64 または ARM64 アプリケーションとして再コンパイルされます。
- ARM でのWindows 10: 同じアプリケーションが "Hello 32 ビット ARM world" を記述するように変更され、32 ビット ARM アプリケーションとして再コンパイルされます。
- 32 ビット x86 アプリケーションが 64 ビット Windows で実行されると、"Hello 32 ビット x86 world" と表示されます。 64 ビット アプリケーションを実行すると、"Hello 64 ビット ワールド" と表示されます。 ARM でのWindows 10: 32 ビット ARM アプリケーションが 64 ビット ARM64 Windows で実行されると、"Hello 32 ビット ARM world" と表示されます。 すべてのアプリケーションは、同じ定義済みハンドルと同じキー名を持つ同じレジストリ関数を呼び出します。違いは、各アプリケーションがレジストリの論理ビューで動作し、各ビューがレジストリの個別の物理的な場所にマップされ、すべてのバージョンの文字列をそのまま保持するという点です。
リダイレクトされたキーは、 Wow6432Node の下の物理的な場所にマップされます。 たとえば、 HKEY_LOCAL_MACHINE\Software は HKEY_LOCAL_MACHINE\Software\Wow6432Nodeにリダイレクトされます。 ただし、リダイレクトされたキーの物理的な場所は、システムによって予約されていると見なす必要があります。 この場所は変更される可能性があるため、アプリケーションはキーの物理的な場所に直接アクセスしないでください。 詳細については、「 代替レジストリ ビューへのアクセス」を参照してください。
ARM でのWindows 10: リダイレクトされた 32 ビット ARM キーは、WowAA32Node の下の物理的な場所にマップされます。
%ProgramFiles% または %commonprogramfiles% を含む REG_SZ または REG_EXPAND_SZ データをレジストリに書き込む 32 ビット アプリケーションを支援するために、WOW64 はこれらの書き込み操作をインターセプトし、"%ProgramFiles(x86)%" と "%commonprogramfiles(x86)%" に置き換えます。 たとえば、Program Files ディレクトリが C ドライブ上にある場合、"%ProgramFiles(x86)%" は "C:\Program Files (x86)" に展開されます。 置換は、次の条件が満たされた場合にのみ発生します。
- 文字列は%ProgramFiles% または %commonprogramfiles% で始まる必要があります。 文字列がスペースまたは %以外の文字で始まる場合、文字列は置き換えされません。
- 文字列比較では大文字と小文字が区別されるため、%ProgramFiles% または %commonprogramfiles% の大文字と小文字は正確に示されている必要があります。 たとえば、文字列が %commonprogramfiles% ではなく %CommonProgramFiles% で始まる場合、文字列は置き換えされません。
- 文字列はMAX_PATH*2+15 文字を超えることはできません。 この長さを超える場合は、置き換えされません。
- キーをKEY_WOW64_64KEYで開くことができません。 このフラグは、キーに対する操作を 64 ビット レジストリ ビューで実行する必要があるため、置き換えないことを指定します。 詳細については、「 代替レジストリ ビューへのアクセス」を参照してください。
Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: KEY_WOW_64_64KEY フラグは、キーが置き換えられるかどうかには影響しません。 このフラグは、Windows 7 および Windows Server 2008 R2 以降の置換に影響します。
さらに、system32 を含むREG_SZキーまたはREG_EXPAND_SZ キーは syswow64 に置き換えられます。 文字列は、%windir%\system32 を指すパスで始まる必要があります。 文字列の比較では、大文字と小文字は区別されません。 パスと一致する前に環境変数が展開されるため、%windir%\system32、%SystemRoot%\system32、C:\windows\system32 のパスがすべて置き換えられます。 このパッチは、Windows 7 より前に反映されたキーにのみ適用されます。
詳細については、次のトピックを参照してください。
- レジストリ リフレクション
- WOW64 の影響を受けるレジストリ キー
- 代替レジストリ ビューへのアクセス
- WOW64 でのレジストリ リダイレクトの例
- 64 ビット Windows のリモート レジストリ アクセス