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 用のビルドの作り方」などをご覧ください。