WOW64 エミュレータはユーザー モードで実行されます。これにより、32 ビット版の Ntdll.dll とプロセッサのカーネル間のインターフェイスが提供され、カーネル呼び出しがインターセプトされます。WOW64 エミュレータは、次の DLL から構成されています。
- Wow64.dll では、エミュレーションの主要なインフラストラクチャと、Ntoskrnl.exe のエントリ ポイント関数のサンクが提供されます。
- Wow64Win.dll では、Win32k.sys のエントリ ポイント関数のサンクが提供されます。
- Wow64Cpu.dll では、Itanium プロセッサの x86 命令エミュレーションが提供されます。これにより、プロセッサ上でモード切り替えの命令が実行されます。x64 プロセッサでは、最大限のクロック速度で x86-32 命令を実行するので、この DLL は必ずしも x64 プロセッサ専用というわけではありません。
- IA32Exec.bin には、x86 のソフトウェア エミュレータが含まれます (Intel Itanium のみ)。
- Wowia32x.dll では、IA32Exec.bin と WOW64 間のインターフェイスが提供されます (Intel Itanium のみ)。
これらの DLL と 64 ビット版の Ntdll.dll は、32 ビット プロセスに読み込むことができる、唯一の 64 ビット バイナリです。
起動時に、Wow64.dll は x86 版の Ntdll.dll を読み込み、その初期化コードを実行します。これにより、必要とされるすべての 32 ビット版の DLL が読み込まれます。32 ビット版の DLL は、基本的に 32 ビット版の Windows バイナリから変更されていません。ただし、これらの DLL には、32 ビット版の Windows とは異なる動作を WOW64 で行うように記述されているものがあります。これは、通常、一部の DLL が 64 ビット システムのコンポーネントとメモリを共有しているために行われている措置です。32 ビット制限を超えるすべてのユーザー モードのアドレス空間は、システムによって予約されます。詳細については、「WOW64 環境でのパフォーマンスとメモリ消費量」を参照してください。
x86 のシステム サービス呼び出しシーケンスを使用する代わりに、システム呼び出しを行う 32 ビット バイナリがリビルドされ、カスタムの呼び出しシーケンスが使用されます。この呼び出しシーケンスは、ユーザー モードのままで行われるので、WOW64 でインターセプトする際に負担がかかりません。カスタムの呼び出しシーケンスが検出されると、WOW64 での CPU のトランザクションがネイティブ 64 ビット モードに戻り、Wow64.dll が呼び出されます。サンクはユーザー モードで行われるため、64 ビット カーネルへの影響が減少し、カーネル モードのクラッシュ、データの破損、またはセキュリティ ホールとなる可能性があるサンクのバグによるリスクが低下します。サンクでは、32 ビット スタックから引数を抽出し、その引数を 64 ビットに拡張してから、ネイティブのシステム呼び出しを行います。
環境変数
64 ビット プロセスによって 32 ビット プロセスが作成された場合、または 32 ビット プロセスによって 64 ビット プロセスが作成された場合は、次の表に示すような、作成されたプロセスの環境変数が WOW64 によって設定されます。
| プロセス | 環境変数 |
|---|---|
|
64 ビット プロセス |
PROCESSOR_ARCHITECTURE=AMD64 または PROCESSOR_ARCHITECTURE=IA64 ProgramFiles=%ProgramFiles% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles% CommonProgramW6432=%CommonProgramFiles%
|
|
32 ビット プロセス |
PROCESSOR_ARCHITECTURE=x86 PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE% ProgramFiles=%ProgramFiles(x86)% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles(x86)% CommonProgramW6432=%CommonProgramFiles% |
グローバル フック
次の条件を満たしている場合は、SetWindowsHookEx 関数(英語) を使用して、DLL を別のプロセスに挿入することができます。
- 32 ビット DLL を 32 ビット プロセスのみに挿入できる、および 64 ビット DLL を 64 ビット プロセスのみに挿入できる場合。32 ビット DLL を 64 ビット プロセスに挿入したり、64 ビット DLL を 32 ビット プロセスに挿入したりすることはできません。
- 32 ビット DLL と 64 ビット DLL に別の名前を付ける必要がある場合。
WH_MOUSE、WH_KEYBOARD、WH_JOURNAL*、WH_SHELL、および下位レベルのフックは、フックを処理しているスレッドではなく、フックがインストールされたスレッドで呼び出すことができます。これらのフックでは、フック チェインで 64 ビット フックの前に 32 ビット フックがある場合に、32 ビットおよび 64 ビット フックの両方が呼び出される可能性があります。詳細については、「Using Hooks」(英語) を参照してください。
このトピックに関するご意見をお寄せください (英語のみ)。
ビルド日付: 2009 年 5 月 30 日