Skip to content

MS_WOW64

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

WOW64

概要

WOW64についての情報を纏めている。

とは?

  • WOW64(Windows-on-Windows 64-bit)は、64bit版のWindows OS上で
    32bitアプリケーションを動作させるための互換レイヤー(サブシステム)。
  • 64bit OSは本来64bitアプリのみをネイティブで動かしますが、
    過去の資産(32bitアプリ)も実行できるようにするためにWOW64が存在。

仕組み

32bitアプリ →(が、64bit OS上の)WOW64レイヤー(で動作し、)→ 64bitカーネル(との間を仲介する)
という流れで動作

  • カーネルは64bitのみで、32bitカーネルをエミュレーションしている訳ではない。
  • 32bitコードはユーザーモードで、WOW64上で32bitで動作し、64bitカーネルとの仲介がされる。
  • カーネルモード・ドライバは32bit非対応(64bit専用が必要)。
  • WOW64はCPUの互換モード(IA-32eの互換モード)と組み合わせて実現。

アドレス空間の制御

32bitアプリは最大4GBの仮想メモリ空間を利用可能
(通常、32bitの4GBは、カーネル2GB・ユーザ2GBと利用される)。

※ WOW64 上ではカーネルが 64bit なので、32bit アプリのユーザ空間を圧迫しない。
IMAGE_FILE_LARGE_ADDRESS_AWARE を立てた 32bit アプリは、
64bit OS 上で ユーザ空間 4GB 弱を使える(32bit OS の /3GB より有利)。

API変換

32bitアプリが呼び出すWin32 API(システムコール)を、64bitカーネル向けに変換(サンク)。

リダイレクト

API呼び出しの互換性を維持するAPI変換とは別の技術でリソース参照の互換性を維持する。

  • ファイルシステム・リダイレクト
    • C:\Windows\System32 は64bit DLL用。
    • 32bitアプリが利用する System32 を C:\Windows\SysWOW64 にリダイレクト。
  • レジストリ・リダイレクト
    • HKLM\Software は64bit用。
    • 32bitアプリが利用する HKLM\Software\WOW6432Node にリダイレクト。

※ 紛らわしいが、System32 が 64bit、SysWOW64 が 32bit
名前は「その環境から見た System32」という互換上の経緯による。

FAQ

Q: 16bitアプリは動く?

A: 64bit Windowsでは16bitアプリは動かない(NTVDMがない)。

Q: 32bitカーネルモード・ドライバは動く?

A: カーネルモード・ドライバは32bit非対応(64bit専用が必要)。

Q: ARM64版Windowsでは?

A: WOW64の仕組みを拡張した WOW64(ARM64 版)で x86 アプリをエミュレーションできる。
ARM64EC は「エミュレーションと互換性のある ABI」で、
ネイティブ ARM64 コードと x64 コードを同一プロセス内で混在させるための仕組み。

移行メモ(正誤): 原文は「WOW64EC で x86 アプリをエミュレーション」としていたが、 正しくは ARM64EC(Emulation Compatible)。 しかも ARM64EC はエミュレーションのための仕組みそのものではなく、 ネイティブ ARM64 と x64 の相互運用を可能にする ABI。 ARM64 版 Windows での x86/x64 エミュレーションは、 WOW64 の拡張(および Windows 11 の Prism エミュレータ)が担う。

Q: 64bit DLLは呼び出せる?

A: 結論から言うと、WOW64上の32bitアプリから64bit DLLを直接呼び出すことはできない。

  • WOW64はシステムコールやOS APIを変換するが、アプリコードとDLL間の呼び出しを変換する仕組みはない。
  • プロセス間通信で、64bitブリッジを経由させ、64bit DLLを呼ぶことはできるが非常に手間がかかる。

※ COM の場合は、64bit のアウトプロセス サーバ(EXE)としてなら
プロセス境界をまたいでマーシャリング経由で呼べる(インプロセス DLL は不可)。

プログラム開発

64bitかWOW64(32bit)かを見分ける

.NET

Environment.Is64BitProcess          // プロセスが 64bit か
Environment.Is64BitOperatingSystem  // OS が 64bit か

VC++

IsWow64Process(または IsWow64Process2)API を使用する。

タスクマネージャ等

名前の後ろに *32 とか(32 ビット)とか表示される。

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

リダイレクトされないフォルダ

Program Files のフォルダの場合は少々勝手が違ってきます。

  • .NET では
    • Environment.SpecialFolder.ProgramFiles のようにフォルダ情報を取得すると、
      返ってくるのは %systemdrive%\Program Files (x86) フォルダになります。
    • また、%systemdrive%\Program Files フォルダに対してファイルの作成などを
      おこなってもリダイレクトはされず、そのままそのフォルダに I/O がおこなわれます。
  • VC++ では
    • SHGetFolderPath() / SHGetKnownFolderPath() の挙動を確認する必要がある。

補足: つまり Program Files は「パス取得 API が別のパスを返す」のであって、 System32 のような「I/O が透過的に別フォルダへ差し替えられる」リダイレクトではない。 両者は別の仕組みである点に注意。

