问题描述
我正在编写一组 PowerShell 函数,理论上可以在 x86
、AMD64
、ARM
或 ARM64
PowerShell 进程中运行。脚本函数将启动指定的可执行文件,但首先我想检查当前 Windows 安装是否实际支持该可执行文件的“机器类型”。
示例:
- Windows Server 2019 可以删除其 WOW64 兼容层 - 我想在尝试启动 x86 EXE 之前检测 WOW64 不可用
- 在撰写本文时,基于 ARM64 的 Windows 10 支持 x86、ARM 和 ARM64 可执行文件,但据报道,Microsoft 正在通过 WOW 子系统的扩展来支持 AMD64 (x64) 应用程序。因此,在未来的某些 Windows 版本中,基于 ARM64 的 Windows 10 将支持 AMD64 应用程序。
有没有办法确定原生操作系统或其 WOW 子系统是否可以运行给定的可执行文件,而不是硬编码一堆检查?
忽略 PowerShell 语言的细节并使用伪代码,理想的函数应该是这样的:
IsProcessorArchitectureAvailable(strProcessorArchitecture)
- strProcessorArchitecture 将是“x86”、“AMD64”、“ARM”或“ARM64”
- 如果使用指定处理器架构的应用程序可以运行,该函数将返回 True,否则返回 False。
有没有办法做到这一点?
解决方法
IsWow64GuestMachineSupported API 可用于确定 WOW64 是否已关闭:
需要确定 WOW64 是否关闭的应用。例如, 许多应用程序假设 x86-64 系统始终可以执行 x86-32 代码 时代,无处不在。请注意,WinPE 上不存在此功能或 Xbox,它是服务器中的可选组件。
使用此 API,您还可以检查 ARM 架构,请参阅 Image File Machine Constants。
还有 IsWow64Process2 返回主机系统的本机架构。
要调用这些 API,您需要在 PowerShell 中使用 C# 进行 P/Invoke。