我安装了 MinGW 和 MSYS,但从未真正关心过二进制文件是如何工作的。然而,今天我打开了进程探索器并意识到我有一些虚拟化流程:
我知道 make/gcc/sh/mintty 通常适用于 POSIX/unix 类系统,但我认为 MinGW/MSYS 项目会提供本机可执行文件。虚拟化通常是我与虚拟机联系在一起的一个术语,它让我有点困惑。任务管理器实际上将相应的列称为“UAC 虚拟化”。
那么虚拟化Windows 中的标志是什么意思?它是 Vista 之前可执行文件的某种兼容层吗?
答案1
它基本上是一个文件系统和注册表“包装器”,如果用户没有正确的写权限,它会重定向文件写尝试,请参阅有关 UAC 的 Wikipedia 文章,了解更多信息:
在早期版本的 Windows 中,假设用户将以管理员权限运行的应用程序在从受限用户帐户运行时会遇到问题,通常是因为它们试图写入计算机范围或系统目录(例如 Program Files)或注册表项(特别是 HKLM)。UAC 尝试使用文件和注册表虚拟化来缓解此问题,它将写入(以及后续读取)重定向到用户配置文件中每个用户的位置。
例如,如果应用程序尝试写入用户没有写入权限的目录(如“C:\Program Files\appname\settings.ini”),则写入将被重定向到“C:\Users\username\AppData\Local\VirtualStore\Program Files\appname\settings.ini”。重定向功能仅适用于未提升权限的 32 位应用程序,并且仅在它们不包含请求特定权限的清单时才提供。
答案2
Journeyman Geek 解释什么是虚拟化。我将解释 Windows 如何确定是否需要虚拟化。
操作系统会查看应用程序清单文件(或 PE 资源),如果根本找不到清单或没有适当的compatibility
部分 - Windows 会假定该应用程序是“旧的”并启用虚拟化。
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS>
</application>
</compatibility>
PS. 虚拟化适用于注册表(子)键,HKEY_LOCAL_MACHINE
例如HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE
。