Wer*_*nze 37
使用所谓的垫片来实现兼容模式。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 不在当前目录中搜索。使用适当的垫片,您可以模拟旧的行为。
由于 shim 只是应用程序和 Windows API 之间的一个层,因此 shim 可以做应用程序自己可以做的事情。例如,垫片不能用于规避 UAC 或访问受保护的文件。
如果您想了解更多信息,这里有一些您可能会感兴趣的链接:
尤其是 Microsoft Application Compatibility Toolkit 值得一看。此工具可让您概览存在已知问题的应用程序、所有可用的兼容性修补程序和模式以及应用于每个应用程序的修补程序。
我认为会发生很多不同的事情。一个简单的例子是,程序可能会检查您的 Windows 版本,但会被新操作系统的返回值弄糊涂。所以使用兼容模式会告诉 windows 报告错误的版本。Raymond Chen 还提到了一些事情:http : //blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590
归档时间: |
|
查看次数: |
30003 次 |
最近记录: |