Reactos

[NTDLL] Check the process manifest at startup for a compatibility section.

+149 -5
+9 -3
dll/appcompat/apphelp/hsdb.c
··· 12 12 #include "ntndk.h" 13 13 #include "strsafe.h" 14 14 #include "apphelp.h" 15 - 15 + #include "compat_undoc.h" 16 16 17 17 #define MAX_LAYER_LENGTH 256 18 18 #define GPLK_USER 1 ··· 25 25 DWORD dwMagic; 26 26 SDBQUERYRESULT Query; 27 27 WCHAR szLayer[MAX_LAYER_LENGTH]; 28 - DWORD unknown; // 0x14c 28 + DWORD dwRosProcessCompatVersion; // ReactOS specific 29 29 } ShimData; 30 30 31 31 #define SHIMDATA_MAGIC 0xAC0DEDAB 32 + 33 + 34 + C_ASSERT(SHIMDATA_MAGIC == REACTOS_SHIMDATA_MAGIC); 35 + C_ASSERT(sizeof(ShimData) == sizeof(ReactOS_ShimData)); 36 + C_ASSERT(offsetof(ShimData, dwMagic) == offsetof(ReactOS_ShimData, dwMagic)); 37 + C_ASSERT(offsetof(ShimData, dwRosProcessCompatVersion) == offsetof(ReactOS_ShimData, dwRosProcessCompatVersion)); 32 38 33 39 34 40 static BOOL WINAPI SdbpFileExists(LPCWSTR path) ··· 706 712 pData->dwSize = sizeof(*pData); 707 713 pData->dwMagic = SHIMDATA_MAGIC; 708 714 pData->Query = *pQueryResult; 709 - pData->unknown = 0; 715 + pData->dwRosProcessCompatVersion = 0; 710 716 pData->szLayer[0] = UNICODE_NULL; /* TODO */ 711 717 712 718 SHIM_INFO("\ndwFlags 0x%x\ndwMagic 0x%x\ntrExe 0x%x\ntrLayer 0x%x\n",
+84 -2
dll/ntdll/ldr/ldrinit.c
··· 10 10 /* INCLUDES *****************************************************************/ 11 11 12 12 #include <ntdll.h> 13 + #include <compat_undoc.h> 14 + #include <compatguid_undoc.h> 13 15 14 16 #define NDEBUG 15 17 #include <debug.h> ··· 1455 1457 UNIMPLEMENTED; 1456 1458 } 1457 1459 1460 + VOID 1461 + NTAPI 1462 + LdrpInitializeProcessCompat(PVOID* pOldShimData) 1463 + { 1464 + static const GUID* GuidOrder[] = { &COMPAT_GUID_WIN10, &COMPAT_GUID_WIN81, &COMPAT_GUID_WIN8, 1465 + &COMPAT_GUID_WIN7, &COMPAT_GUID_VISTA }; 1466 + static const DWORD GuidVersions[] = { WINVER_WIN10, WINVER_WIN81, WINVER_WIN8, WINVER_WIN7, WINVER_VISTA }; 1467 + 1468 + ULONG Buffer[(sizeof(COMPATIBILITY_CONTEXT_ELEMENT) * 10 + sizeof(ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION)) / sizeof(ULONG)]; 1469 + ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION* ContextCompatInfo; 1470 + SIZE_T SizeRequired; 1471 + NTSTATUS Status; 1472 + DWORD n, cur; 1473 + 1474 + C_ASSERT(RTL_NUMBER_OF(GuidOrder) == RTL_NUMBER_OF(GuidVersions)); 1475 + 1476 + SizeRequired = sizeof(Buffer); 1477 + Status = RtlQueryInformationActivationContext(RTL_QUERY_ACTIVATION_CONTEXT_FLAG_NO_ADDREF, 1478 + NULL, 1479 + NULL, 1480 + CompatibilityInformationInActivationContext, 1481 + Buffer, 1482 + sizeof(Buffer), 1483 + &SizeRequired); 1484 + 1485 + if (!NT_SUCCESS(Status)) 1486 + { 1487 + DPRINT1("LdrpInitializeProcessCompat: Unable to query process actctx with status %x\n", Status); 1488 + return; 1489 + } 1490 + 1491 + ContextCompatInfo = (ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION*)Buffer; 1492 + /* No Compatibility elements present, bail out */ 1493 + if (ContextCompatInfo->ElementCount == 0) 1494 + return; 1495 + 1496 + /* Search for known GUID's, starting from newest to oldest. */ 1497 + for (cur = 0; cur < RTL_NUMBER_OF(GuidOrder); ++cur) 1498 + { 1499 + for (n = 0; n < ContextCompatInfo->ElementCount; ++n) 1500 + { 1501 + if (ContextCompatInfo->Elements[n].Type == ACTCX_COMPATIBILITY_ELEMENT_TYPE_OS && 1502 + RtlCompareMemory(&ContextCompatInfo->Elements[n].Id, GuidOrder[cur], sizeof(GUID)) == sizeof(GUID)) 1503 + { 1504 + ReactOS_ShimData* pShimData = *pOldShimData; 1505 + 1506 + /* If this process did not need shim data before, allocate and store it */ 1507 + if (pShimData == NULL) 1508 + { 1509 + PPEB Peb = NtCurrentPeb(); 1510 + 1511 + ASSERT(Peb->pShimData == NULL); 1512 + pShimData = RtlAllocateHeap(Peb->ProcessHeap, HEAP_ZERO_MEMORY, sizeof(*pShimData)); 1513 + 1514 + if (!pShimData) 1515 + { 1516 + DPRINT1("LdrpInitializeProcessCompat: Unable to allocated %u bytes\n", sizeof(*pShimData)); 1517 + return; 1518 + } 1519 + 1520 + pShimData->dwSize = sizeof(*pShimData); 1521 + pShimData->dwMagic = REACTOS_SHIMDATA_MAGIC; 1522 + 1523 + Peb->pShimData = pShimData; 1524 + *pOldShimData = pShimData; 1525 + } 1526 + 1527 + /* Store the highest found version, and bail out. */ 1528 + pShimData->dwRosProcessCompatVersion = GuidVersions[cur]; 1529 + DPRINT1("LdrpInitializeProcessCompat: Found guid for winver 0x%x\n", GuidVersions[cur]); 1530 + return; 1531 + } 1532 + } 1533 + } 1534 + } 1535 + 1536 + 1458 1537 NTSTATUS 1459 1538 NTAPI 1460 1539 LdrpInitializeProcess(IN PCONTEXT Context, ··· 1542 1621 /* Save the old Shim Data */ 1543 1622 OldShimData = Peb->pShimData; 1544 1623 1545 - /* Clear it */ 1546 - Peb->pShimData = NULL; 1624 + /* ReactOS specific: do not clear it. (Windows starts doing the same in later versions) */ 1625 + //Peb->pShimData = NULL; 1547 1626 1548 1627 /* Save the number of processors and CS Timeout */ 1549 1628 LdrpNumberOfProcessors = Peb->NumberOfProcessors; ··· 1933 2012 1934 2013 /* Initialize Wine's active context implementation for the current process */ 1935 2014 actctx_init(); 2015 + 2016 + /* ReactOS specific */ 2017 + LdrpInitializeProcessCompat(&OldShimData); 1936 2018 1937 2019 /* Set the current directory */ 1938 2020 Status = RtlSetCurrentDirectory_U(&CurrentDirectory);
+43
sdk/include/reactos/compat_undoc.h
··· 1 + #ifndef COMPAT_UNDOC_H 2 + #define COMPAT_UNDOC_H 3 + 4 + 5 + typedef struct _ReactOS_ShimData 6 + { 7 + DWORD dwReserved1[130]; 8 + DWORD dwSize; 9 + DWORD dwMagic; 10 + DWORD dwReserved2[242]; 11 + DWORD dwRosProcessCompatVersion; 12 + } ReactOS_ShimData; 13 + 14 + 15 + #define REACTOS_SHIMDATA_MAGIC 0xAC0DEDAB 16 + 17 + #ifndef WINVER_VISTA 18 + #define WINVER_VISTA 0x0600 19 + #define WINVER_WIN7 0x0601 20 + #define WINVER_WIN8 0x0602 21 + #define WINVER_WIN81 0x0603 22 + #define WINVER_WIN10 0x0a00 23 + #endif 24 + 25 + static 26 + inline 27 + DWORD RosGetProcessCompatVersion(VOID) 28 + { 29 + static DWORD g_CompatVersion = 0xffffffff; 30 + if (g_CompatVersion == 0xffffffff) 31 + { 32 + ReactOS_ShimData* pShimData = (ReactOS_ShimData*)NtCurrentPeb()->pShimData; 33 + if (pShimData && pShimData->dwMagic == REACTOS_SHIMDATA_MAGIC && 34 + pShimData->dwSize == sizeof(ReactOS_ShimData)) 35 + { 36 + g_CompatVersion = pShimData->dwRosProcessCompatVersion; 37 + } 38 + } 39 + return g_CompatVersion != 0xffffffff ? g_CompatVersion : 0; 40 + } 41 + 42 + 43 + #endif // COMPAT_UNDOC_H
+12
sdk/include/reactos/compatguid_undoc.h
··· 1 + #ifndef COMPATGUID_UNDOC_H 2 + #define COMPATGUID_UNDOC_H 3 + 4 + 5 + DEFINE_GUID(COMPAT_GUID_VISTA, 0xe2011457, 0x1546, 0x43c5, 0xa5, 0xfe, 0x00, 0x8d, 0xee, 0xe3, 0xd3, 0xf0); 6 + DEFINE_GUID(COMPAT_GUID_WIN7, 0x35138b9a, 0x5d96, 0x4fbd, 0x8e, 0x2d, 0xa2, 0x44, 0x02, 0x25, 0xf9, 0x3a); 7 + DEFINE_GUID(COMPAT_GUID_WIN8, 0x4a2f28e3, 0x53b9, 0x4441, 0xba, 0x9c, 0xd6, 0x9d, 0x4a, 0x4a, 0x6e, 0x38); 8 + DEFINE_GUID(COMPAT_GUID_WIN81, 0x1f676c76, 0x80e1, 0x4239, 0x95, 0xbb, 0x83, 0xd0, 0xf6, 0xd0, 0xda, 0x78); 9 + DEFINE_GUID(COMPAT_GUID_WIN10, 0x8e0f7a12, 0xbfb3, 0x4fe8, 0xb9, 0xa5, 0x48, 0xfd, 0x50, 0xa1, 0x5a, 0x9a); 10 + 11 + 12 + #endif // COMPATGUID_UNDOC_H
+1
sdk/lib/uuid/undoc.c
··· 5 5 #include <guiddef.h> 6 6 7 7 #include <shlguid_undoc.h> 8 + #include <compatguid_undoc.h> 8 9