スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷

[解説]64bit Windows時代到来

第2回 Win32アプリケーションを実行するWOW64

1.WOW64

デジタルアドバンテージ 打越 浩幸
2010/07/01
Page1 Page2

 前回は64bit版Windows OSについて、利用可能なメモリ容量の点からそのメリットをいくつか取り上げてみた。今回は、32bitアプリケーションを実行可能にするWOW64と、64bit CPUやWin64アプリケーションのプロセスモデルについてみてみよう。

WOW64:32bitコードを実行するための仕組み

 WOW64(Windows 32bit emulation on Windows 64bit)は、64bit Windows OS上で32bit Windowsアプリケーションの実行環境をエミュレーションするためのシステムである。64bit版Windows OSのカーネルは、もともとWin64というネイティブなAPIセットしかサポートしておらず、32bitや16bitのAPI(Win32やWin16)は持っていない。だがこれでは従来のアプリケーションを利用できないので、Win32アプリケーションを実行するための仕組みが用意されている。これがWOW64である。

 WOW64の仕組みを図にすると、次のようになる。

WOW64の構成
Win64(64bit)アプリケーションのAPI呼び出しはそのまま64bit Windows OSのカーネルへ渡される。これに対して、Win32(32bit)アプリケーションのAPI呼び出しはエミュレーション用の特別なDLLを経由してパラメータが変換され、その後64bit Windows OSのカーネルへ渡される。

 64bit Windows向けに作られたアプリケーションを実行する場合は、それぞれのアプリケーションごとに独立した1つの64bitプロセス空間が作成され、その中で実行される。

 これに対してWin32アプリケーションを実行しようとすると、32bit版のWindows OSをエミュレーションするための環境(32bitプロセス空間)が作成され、その中でWin32アプリケーションが実行される。Win32アプリケーションが発行するAPIはエミュレーション用に用意された特別なDLLを経由して64bitのOSカーネルへ渡される。

DLL 用途
WOW64.DLL WOW64を構成するコア・コンポーネント。NTOSKRNL.EXEへの中継を行うサンク(呼び出し)が含まれている。ファイル・システム・リダイレクションやレジストリ・リフレクションなどの処理も行う
WOW64WIN.DLL GUI関連のAPI(WIN32K.SYS)への中継を行うサンクが含まれている
WOW64CPU.DLL ホストCPUの抽象化を行うためのライブラリ。32bitモードと64bitモードの切り替えや、WOW64内における、32bit CPUのスレッド・コンテキストの切り替えなどを行う
NTDLL.DLL Win32からNTDLL.DLLを呼び出すと、Win64用に変換され64bitのNTDLL.DLLが呼び出される。USER32.DLLやGDI32.DLLなども同様
WOW64を構成する基本DLL
Win32アプリケーションが発行するAPIのうち、ポインタ・データを含むものや特別な処理が必要なものはこれらのDLLで対処したり、変換したりしてネイティブのOSカーネルへ渡される。ほかのDLLは、32bit版のWindows OSと同じものが用意されており、それが利用される。

 Win32とWin64 APIではポインタのサイズは異なるが、それ以外のデータ型は互換性がある(次ページで述べるように、intなどのデータ型は64bit環境でもサイズは同じである)。WOW64では、Win32 API呼び出しのパラメータ中にあるポインタを64bitアドレスに変換してOSカーネルを呼び出す。戻り値にポインタ・データが含まれている場合はその逆の変換をして、呼び出し元の関数へ戻す。

 Win32アプリケーションから利用するライブラリ(DLL)はこれ以外にも多数あるが、それらは32bit版Windows OSに含まれているものがそのまま利用される。%windir%\SysWOW64フォルダの内容を見ると分かるが(次の画面参照)、ここには32bit版Windows OSの%windir%\SYSTEM32フォルダの内容がほぼそのまま入っている。

WOW64のためのシステム・フォルダ
32bit Windows環境をエミュレーションするためのファイルは、SYSWOW64フォルダに格納されている。これは64bit版のWindows 7 Ultimate Editionでの画面例。
Windowsフォルダ内にあるSYSWOW64を開いてみる。
このフォルダを開く。
ここにあるファイルは、32bit版のWindows 7 Ultimate Editionの%windir%\SYSTEM32フォルダにあるものとほぼ同じ。前述のいくつかのDLLファイルのみが異なる。

 WOW64ではこのように、32bit版のWindowsコンポーネントを使うことにより、Win32アプリケーションを実行している。つまりエミュレーションというよりは、32bit版のWindows OSがほぼそのまま入っていて、その上でWin32アプリケーションを実行しているということになる。

 例えば、このSYSWOW64フォルダの中にあるメモ帳(notepad.exe)をダブルクリックして実行してみよう。[スタート]メニューからメモ帳を起動すると通常は64bit版のメモ帳が起動するが、SYSWOW64フォルダの中にあるnotepad.exeを実行すると、32bit版のメモ帳が実行される。この様子はタスク・マネージャの[プロセス]タブで確認できる。

