WoW64サブシステムとARM64 ♯4 IsOS()

前回の投稿で、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)」の結果は、以下のようになりました。このテストツールは、このサイトのツールのページで公開しています。

WoW64 Test App (x64) on Windows 11 (x64)
WoW64 Test App (ARM64) on Windows 11 (ARM64)

表にまとめると、以下となります。

x86アプリx64アプリARM32アプリARM64アプリ
32ビットWindows 10
on x64 CPU
false
64ビットWindows 10
on x64 CPU
truefalse
64ビットWindows 11
on x64 CPU
truefalse
64ビットWindows 10
on ARM64 CPU
truetruefalse
64ビットWindows 11
on ARM64 CPU
truefalsetruefalse

このAPIが返す値は、実行中のアプリ プロセスのアーキテクチャに依存する情報なので、同じWindowsであっても、アプリのアーキテクチャーにより異なる値となります。実際に、表の横方向の値は同じ値とはなっていません。

この表を過去の投稿の表と比べると、IsWow64Process()の結果の表と近い値となっていることがわかります。値が異なるのは、「64ビットWindows 10
on ARM64 CPU」の「x86アプリ」と「ARM32アプリ」です。そのため、IsOS(OS_WOW6432)IsWow64Process()は似たような用途のAPIですが等価ではありません。


今回の投稿では、WoW64に関するAPIの中で、確認ができていなかったIsOS(OS_WOW6432)の挙動を確認した結果の説明でした。

コメントを残す