From: <sv...@op...> - 2024-11-08 12:39:15
|
Author: manx Date: Fri Nov 8 13:39:02 2024 New Revision: 22109 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22109 Log: [Fix] mptOS: Use documented are more reliable method to detect host architecture as ARM64 in case of emulated AMD64 process, especially for ARM64EC. Modified: trunk/OpenMPT/misc/mptOS.cpp Modified: trunk/OpenMPT/misc/mptOS.cpp ============================================================================== --- trunk/OpenMPT/misc/mptOS.cpp Thu Nov 7 23:53:57 2024 (r22108) +++ trunk/OpenMPT/misc/mptOS.cpp Fri Nov 8 13:39:02 2024 (r22109) @@ -14,6 +14,7 @@ #include "mpt/binary/hex.hpp" #include "mpt/format/join.hpp" #include "mpt/library/library.hpp" +#include "mpt/osinfo/windows_version.hpp" #include "mpt/parse/split.hpp" #include "mpt/path/native_path.hpp" @@ -197,6 +198,44 @@ }; +struct MachineArchitecture +{ + USHORT ImageFileMachine; + Architecture Host; +}; +static constexpr MachineArchitecture machinearchitectures [] = { + { IMAGE_FILE_MACHINE_I386 , Architecture::x86 }, + { IMAGE_FILE_MACHINE_R3000 , Architecture::mips }, + { IMAGE_FILE_MACHINE_R4000 , Architecture::mips }, + { IMAGE_FILE_MACHINE_R10000 , Architecture::mips }, + { IMAGE_FILE_MACHINE_WCEMIPSV2 , Architecture::mips }, + { IMAGE_FILE_MACHINE_ALPHA , Architecture::alpha }, + { IMAGE_FILE_MACHINE_SH3 , Architecture::shx }, + { IMAGE_FILE_MACHINE_SH3DSP , Architecture::shx }, + { IMAGE_FILE_MACHINE_SH3E , Architecture::shx }, + { IMAGE_FILE_MACHINE_SH4 , Architecture::shx }, + { IMAGE_FILE_MACHINE_SH5 , Architecture::shx }, + { IMAGE_FILE_MACHINE_ARM , Architecture::arm }, + { IMAGE_FILE_MACHINE_THUMB , Architecture::arm }, + { IMAGE_FILE_MACHINE_ARMNT , Architecture::arm }, + { IMAGE_FILE_MACHINE_AM33 , Architecture::unknown }, + { IMAGE_FILE_MACHINE_POWERPC , Architecture::ppc }, + { IMAGE_FILE_MACHINE_POWERPCFP , Architecture::ppc }, + { IMAGE_FILE_MACHINE_MIPS16 , Architecture::unknown }, + { IMAGE_FILE_MACHINE_ALPHA64 , Architecture::alpha64 }, + { IMAGE_FILE_MACHINE_MIPSFPU , Architecture::mips }, + { IMAGE_FILE_MACHINE_MIPSFPU16 , Architecture::unknown }, + { IMAGE_FILE_MACHINE_AXP64 , Architecture::alpha64 }, + { IMAGE_FILE_MACHINE_TRICORE , Architecture::unknown }, + { IMAGE_FILE_MACHINE_CEF , Architecture::unknown }, + { IMAGE_FILE_MACHINE_EBC , Architecture::unknown }, + { IMAGE_FILE_MACHINE_AMD64 , Architecture::amd64 }, + { IMAGE_FILE_MACHINE_M32R , Architecture::unknown }, + { IMAGE_FILE_MACHINE_ARM64 , Architecture::arm64 }, + { IMAGE_FILE_MACHINE_CEE , Architecture::unknown } +}; + + struct HostArchitecture { Architecture Host; @@ -272,6 +311,32 @@ Architecture GetHostArchitecture() noexcept { SYSTEM_INFO systemInfo = {}; + mpt::osinfo::windows::Version WindowsVersion = mpt::osinfo::windows::Version::Current(); + if(WindowsVersion.IsAtLeast(mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 16299, 0))) { + std::optional<mpt::library> kernel32{mpt::library::load({ mpt::library::path_search::system, mpt::library::path_prefix::none, MPT_NATIVE_PATH("kernel32.dll"), mpt::library::path_suffix::none })}; + if(kernel32.has_value()) + { + BOOL (WINAPI * fIsWow64Process2)(HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine) = NULL; + if(kernel32->bind(fIsWow64Process2, "IsWow64Process2")) + { + USHORT ProcessMachine = 0; + USHORT NativeMachine = 0; + if(fIsWow64Process2(GetCurrentProcess(), &ProcessMachine, &NativeMachine) != FALSE) + { + for(const auto &arch : machinearchitectures) + { + if(NativeMachine == arch.ImageFileMachine) + { + if(arch.Host != Architecture::unknown) + { + return arch.Host; + } + } + } + } + } + } + } GetNativeSystemInfo(&systemInfo); for(const auto &arch : architectures) { |