如何兼容模式在 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 或访问受保护的文件等。
如果您想了解更多信息,以下是一些您可能会感兴趣的链接:
- 使用 CorrectFilePaths Shim 在 Windows Vista 上重定向文件
- 创建应用程序兼容性垫片与Microsoft 应用程序兼容性工具包
- 有关填充程序内部基础知识的 MSDN 博客
微软应用程序兼容性工具包尤其值得一看。此工具可让您概览已知问题的应用程序、所有可用的兼容性修复程序和模式以及每个应用程序应用了哪些修复程序。
答案2
我认为会发生很多不同的事情。一个简单的例子是,一个程序可能会检查你的 Windows 版本,但对新操作系统的返回值感到困惑。因此使用兼容模式会告诉 Windows 报告错误的版本。Raymond Chen 提到了更多的事情: http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590