TLDR IsWow64Process2()
使え。
WowA64ではIsWow64Process()
やGetNativeSystemInfo()
を使うとx86版Windowsと誤認するようになっている。
バグではなく意図的な仕様と考えられる。(理由考察は省略)
しかしそれらのAPIで得られる値やIsWow64Process2()
以外のAPIでも一部の挙動がx86版Windowsと違う。
AMD64 | x86 | Arm64 | |||
---|---|---|---|---|---|
IsWow64Process() | *Wow64Process | TRUE | 0 | 0 | |
GetSystemInfo() | wProcessorArchitecture | PROCESSOR_ARCHITECTURE_INTEL | PROCESSOR_ARCHITECTURE_INTEL | PROCESSOR_ARCHITECTURE_INTEL | |
lpMaximumApplicationAddress | /LARGEADDRESSAWARE:NO | 0x7FFEFFFF | 0x7FFEFFFF | 0x7FFEFFFF | |
/LARGEADDRESSAWARE | 0xFFFEFFFF | 0xBFFEFFFF | 0xFFFEFFFF | ||
GetNativeSystemInfo() | wProcessorArchitecture | PROCESSOR_ARCHITECTURE_AMD64 | PROCESSOR_ARCHITECTURE_INTEL | PROCESSOR_ARCHITECTURE_INTEL | |
lpMaximumApplicationAddress | /LARGEADDRESSAWARE:NO | 0xFFFEFFFF | 0x7FFEFFFF | 0x7FFEFFFF | |
/LARGEADDRESSAWARE | 0xFFFEFFFF | 0xBFFEFFFF | 0xFFFEFFFF | ||
IsOS(OS_WOW6432) | TRUE | 0 | TRUE | ||
IsWow64Process2() | *pNativeMachine | IMAGE_FILE_MACHINE_AMD64 | IMAGE_FILE_MACHINE_I386 | IMAGE_FILE_MACHINE_ARM64 |
よって
- wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL && lpMaximumApplicationAddress >= 0xC0000000 && /LARGEADDRESSAWARE
- wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL && IsOS(OS_WOW6432)
のどちらかを満たす場合今現在はARM64上のWoW64ということになる。