[LDR][APPHELP] Add a shim that disables manifest compatibility version parsing

This commit is contained in:
Mark Jansen 2019-08-19 02:33:13 +02:00
parent e12abf63c5
commit 343442cc3f
No known key found for this signature in database
GPG key ID: B39240EE84BEAE8B
4 changed files with 38 additions and 25 deletions

View file

@ -29,7 +29,7 @@ typedef struct _ShimData
} ShimData; } ShimData;
#define SHIMDATA_MAGIC 0xAC0DEDAB #define SHIMDATA_MAGIC 0xAC0DEDAB
#define REACTOS_COMPATVERSION_IGNOREMANIFEST 0xffffffff
C_ASSERT(SHIMDATA_MAGIC == REACTOS_SHIMDATA_MAGIC); C_ASSERT(SHIMDATA_MAGIC == REACTOS_SHIMDATA_MAGIC);
C_ASSERT(sizeof(ShimData) == sizeof(ReactOS_ShimData)); C_ASSERT(sizeof(ShimData) == sizeof(ReactOS_ShimData));
@ -739,6 +739,7 @@ BOOL WINAPI SdbPackAppCompatData(HSDB hsdb, PSDBQUERYRESULT pQueryResult, PVOID*
if (SdbQueryData(hsdb, pQueryResult->atrLayers[n], L"SHIMVERSIONNT", &dwType, &dwValue, &dwValueSize) == ERROR_SUCCESS && if (SdbQueryData(hsdb, pQueryResult->atrLayers[n], L"SHIMVERSIONNT", &dwType, &dwValue, &dwValueSize) == ERROR_SUCCESS &&
dwType == REG_DWORD && dwValueSize == sizeof(dwValue)) dwType == REG_DWORD && dwValueSize == sizeof(dwValue))
{ {
if (dwValue != REACTOS_COMPATVERSION_IGNOREMANIFEST)
dwValue = (dwValue % 100) | ((dwValue / 100) << 8); dwValue = (dwValue % 100) | ((dwValue / 100) << 8);
if (dwValue > pData->dwRosProcessCompatVersion) if (dwValue > pData->dwRosProcessCompatVersion)
pData->dwRosProcessCompatVersion = dwValue; pData->dwRosProcessCompatVersion = dwValue;

View file

@ -1541,9 +1541,17 @@ VOID
NTAPI NTAPI
LdrpInitializeProcessCompat(PVOID* pOldShimData) LdrpInitializeProcessCompat(PVOID* pOldShimData)
{ {
static const GUID* GuidOrder[] = { &COMPAT_GUID_WIN10, &COMPAT_GUID_WIN81, &COMPAT_GUID_WIN8, static const struct
&COMPAT_GUID_WIN7, &COMPAT_GUID_VISTA }; {
static const DWORD GuidVersions[] = { WINVER_WIN10, WINVER_WIN81, WINVER_WIN8, WINVER_WIN7, WINVER_VISTA }; const GUID* Guid;
const DWORD Version;
} KnownCompatGuids[] = {
{ &COMPAT_GUID_WIN10, _WIN32_WINNT_WIN10 },
{ &COMPAT_GUID_WIN81, _WIN32_WINNT_WINBLUE },
{ &COMPAT_GUID_WIN8, _WIN32_WINNT_WIN8 },
{ &COMPAT_GUID_WIN7, _WIN32_WINNT_WIN7 },
{ &COMPAT_GUID_VISTA, _WIN32_WINNT_VISTA },
};
ULONG Buffer[(sizeof(COMPATIBILITY_CONTEXT_ELEMENT) * 10 + sizeof(ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION)) / sizeof(ULONG)]; ULONG Buffer[(sizeof(COMPATIBILITY_CONTEXT_ELEMENT) * 10 + sizeof(ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION)) / sizeof(ULONG)];
ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION* ContextCompatInfo; ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION* ContextCompatInfo;
@ -1552,8 +1560,6 @@ LdrpInitializeProcessCompat(PVOID* pOldShimData)
DWORD n, cur; DWORD n, cur;
ReactOS_ShimData* pShimData = *pOldShimData; ReactOS_ShimData* pShimData = *pOldShimData;
C_ASSERT(RTL_NUMBER_OF(GuidOrder) == RTL_NUMBER_OF(GuidVersions));
if (pShimData) if (pShimData)
{ {
if (pShimData->dwMagic != REACTOS_SHIMDATA_MAGIC || if (pShimData->dwMagic != REACTOS_SHIMDATA_MAGIC ||
@ -1563,8 +1569,15 @@ LdrpInitializeProcessCompat(PVOID* pOldShimData)
return; return;
} }
if (pShimData->dwRosProcessCompatVersion) if (pShimData->dwRosProcessCompatVersion)
{
if (pShimData->dwRosProcessCompatVersion == REACTOS_COMPATVERSION_IGNOREMANIFEST)
{
DPRINT1("LdrpInitializeProcessCompat: ProcessCompatVersion set to ignore manifest\n");
}
else
{ {
DPRINT1("LdrpInitializeProcessCompat: ProcessCompatVersion already set to 0x%x\n", pShimData->dwRosProcessCompatVersion); DPRINT1("LdrpInitializeProcessCompat: ProcessCompatVersion already set to 0x%x\n", pShimData->dwRosProcessCompatVersion);
}
return; return;
} }
} }
@ -1590,12 +1603,12 @@ LdrpInitializeProcessCompat(PVOID* pOldShimData)
return; return;
/* Search for known GUID's, starting from newest to oldest. */ /* Search for known GUID's, starting from newest to oldest. */
for (cur = 0; cur < RTL_NUMBER_OF(GuidOrder); ++cur) for (cur = 0; cur < RTL_NUMBER_OF(KnownCompatGuids); ++cur)
{ {
for (n = 0; n < ContextCompatInfo->ElementCount; ++n) for (n = 0; n < ContextCompatInfo->ElementCount; ++n)
{ {
if (ContextCompatInfo->Elements[n].Type == ACTCX_COMPATIBILITY_ELEMENT_TYPE_OS && if (ContextCompatInfo->Elements[n].Type == ACTCX_COMPATIBILITY_ELEMENT_TYPE_OS &&
RtlCompareMemory(&ContextCompatInfo->Elements[n].Id, GuidOrder[cur], sizeof(GUID)) == sizeof(GUID)) RtlCompareMemory(&ContextCompatInfo->Elements[n].Id, KnownCompatGuids[cur].Guid, sizeof(GUID)) == sizeof(GUID))
{ {
/* If this process did not need shim data before, allocate and store it */ /* If this process did not need shim data before, allocate and store it */
if (pShimData == NULL) if (pShimData == NULL)
@ -1619,8 +1632,8 @@ LdrpInitializeProcessCompat(PVOID* pOldShimData)
} }
/* Store the highest found version, and bail out. */ /* Store the highest found version, and bail out. */
pShimData->dwRosProcessCompatVersion = GuidVersions[cur]; pShimData->dwRosProcessCompatVersion = KnownCompatGuids[cur].Version;
DPRINT1("LdrpInitializeProcessCompat: Found guid for winver 0x%x\n", GuidVersions[cur]); DPRINT1("LdrpInitializeProcessCompat: Found guid for winver 0x%x\n", KnownCompatGuids[cur].Version);
return; return;
} }
} }

View file

@ -233,9 +233,9 @@
<DLLFILE>aclayers.dll</DLLFILE> <DLLFILE>aclayers.dll</DLLFILE>
</SHIM> </SHIM>
<SHIM NAME="HideShimEnv"> <!--<SHIM NAME="HideShimEnv">
<DLLFILE>aclayers.dll</DLLFILE> <DLLFILE>aclayers.dll</DLLFILE>
</SHIM> </SHIM>-->
<FLAG NAME="GetShortPathNameNT4"> <FLAG NAME="GetShortPathNameNT4">
<FLAG_MASK_KERNEL>1</FLAG_MASK_KERNEL> <FLAG_MASK_KERNEL>1</FLAG_MASK_KERNEL>
@ -248,6 +248,10 @@
<!-- Backwards compatibility layers, incomplete! --> <!-- Backwards compatibility layers, incomplete! -->
<LAYER NAME="IgnoreManifestCompatVersion">
<DATA NAME="SHIMVERSIONNT" DATA_DWORD="0xffffffff" /> <!-- REACTOS_COMPATVERSION_IGNOREMANIFEST -->
</LAYER>
<LAYER NAME="WIN95"> <LAYER NAME="WIN95">
<SHIM_REF NAME="Win95VersionLie" /> <SHIM_REF NAME="Win95VersionLie" />
<SHIM_REF NAME="ForceDXSetupSuccess" /> <SHIM_REF NAME="ForceDXSetupSuccess" />

View file

@ -13,21 +13,16 @@ typedef struct _ReactOS_ShimData
#define REACTOS_SHIMDATA_MAGIC 0xAC0DEDAB #define REACTOS_SHIMDATA_MAGIC 0xAC0DEDAB
#define REACTOS_COMPATVERSION_UNINITIALIZED 0xfffffffe
#define REACTOS_COMPATVERSION_IGNOREMANIFEST 0xffffffff
#ifndef WINVER_VISTA // Returns values in the form of _WIN32_WINNT_VISTA, _WIN32_WINNT_WIN7 etc
#define WINVER_VISTA 0x0600
#define WINVER_WIN7 0x0601
#define WINVER_WIN8 0x0602
#define WINVER_WIN81 0x0603
#define WINVER_WIN10 0x0a00
#endif
static static
inline inline
DWORD RosGetProcessCompatVersion(VOID) DWORD RosGetProcessCompatVersion(VOID)
{ {
static DWORD g_CompatVersion = 0xffffffff; static DWORD g_CompatVersion = REACTOS_COMPATVERSION_UNINITIALIZED;
if (g_CompatVersion == 0xffffffff) if (g_CompatVersion == REACTOS_COMPATVERSION_UNINITIALIZED)
{ {
ReactOS_ShimData* pShimData = (ReactOS_ShimData*)NtCurrentPeb()->pShimData; ReactOS_ShimData* pShimData = (ReactOS_ShimData*)NtCurrentPeb()->pShimData;
if (pShimData && pShimData->dwMagic == REACTOS_SHIMDATA_MAGIC && if (pShimData && pShimData->dwMagic == REACTOS_SHIMDATA_MAGIC &&
@ -36,7 +31,7 @@ DWORD RosGetProcessCompatVersion(VOID)
g_CompatVersion = pShimData->dwRosProcessCompatVersion; g_CompatVersion = pShimData->dwRosProcessCompatVersion;
} }
} }
return g_CompatVersion != 0xffffffff ? g_CompatVersion : 0; return g_CompatVersion < REACTOS_COMPATVERSION_UNINITIALIZED ? g_CompatVersion : 0;
} }