如何确定进程是32位还是64位?

Joh*_*ing 10 c++ windows winapi 32bit-64bit

给定Windows进程句柄,如何使用C++代码确定进程是32位还是64位?

Rem*_*eau 39

如果您有进程句柄,请使用IsWow64Process().

如果IsWow64Process()报告为true,则该进程在64位操作系统上运行32位.

如果IsWow64Process()报告为false(或不存在kernel32.dll),则该进程在32位操作系统上运行32位,或在64位操作系统上运行64位.要知道操作系统本身是32位还是64位,请使用GetNativeSystemInfo()(或者GetSystemInfo()如果GetNativeSystemInfo()不可用kernel32.dll).

  • 这很好,我已经看到了很多答案,如果IsWow64Process为假,并且假设系统是32位,那就忘记检查会发生什么! (4认同)

Naw*_*waz 2

如果您有该模块的句柄,那么您可以执行以下操作:

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
}
Run Code Online (Sandbox Code Playgroud)

我从自己的回答中得到了帮助。

  • 那完全没有意义。由于该函数仅在调用进程中工作,因此您只需尝试确定调用进程是 32 位进程还是 64 位进程。但你编译的时候就知道了。疯狂地运行代码来找出编译时已知的东西。 (11认同)
  • 请注意,ImageNtHeader 的(句柄)与 Windows 进程句柄“不同”!ImageNtHeader 需要一个 HMODULE/HINSTANCE,这与您可能从 OpenProcess 或类似工具获得的 HANDLE 完全不同。 (2认同)