Windows 中的“兼容模式”如何工作?

Windows 中的“兼容模式”如何工作?

如何兼容模式在 Windows 内部工作?

补偿模式

答案1

兼容模式是使用所谓的垫片实现的。有一个很好的TechNet 上的文章描述它们是如何工作的。

Windows 应用程序文件包含一个导入表,该表告知应用程序加载器应用程序需要哪些 DLL 以及从中使用哪些函数。例如,进程可能GetVersionEx在 中引用kernel32.dll。当程序应在兼容模式下运行时,填充程序将放置在应用程序之间,并且填充程序将替换函数GetVersionEx,这样应用程序就不会GetVersionEx从调用kernel32.dll,而是GetVersionEx从 中调用。填充的函数随后将实现以前 Windows 版本的行为。GetVersionEx这是一个简单的示例,每个 Windows 版本都会在 中返回自己的版本号GetVersionEx,因此当伪造旧版 Windows 时,该GetVersionEx函数现在不会返回 Windows 7 版本号,而是返回 Windows XP 版本号等。因此,应用程序将认为它正在 Windows XP 上运行。

Windows 版本之间也有一些其他变化。例如,在旧版本中,如果程序加载了 DLL,则 DLL 的搜索路径也包括当前目录。这是一个安全问题,因此 Windows 的新版本默认不会在当前目录中搜索。使用适当的填充程序,您可以模拟旧行为。

由于垫片只是应用程序和 Windows API 之间的一层,因此垫片只能执行应用程序本身可以执行的操作。垫片不能用于绕过 UAC 或访问受保护的文件等。

如果您想了解更多信息,以下是一些您可能会感兴趣的链接:

微软应用程序兼容性工具包尤其值得一看。此工具可让您概览已知问题的应用程序、所有可用的兼容性修复程序和模式以及每个应用程序应用了哪些修复程序。

答案2

我认为会发生很多不同的事情。一个简单的例子是,一个程序可能会检查你的 Windows 版本,但对新操作系统的返回值感到困惑。因此使用兼容模式会告诉 Windows 报告错误的版本。Raymond Chen 提到了更多的事情: http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590

答案3

我对兼容模式的了解是,它会导致几个 Windows 系统调用对程序撒谎。

一个明显的例子是函数获取版本信息获取版本报告指定的 Windows 版本而不是真实的版本。

当兼容模式下的程序引用系统常用文件夹中的文件时,旧式文件路径也会自动转换。例如,在Windows 7 上运行时C:\Documents and Settings,会转换C:\Users\<user>\Documents 为 XP 兼容模式下的程序。

相关内容