32bit版メモ帳を起動する
SYSWOW64フォルダの中にあるメモ帳(notepad.exe)を起動した場合の例。
このタブを選択する。
末尾に「*32」と付いていることから、32bit版のメモ帳であることが分かる。

 このような仕組みのため、Win32アプリケーションの実行速度は32bit版のWindows OS上で実行している場合と比較しても、ほとんど変わらない。

ファイル・システムやレジストリのリダイレクション/リフレクション

 いま述べたように、WOW64環境ではSYSWOW64フォルダにあるDLLなどを使ってWin32アプリケーションを実行している。とすると、もしアプリケーションがデータやファイルを、プログラムの実行ファイルがある場所(起動した場所)に保存しようとするとどうなるだろうか? 本来ならば(純粋な32bit版のWindows OSの場合は)、%windir%\SYSTEM32%フォルダに保存することになるだろうが(注:Windows 7やWindows Vistaなどでは、デフォルトのアクセス権設定のままではこのフォルダへは保存できない)、WOW64上の場合はSYSWOW64フォルダに保存することになる。例えば設定ファイルを実行ファイルと同じ場所に保存するようなアプリケーションがあったとすると、これは問題となる可能性がある。%windir%\SYSTEM32%フォルダに書き込んだつもりなのに、別の場所に保存されてしまっているからだ。次回起動時にアプリケーションが設定ファイルを%windir%\SYSTEM32%フォルダから読み出そうしても見つからず、エラーとなるだろう。

 このような問題を避けるため、WOW64では、ファイル・システムやレジストリに対してリダイレクションやリフレクションをするための機能が用意されている。

ファイル・システムのリダイレクト

 これは、特定のフォルダやファイル名に対して、別の場所へ誘導したり、置き換えたりする機能である(WOW64.DLLで実装されている)。Win32から呼び出したファイル・システム関連のパラメータにこれらのパス名が含まれていると、それを上書きして別の場所やファイルへ誘導する。具体的には、次のようなパスが対象となる。

パス リダイレクトの内容
%windir%\System32 Win32アプリケーションからこのパスへアクセスすると、実際には%windir%\SYSWOW64フォルダへリダイレクトされる
%windir%\lastgood %windir%\lastgood\SYSWOW64にリダイレクトされる
%windir%\regedit.exe %windir%\SysWOW64\regedit.exeにリダイレクトされる。regeditは常にSYSWOW64フォルダのものを使うようにするための措置
%windir%\system32\catroot
%windir%\system32\catroot2
%windir%\system32\driversstore
%windir%\system32\drivers\etc
%windir%\system32\logfiles
%windir%\system32\spool
これらは%windir%\SYSWOW64ディレクトリにリダイレクトされない。同じファイルを2カ所に作らせないための措置。
:ただしWindows Server 2008、Windows Vista、Windows Server 2003および Windows XPの64bit版では、%windir%\system32\driversstoreフォルダはリダイレクトされる
%windir%\Sysnative これは仮想的なフォルダ名。これを利用すると、リダイレクトされずに(リダイレクト機能をパスして)、直接%windir%\system32フォルダへアクセスできる。この仮想的なフォルダはWindows Vista以降で追加された。ただし仮想フォルダなので、64bitのネイティブ・アプリケーションからは利用できない
WOW64でリダイレクトされる特殊フォルダ/パス名

 以下にフォルダがリダイレクトされる例を示しておく。

C:\Windows\system32>prompt [%PROCESSOR_ARCHITECTURE%]$p$g …プロンプトを変更

[AMD64]C:\Windows\system32> …現在はWin64上

[AMD64]C:\Windows\system32>mkdir TMP C:\Windows\SysWOW64\TMP …TMPフォルダを作成

[AMD64]C:\Windows\system32>dir > TMP\THIS_IS_WIN64.TXT …Win64上でファイル作成

[AMD64]C:\Windows\system32>dir TMP …確認
 ドライブ C のボリューム ラベルは WIN7X64 です
 ボリューム シリアル番号は 9C7C-5B6B です

 C:\Windows\system32\TMP のディレクトリ

2010/06/29  12:43    <DIR>          .
2010/06/29  12:43    <DIR>          ..
2010/06/29  12:43           143,058 THIS_IS_WIN64.TXT …作成したファイル
               1 個のファイル             143,058 バイト
               2 個のディレクトリ  825,908,105,216 バイトの空き領域

[AMD64]C:\Windows\system32>C:\Windows\SysWOW64\cmd …WOW64上でcmdを起動
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

[AMD64]C:\Windows\system32>prompt [%PROCESSOR_ARCHITECTURE%]$p$g …プロンプトの変更

[x86]C:\Windows\system32> …WOW64上で実行中(x86となっている)

[x86]C:\Windows\system32>dir > TMP\THIS_IS_x86.TXT …WOW64上でファイル作成

[x86]C:\Windows\system32>dir tmp …確認
 ドライブ C のボリューム ラベルは WIN7X64 です
 ボリューム シリアル番号は 9C7C-5B6B です

 C:\Windows\system32\tmp のディレクトリ

2010/06/29  12:45    <DIR>          .
2010/06/29  12:45    <DIR>          ..
2010/06/29  12:45           120,126 THIS_IS_x86.TXT …作成したファイル。最初に作成したファイルはここにはない
               1 個のファイル             120,126 バイト
               2 個のディレクトリ  825,907,982,336 バイトの空き領域

[x86]C:\Windows\system32>exit …WOW64を終了

[AMD64]C:\Windows\system32>dir TMP C:\Windows\SysWOW64\TMP …再確認
 ドライブ C のボリューム ラベルは WIN7X64 です
 ボリューム シリアル番号は 9C7C-5B6B です

 C:\Windows\system32\TMP のディレクトリ …Win64上のTMP

2010/06/29  12:43    <DIR>          .
2010/06/29  12:43    <DIR>          ..
2010/06/29  12:43           143,058 THIS_IS_WIN64.TXT …Win64上で作成したファイル
               1 個のファイル             143,058 バイト

 C:\Windows\SysWOW64\TMP のディレクトリ …WOW64上のTMP

2010/06/29  12:45    <DIR>          .
2010/06/29  12:45    <DIR>          ..
2010/06/29  12:45           120,126 THIS_IS_x86.TXT …WOW64上で作成したファイル
               1 個のファイル             120,126 バイト
               2 個のディレクトリ  825,907,458,048 バイトの空き領域

[AMD64]C:\Windows\system32>

レジストリのリダイレクションとリフレクション

 ファイル・システムのリダイレクションと同様に、レジストリのエントリにもいくつかリダイレクトされるものがある(HKLM\SoftwareやHKCUなど)。これは32bitアプリケーションと64bitアプリケーションで異なる設定を(同じキーの場所などに)保存したい、といった要求にこたえるものである。実行している環境に応じて、32bit用と64bit用で異なるレジストリ・キーが作られ、参照や更新などが自動的に振り分けられるようになっている。さらに「レジストリ・リフレクション」という機能も用意され、一方を更新すると、自動的に対応するキーが更新される(反映される)機能も用意されている。完全に分けてしまうと、先ほどのフォルダのリダイレクトのように、保存したはずの値が読み出せない(例:32bitアプリケーションで保存したものが、64bitアプリケーションで読み出せないなど)ということが起こる可能性もあるので、自動的に反映するようにするためだ。

 この機能は非常に分かりづらく、主にプログラマが対応するべきことなので、ここでは詳細は述べない。以下のWebページなどを参照していただきたい。

 さらに「レジストリ・リフレクション」という機能も用意され、一方を更新すると、自動的に対応するキーが更新される(反映される)機能も用意されている。完全に分けてしまうと、先ほどのフォルダのリダイレクトのように、保存したはずの値が読み出せない(例:32bitアプリケーションで保存したものが、64bitアプリケーションで読み出せないなど)ということが起こる可能性もあるので、自動的に反映するようにするためだ。しかし、非常に使いづらかったのか、Windows 7およびWindows Server 2008 R2以降では廃止されている。アプリケーションを開発/改修する場合は注意していただきたい。

WOW64の制限

 以上、WOW64について解説してきたが、いくつか制限事項もある。最後にそれについて述べておく。

  • WOW64を使った場合のプロセス・アドレス空間はデフォルトでは2Gbytesに制限されている。Windows OSのバージョンによっては、32bitプロセスでもトータルで4Gbytes以上のメモリが利用できるものがあるが、WOW64では利用できない。

  • 32bitプロセスは64bitのDLLをロードできない(リソースのみのDLLならロード可能)。

  • 16bitアプリケーション(Win16アプリケーション)を呼び出すことはできない。Win32やWin64 APIで利用されるハンドル情報は16bit幅には格納できないので、16bitアプリケーションに渡したり、結果を受け取ったりできない。そのため、WOW64ではWin16アプリケーションを実行できない。

  • Virtual DOS Machine (VDM。いわゆるDOS窓)用の特別なAPIはサポートされていない。


 INDEX
  [解説]64bit Windows時代到来
  第2回 Win32アプリケーションを実行するWOW64
  1.WOW64
    2.64bit CPUとWin64

目次ページへ  「特集」

ホワイトペーパーTechTargetジャパン

Windows Server Insider フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
@IT Sepcial
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Sepcial
ソリューションFLASH