WOW64 上で実行されているかどうか確認する方法

32 ビット用にビルドされたプログラムは、WOW64 というサブシステムを利用することで x64 アーキテクチャの Windows で実行させることができます。

WOW64 に関するもう少し詳しい説明は、WOW64 上でのデバッグ 等の資料をみてください。

この資料では、実行中のプログラムが現在 WOW64 上で実行されているかどうか検出する方法について説明します。

IsWow64Process 関数の利用

IsWow64Process 関数を利用することで、あるプロセスが WOW64 上で実行されているかどうか識別することができます。

BOOL WINAPI IsWow64Process(
  __in   HANDLE hProcess,
  __out  PBOOL Wow64Process
);

第一引数はプロセスのハンドル。現在のプロセスのハンドルは GetCurrentProcess 関数で取得できます。

第二引数は __out で、BOOL のポインタを渡します。ここに TRUE または FALSE の結果が返ります。 関数自体の戻り値によって、WOW64 上かどうかの判別をするのではないことに注意してください。

関数自体の戻り値は、関数自体の成功、失敗を示し、チェックする内容は __out 指定のパラメータで返すというパターンです。

ではさっそく、IsWow64Process の利用例を見ましょう。

#include <windows.h>
#include <stdio.h>

void main() {

     BOOL b;
     HANDLE hProc;

     hProc = GetCurrentProcess();

     if( IsWow64Process( hProc, &b ) ) {
          printf( "Is WOW64? %d\n", b );
     }
     else {
          printf(
               "IsWow64Process Failed %u\n",
               GetLastError() );
     }
     
}

ではこれを試しに x64 用にビルドし実行します。

Is WOW64? 0

私の環境は x64 ですから、確かに 0 となります。

また x86 用にビルドして実行すると、次のようになりました。

Is WOW64? 1

確かに WOW64 上で実行されたことが確認できました。

尚、Windows SDK で x86/x64 等のビルドを切り替える方法については、 私が発行しているメルマガ 「徹底解説!C/C++ による Windows プログラミング入門」 のバックナンバー 「第35回 Windows SDK を用いた x86 と x64 用のビルドの作り方」などをご覧ください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説