前回の投稿で、WoW64に関するAPIはすべて調べたと考えていたのですが、漏れがりました。今回は、漏れいていたAPIの振る舞いを確認します。
以前から11で追加されたアプリの実行環境情報取得に関するAPI
このサイトで公開している テストツール(WoW64Test) は、エミュレーション環境に関するAPIの振る舞いを確認するためのツールです。
このツールでは、以下のAPIの挙動を確認できます。
- GetSystemInfo()
- GetNativeSystemInfo()
- IsWow64Process()
- IsWow64Process2()
- IsWow64GuestMachineSupported()
- GetMachineTypeAttributes()
これで関連するAPIはすべてかと考えていたのですが、漏れがありました。
IsOS()というAPIです。このAPIの引数に指定できる値としてOS_WOW6432がありました。
IsOS()
APIリファレンスを引用すると、IsOS() APIの概要として以下のように書かれています。
Checks for specified operating systems and operating system features.
日本語訳は以下の感じです。
指定されたオペレーティングシステムおよびオペレーティングシステムの機能をチェックします。
この説明だけだと、WoW64に関する情報が取得できるかどうかわかりません。
OSの情報を取得することができるAPIです。
BOOL IsOS(_In_ DWORD dwOS);
第一引数にどのオペレーティングシステムまたはオペレーティングシステム機能を調べるかを指定する値を指定すると、有無の情報が取得できます。
指定できる値は、Shlwapi.h
に定義されているのですが、抜粋すると以下の通りです。
// Returns TRUE/FALSE depending on question
#define OS_WINDOWS 0 // Windows 9x vs. NT
#define OS_NT 1 // Windows 9x vs. NT
#define OS_WIN95ORGREATER 2 // Win95 or greater
#define OS_NT4ORGREATER 3 // NT4 or greater
#define OS_WIN98ORGREATER 5 // Win98 or greater
#define OS_WIN98_GOLD 6 // Win98 Gold (Version 4.10 build 1998)
#define OS_WIN2000ORGREATER 7 // Some derivative of Win2000
// NOTE: these flags check explicitly for (dwMajorVersion == 5)
#define OS_WIN2000PRO 8 // Windows 2000 Professional (Workstation)
#define OS_WIN2000SERVER 9 // Windows 2000 Server
#define OS_WIN2000ADVSERVER 10 // Windows 2000 Advanced Server
#define OS_WIN2000DATACENTER 11 // Windows 2000 Data Center Server
#define OS_WIN2000TERMINAL 12 // Windows 2000 Terminal Server in "Application Server" mode (now simply called "Terminal Server")
#define OS_EMBEDDED 13 // Embedded Windows Edition
#define OS_TERMINALCLIENT 14 // Windows Terminal Client (eg user is comming in via tsclient)
#define OS_TERMINALREMOTEADMIN 15 // Terminal Server in "Remote Administration" mode
#define OS_WIN95_GOLD 16 // Windows 95 Gold (Version 4.0 Build 1995)
#define OS_MEORGREATER 17 // Windows Millennium (Version 5.0)
#define OS_XPORGREATER 18 // Windows XP or greater
#define OS_HOME 19 // Home Edition (eg NOT Professional, Server, Advanced Server, or Datacenter)
#define OS_PROFESSIONAL 20 // Professional (aka Workstation; eg NOT Server, Advanced Server, or Datacenter)
#define OS_DATACENTER 21 // Datacenter (eg NOT Server, Advanced Server, Professional, or Personal)
#define OS_ADVSERVER 22 // Advanced Server (eg NOT Datacenter, Server, Professional, or Personal)
#define OS_SERVER 23 // Server (eg NOT Datacenter, Advanced Server, Professional, or Personal)
#define OS_TERMINALSERVER 24 // Terminal Server - server running in what used to be called "Application Server" mode (now simply called "Terminal Server")
#define OS_PERSONALTERMINALSERVER 25 // Personal Terminal Server - per/pro machine running in single user TS mode
#define OS_FASTUSERSWITCHING 26 // Fast User Switching
#define OS_WELCOMELOGONUI 27 // New friendly logon UI
#define OS_DOMAINMEMBER 28 // Is this machine a member of a domain (eg NOT a workgroup)
#define OS_ANYSERVER 29 // is this machine any type of server? (eg datacenter or advanced server or server)?
#define OS_WOW6432 30 // Is this process a 32-bit process running on an 64-bit platform?
#define OS_WEBSERVER 31 // Web Edition Server
#define OS_SMALLBUSINESSSERVER 32 // SBS Server
#define OS_TABLETPC 33 // Are we running on a TabletPC?
#define OS_SERVERADMINUI 34 // Should defaults lean towards those preferred by server administrators?
#define OS_MEDIACENTER 35 // eHome Freestyle Project
#define OS_APPLIANCE 36 // Windows .NET Appliance Server
OS_WOW6432
という定義値が、WoW64に関する情報を取得できるもののようです。
今回は、IsOS(OS_WOW6432)
の挙動を確認します。
では、実際の実行結果を確認します。IsOS()
にも対応したテストアプリである「WoW64 Test App 1.2.0 (WoW64のテスト用アプリ 1.2.0)」の結果は、以下のようになりました。このテストツールは、このサイトのツールのページで公開しています。
表にまとめると、以下となります。
x86アプリ | x64アプリ | ARM32アプリ | ARM64アプリ | |
---|---|---|---|---|
32ビットWindows 10 on x64 CPU | false | – | – | – |
64ビットWindows 10 on x64 CPU | true | false | – | – |
64ビットWindows 11 on x64 CPU | true | false | – | – |
64ビットWindows 10 on ARM64 CPU | true | – | true | false |
64ビットWindows 11 on ARM64 CPU | true | false | true | false |
このAPIが返す値は、実行中のアプリ プロセスのアーキテクチャに依存する情報なので、同じWindowsであっても、アプリのアーキテクチャーにより異なる値となります。実際に、表の横方向の値は同じ値とはなっていません。
この表を過去の投稿の表と比べると、IsWow64Process()
の結果の表と近い値となっていることがわかります。値が異なるのは、「64ビットWindows 10
on ARM64 CPU」の「x86アプリ」と「ARM32アプリ」です。そのため、IsOS(OS_WOW6432)
はIsWow64Process()
は似たような用途のAPIですが等価ではありません。
今回の投稿では、WoW64に関するAPIの中で、確認ができていなかったIsOS(
の挙動を確認した結果の説明でした。OS_WOW6432
)