MS_WOW64 - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

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や、パス環境倉数、
    カレント・ディレクトリからの盞察パスなどを気にするので

※ Sysnative は32bitプロセスからのみ芋える仮想ディレクトリで、
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 Win64 ず PtrSafe / LongPtr での察応が必芁。

ASP

64bit察応を参照。

デヌタプロバむダ

ここでは、32bit甚、64bit甚デヌタプロバむダに起因する問題をたずめおいたす。
䞀般的なトピックは ADO.NETデヌタプロバむダを参照䞋さい。

  • ドラむバは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.exe64bit 版
※2C:\Windows\SysWOW64\odbcad32.exe32bit 版

※ 䞡者ずもファむル名が 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察応がされおいないようです。

その他

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

コヌド・アクセス・セキュリティ

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

IE9(32bit) → Excel2010(64bit) → DLL(64bit) ずいった動䜜をする堎合、
実行するプロセスは 64bit だが、CAS 蚭定は IE9 から、32bit のものを参照しおいる。

補足最新化: コヌド アクセス セキュリティCASは .NET Framework 4 で非掚奚ずなり、 .NET Core 以降には存圚しないセキュリティ境界ずしおはプロセスコンテナを䜿う。

参考情報


Tags: Windows, 移行, .NET開発

⚠ **GitHub.com Fallback** ⚠