リダイレクタが問題になるケース

  • 32bitアプリケーションから64bitコマンドを実行する場合、
    逆に、リダイレクタが問題になる(通常、32bitコマンドを参照するため)。
  • この様なケースでは、
    • %windir%\System32 ディレクトリの代わりに
    • %windir%\Sysnative ディレクトリを指定する。
  • 事例を見ると、シェル・スクリプトで発生することが多い模様。
    (自作アプリだと、自アプリのTarget CPUや、パス環境変数、
    カレント・ディレクトリからの相対パスなどを気にするので)

Sysnative32bitプロセスからのみ見える仮想ディレクトリで、
64bit プロセスから参照しても存在しない。

COM開発・利用

登録

開発したCOMを登録する Regsvr32 にも32bit版・64bit版があります。

64 ビット版は %systemroot%\System32\regsvr32.exe
32 ビット版は %systemroot%\SysWoW64\regsvr32.exe

DCOM

COMの設定を行う dcomcnfg.exe にも32bit版があるもよう。

dcomcnfg.exe /32

COMクライアント

VBS

32ビット版のCScriptコマンドを使ってVBScriptのプログラムを実行するには、
CScriptコマンドを C:\Windows\SysWOW64\CScript.exe と記述します。

Office VBA

  • Office は 64bit OS 上でも 32bit を使用した方が良い(実績的に)。
    64bit の Office を採用する場合は色々調査・検証が必要になる。

補足(最新化): Microsoft 365 Apps は 2019年以降、既定が 64bit に変更された。 したがって「32bit Office 推奨」は現在の既定と逆。 ただし、32bit 決め打ちの ActiveX / アドインを抱えている環境では 依然として 32bit 版を選ぶ判断はありうる (VBA 側は #If Win64PtrSafe / LongPtr での対応が必要)。

ASP

64bit対応(MS_Support64bit.md)を参照。

データプロバイダ

ここでは、32bit用、64bit用データプロバイダに起因する問題をまとめています。
一般的なトピックは ADO.NETデータプロバイダ(MS_ADONETDataProvider.md)を参照下さい。

  • ドライバはWOW64上で動作しないため64bitプラットフォームでは64bit対応
    されたものを使用する必要があるのですが、ODBC、OLEDBドライバなどは所謂ドライバ
    (デバイス・ドライバ、バス・ドライバ、フィルタ・ドライバ)とは異なるため、
    WOW64上でも使用可能ですが、詳細は其々サポート状況の確認が必要です。
  • 各プラットフォーム(32bit or 64bit + 対象データソース)の
    サポートのあるODBC、OLEDBドライバなどが用意されているか確認が必要です。

ODP.NET

組合せ

  • ODP.NETのDLL(Oracle.DataAccess.dll)は32/64bit決め打ちで、AnyCPUになっていないので、
    クライアントプログラムのターゲット(32/64bit)に一致したものをインストールする必要がある。
  • 警告(warning)は、上位プログラムがAnyCPU、下位プログラムが32/64bit決め打ちの場合に出力される。

インストール

  • 64bit環境で、DBMSが同居しており、クライアントがWOW64で32bitの場合、
    Oracleクライアント32bitをインストールする必要がある。
  • マネージドの(Oracleクライアント不要の)ODP.NET を使用すれば簡単かもしれません。

ODBC

Windows 7(64bit) / Office 2010(32bit) 環境での検証結果

  • 64bit の ODBCアドミニストレータ(※1)の[ユーザDSNタブ]でExcel Filesを選択したところ
    エラーとなり、追加ボタンで追加できるドライバーの一覧でも Excel はありませんでしたので、
    この構成の場合32bit のExcel Files ODBC ドライバのみが追加されるもようです。
  • 32bit の ODBCアドミニストレータ(※2)の[ユーザDSN]タブではExcel Files を選択できる。

※1:C:\Windows\System32\odbcad32.exe64bit 版
※2:C:\Windows\SysWOW64\odbcad32.exe32bit 版

※ 両者ともファイル名が odbcad32.exe で紛らわしいが、置かれているフォルダで判断する
リダイレクトの節を参照)。

OLEDB

  • 2008 R2 64bit上で32bit、64bitの両方の Jet OLE DB プロバイダが存在し、
    それぞれ動作したことを確認しています。
  • OLEDBが64bitに対応していない件については、以下の代替のドライバがあり、
    これをインストールしてConnectStringを変更することにより、プログラム変更なく動作しました。
    • Microsoft Access データベース エンジン 再頒布可能コンポーネント
    • ConnectionString プロパティのプロバイダ引数を Microsoft.ACE.OLEDB.12.0 に設定する必要がある。

OO4O

  • OO4O は discontinued で、64bit対応がされていないようです。

その他

コード・アクセス・セキュリティ ポリシーの設定

MS_CodeAccessSecurity.md

こちらにも同様に32bit設定と64bit設定があるようです。
ホストするアプリが32bitの場合、対象アプリが64bitでも、
32bitのコード・アクセス・セキュリティ ポリシー設定を参照するようです。

IE9(32bit) → Excel2010(64bit) → DLL(64bit) といった動作をする場合、
実行するプロセスは 64bit だが、CAS 設定は IE9 から、32bit のものを参照している。

補足(最新化): コード アクセス セキュリティ(CAS)は .NET Framework 4 で非推奨となり、 .NET Core 以降には存在しない(セキュリティ境界としてはプロセス/コンテナを使う)。

参考情報


Tags: Windows, 移行, .NET開発

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally