以编程方式检测Windows 7上是否启用了硬件虚拟化

时间:2017-09-27 15:28:55

标签: windows go virtualization

背景

我已经在这一段时间内蹦蹦跳跳了一段时间,仍然无法找到适当的解决方案,希望有人可以指出我正确的方向。

基本上我需要确定我是否可以在目标机器上运行64位VM(在GO中工作但很高兴考虑绑定c代码或某些程序集(虽然我感觉有点不太深入)

为了运行64位虚拟机,系统需要在BIOS中启用并启用硬件虚拟化支持(此时我只关注intel / amd)

到目前为止的旅程

从Windows 8开始,Windows附带Hyper-V,并且有一个很好的功能,您可以从kernel32.dll调用IsProcessorFeaturePresent,其中包含' PF_VIRT_FIRMWARE_ENABLED'这将告诉您是否在固件中启用了硬件虚拟化:

IsProcessorFeaturePresent

现在我真的不喜欢这种行为的方式(如果安装了hyper-v,它表示不可用)但是我可以通过检查是否通过其他方式启用hyper-v来应对它因此这几乎完成了win8的工作向上。

问题是,由于某种原因,此功能在win 7上始终返回false - 即使在我知道已启用硬件虚拟化的系统上也是如此。

从另一个角度来看,我使用这个lib来确定可用的指令集:intel processor feature lib - 这让我知道处理器上有哪些类型的虚拟化指令(如果有的话)

但是我仍然错过了最后一段知道它是否在胜利7中的bios中启用了。我原则上认为它应该很容易从这里开始 - 我应该可以调用一些利用虚拟化扩展和看看它是否按预期响应。但不幸的是,我不知道该怎么做。

有没有人对我如何做到这一点有任何建议?

注意:我很高兴考虑第三方库,但这将用于商业软件,因此许可必须允许(例如微软没有)

1 个答案:

答案 0 :(得分:0)

我担心除非你准备好提供内核驱动程序,否则你将无法达到你想要的效果,因为检查BIOS是否启用了虚拟化需要内核权限。

Intel Software Developer Manual描述了编号为3Ah的模型特定寄存器(MSR),称为IA32_FEATURE_CONTROL。其位1和2控制是否允许在SMX和非SMX模式下使用VMX指令。还有位0,当用1写入时,锁定整个寄存器的值,因此在下一次处理器复位之前无法启用/禁用功能。这意味着,如果BIOS代码已禁用VMX并将其锁定,则稍后启动的操作系统将无法更改该事实,只能查看它。

要读取此MSR或任何其他MSR,应使用机器指令RDMSR,此指令仅在CPL为零时可用,即在OS上下文中。如果尝试从应用程序代码中使用它将引发异常。

除非你找到一个包装RDMSR并将其提供给应用程序的程序接口方法,否则你运气不好。通常,这意味着加载和运行专用内核驱动程序。我知道有一个用于Linux,但不能说是否有任何适用于Windows的内容。

另外请注意,如果您的代码已经在虚拟机中运行,就像某些Windows安装一样,可以为常规桌面启用Hyper-V环境,那么您甚至无法看到实际的主机MSR值。 VMM将为您提供模拟值,并且它将显示您希望您查看的任何CPUID值,而不是来自主机的值。