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


Answers:


31

兼容模式是使用所谓的垫片来实现的。TechNet上有一篇很好的文章介绍了这些方法的工作原理。

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

从Windows版本到Windows版本也进行了其他一些更改。例如,在较旧的版本中,如果程序加载了DLL,则DLL的搜索路径也将包含当前目录。这是一个安全问题,因此默认情况下,较新版本的Windows不会在当前目录中搜索。使用适当的垫片,您可以模拟旧的行为。

由于垫片只是应用程序和Windows API之间的一层,因此垫片就可以完成应用程序自己可以做的事情。填充程序不能用于例如规避UAC或访问受保护的文件。

如果您想了解更多信息,以下是一些有趣的链接:

特别是Microsoft应用程序兼容性工具包值得一看。该工具为您提供了已知问题的应用程序的概述,所有可用的兼容性修补程序和模式,以及哪些修补程序适用于每个应用程序。


1
您已经通过具体示例成功满足了我的好奇心。谢谢!
羽衣甘蓝穆斯卡雷利亚


4

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

一个明显的例子是函数GetVersionExGetVersion,它们报告指定的Windows版本而不是实际的Windows版本。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.