清单的supportedOS设置实际上在幕后做了什么?

我找不到太多的文档,但最近我不得不运行Windows Server 2012 R2平台就绪testing工具来validation一些MSVC ++和C#产品(.exe的,服务,库,DLL等),我碰到一些错误消息受支持的OS设置在某些项目清单中不可用。

我修复了这些错误,但是我不禁想知道在后台实际上supportOS的设置是什么。 例如,假设我将所有项目的受支持的操作系统设置设置为Windows 8.1,那么,如果在Windows 8或Windows 7上运行这些产品,即使已知这些产品在这些操作系统上正常运行,它们是否会启动错误?

我在supportOS上find的最多的是这样的东西: http : //msdn.microsoft.com/en-us/library/windows/desktop/dn302074(v=vs.85).aspx

Windows读取supportedOS值的伪代码可能如下所示:

double compatVer = 4.0; // Win95 if (hasW10guid && _WIN_VER >= 0xa00) compatVer = 10.0; else if (hasW81guid && _WIN_VER >= 0x603) compatVer = 6.3; else if (hasW8guid && _WIN_VER >= 0x602) compatVer = 6.2; else if (hasW7guid && _WIN_VER >= 0x601) compatVer = 6.1; else if (hasWVistaguid && _WIN_VER >= 0x601) compatVer = 6.0; // Application wants Vista compatibility on Win7+ else if (hasRequestedExecutionLevel) compatVer = 6.0; // UAC compatible 

compatVer存储在进程内部的某处,可能在PEB中 。

compatVer与某些函数中的真实Windows版本进行比较,以启用新功能或更改其行为,以便与应用程序的Windows版本兼容。 有些行为更改记录在MSDN上的兼容性菜谱中。

由于supportedOS值是GUID,所以他们不可能猜到,因此开发人员不能声称支持尚未发布的Windows版本。 因此,在Windows 7上运行应用程序时,Windows 8 GUID将不起作用。

存在一个风险,即您的应用程序具有隐藏兼容性行为的缺陷,并且可能通过添加supportedOS值来暴露。