Как я могу определить, является ли процесс 32-битным или 64-битным?

Учитывая дескриптор процесса Windows, как я могу определить, используя код C ++, 32-битный или 64-битный процесс?

7

Решение

Если у вас есть дескриптор модуля, вы можете сделать это:

IMAGE_NT_HEADERS * headers = ImageNtHeader(handle);

if ( headers->FileHeader.Machine == IMAGE_FILE_MACHINE_I386 )
{
//module is x86
}
else if  ( headers->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64 )
{
//module is x64
}

Я получил помощь от мой собственный ответ.

0

Другие решения

Если у вас есть дескриптор процесса, используйте IsWow64Process().

Если IsWow64Process() сообщает true, процесс 32-битный работает на 64-битной ОС.

Если IsWow64Process() сообщает ложь (или не существует в kernel32.dll), то процесс либо выполняется в 32-разрядной ОС на 32-разрядной версии, либо на 64-разрядной ОС — в 64-разрядной. Чтобы узнать, является ли сама ОС 32-битной или 64-битной, используйте GetNativeSystemInfo() (или же GetSystemInfo() если GetNativeSystemInfo() недоступно в kernel32.dll).

36

BOOL IsWow64(HANDLE process)
{
BOOL bIsWow64 = FALSE;

typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process");

if (NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(process, &bIsWow64))
{
//handle error
}
}
return bIsWow64;
}

bool IsX86Process(HANDLE process)
{
SYSTEM_INFO systemInfo = { 0 };
GetNativeSystemInfo(&systemInfo);

// x86 environment
if (systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
return true;

// Check if the process is an x86 process that is running on x64 environment.
// IsWow64 returns true if the process is an x86 process
return IsWow64(process);
}
0