【问题标题】:Is there a programmatic way to determine which application processor architectures are supported?是否有一种编程方式来确定支持哪些应用处理器架构?
【发布时间】:2021-05-06 08:23:28
【问题描述】:

我正在编写一组理论上可以在x86AMD64ARMARM64 PowerShell 进程中运行的 PowerShell 函数。脚本函数将启动指定的可执行文件,但首先我想检查当前 Windows 安装是否真正支持可执行文件的“机器类型”。

例子:

  • Windows Server 2019 可以删除其 WOW64 兼容层 - 我想在尝试启动 x86 EXE 之前检测 WOW64 不可用
  • 在撰写本文时,基于 ARM64 的 Windows 10 支持 x86、ARM 和 ARM64 可执行文件,但据报道,微软正在通过 WOW 子系统的扩展来支持 AMD64 (x64) 应用程序。因此,在未来的某些 Windows 版本中,基于 ARM64 的 Windows 10 将支持 AMD64 应用程序。

有没有办法确定本机操作系统或其 WOW 子系统是否可以运行给定的可执行文件,而不是硬编码一堆检查?

忽略 PowerShell 语言的细节并使用伪代码,理想的函数应该是这样的:


IsProcessorArchitectureAvailable(strProcessorArchitecture)

  • strProcessorArchitecture 将是“x86”、“AMD64”、“ARM”或“ARM64”
  • 如果使用指定处理器架构的应用程序可以运行,该函数将返回 True,否则返回 False。

有没有办法做到这一点?

【问题讨论】:

  • 如何将Get-CimInstanceCIM_OperatingSystemCIM_Processor 类一起使用?
  • 没错。 Win32_Processor 或 CIM_Processor 或许能帮上忙,(powershell.one/wmi/root/cimv2/win32_processor)
  • @dan Win32_Processor 返回有关系统处理器的一大堆信息。我无法找到有关操作系统执行针对任何给定架构的代码的能力的任何信息。你心目中的属性是什么?
  • 不确定为什么需要这样做?如果可执行文件启动失败,则会报错如216 (ERROR_EXE_MACHINE_TYPE_MISMATCH)。
  • 在我链接的页面上,在标记为架构的部分中,它解释了如何使用一些代码检索系统是否为 x86、MIPS、Alpha、PowerPC、ia64、x64。主要思想是从 Win32_Processor 中检索一个表示其中一种类型的整数值。代码就是Get-CimInstance -ClassName Win32_Processor | Select-Object -ExpandProperty Architecture。该页面上的代码中有一个查找表,您可以使用它来将代码翻译为术语。

标签: windows powershell arm compatibility


【解决方案1】:

IsWow64GuestMachineSupported API 可用于确定 WOW64 是否已关闭:

需要确定 WOW64 是否关闭的应用。例如, 许多应用程序假定 x86-64 系统始终可以执行 x86-32 代码 时代,无处不在。请注意,此功能在 WinPE 或 Xbox,它是服务器中的一个可选组件。

使用此 API,您还可以检查 ARM 架构,请参阅 Image File Machine Constants

还有IsWow64Process2,它返回主机系统的本机架构。

要调用这些 API,您需要使用 PowerShell 中的 C# 进行 P/Invoke。

完整的 C# 示例可以在 here 和 PowerShell 示例 here 中找到。

【讨论】:

  • 这没有回答所提出的问题。它提供了一些信息,基于这些信息,客户可以摸索一个脆弱的实现,有时不会无法回答所提出的问题。对我来说没有像 "robust""reliable" 这样的东西。
  • 我想检测 WOW64 不可用是问题的第一部分(直接回答),第二部分类似于 IsProcessorArchitectureAvailable 伪代码,可以直接使用 IsWow64Process2 完成。我已经提供了 C# 和 PowerShell 示例代码,所以我觉得我已经给出了正确的答案。我很高兴改进答案,但不明白为什么它不可靠或不可靠,所以如果你仍然这么认为,请详细说明@IInspectable
  • 考虑到我缺乏 C# 知识,尤其是缺乏用 C# 编写 Win32 P/Invoke 的能力,你让我成功了 98%。我刚刚向您提交了一份 PR,其中包含一些建议的编辑 (github.com/rweijnen/Posh-Snippets/pull/1),这使代码更符合我的目的。无论如何,我会将您的回复标记为答案。谢谢一百万!
  • PS,@Remko,如果您想要另一个 Win32 到 PowerShell 转换挑战,请在此处查看我的问题:stackoverflow.com/questions/63092396/…。我的答案有效,但它不像使用 Win32 调用那样干净。
猜你喜欢
  • 2019-06-24
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 2020-12-10
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多