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ということになる。