Answers:
兼容模式是使用所谓的垫片来实现的。TechNet上有一篇很好的文章介绍了这些方法的工作原理。
Windows应用程序文件包含一个导入表,该表告诉应用程序加载程序应用程序需要哪些DLL,以及从文件中使用哪些功能。进程可能例如参考GetVersionEx
的kernel32.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应用程序兼容性工具包值得一看。该工具为您提供了已知问题的应用程序的概述,所有可用的兼容性修补程序和模式,以及哪些修补程序适用于每个应用程序。
我认为发生了很多不同的事情。一个简单的例子是程序可能会检查您的Windows版本,但是会因为新操作系统的返回值而感到困惑。因此,使用兼容模式会告诉Windows报告错误的版本。Raymond Chen提到了更多内容:http : //blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590
我对兼容模式的了解是,它会导致对该程序说谎多个Windows系统调用。
一个明显的例子是函数GetVersionEx和GetVersion,它们报告指定的Windows版本而不是实际的Windows版本。
当兼容模式下的程序引用众所周知的系统文件夹中的文件时,旧式文件路径也会自动转换。例如C:\Documents and Settings
,C:\Users\<user>\Documents
当在Windows 7上运行时,将以XP兼容模式转换为程序。
这篇文章很好地解释了它。
http://arstechnica.com/information-technology/2010/01/windows-xp-mode/
但是,对于Windows 7,Redmond提供了解决该问题的方法:Windows XP模式。Windows XP模式使用虚拟化技术,使运行在Windows XP虚拟副本上的应用程序显示在Windows 7“开始”菜单和Windows 7桌面上。