64-разрядные операционные системы семейства Windows могут исполнять 32-разрядные программы с помощью подсистемы WoW64 (Windows on Windows 64), которая эмулирует 32-битное окружение за счет дополнительной прослойки между 32-битным приложением и 64-битным Windows API.
32-битная программа может узнать, запущена ли она в WoW64, с помощью функции IsWow64Process. Дополнительную информацию о процессоре программа может получить через функцию GetNativeSystemInfo.
Стоит помнить, что функция IsWow64Process включена только в 64-битные версии Windows. Узнать, присутствует ли функция IsWow64Process в системе, и получить к ней доступ, можно при помощи функции GetProcAddress и GetModuleHandle. Пример, демонстрирующий корректное использование функции IsWow64Process (скачать проект):
#include "stdafx.h"
bool IsWow64()
{
BOOL bIsWow64 = FALSE;
typedef BOOL (APIENTRY *LPFN_ISWOW64PROCESS)
(HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
HMODULE module = GetModuleHandle(_T("kernel32"));
const char funcName[] = "IsWow64Process";
fnIsWow64Process = (LPFN_ISWOW64PROCESS)
GetProcAddress(module, funcName);
if(NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),
&bIsWow64))
throw std::exception("Unknown error");
}
return bIsWow64 != FALSE;
}
void main()
{
if (IsWow64())
printf("The process is running under WOW64.\n");
else
printf("The process is not running under WOW64.\n");
printf("\nPress Enter to continue...");
getchar();
}
0