[NTOS:MM/x64] Randomize location of system PTEs

This commit is contained in:
Timo Kreuzer 2023-05-09 23:22:16 +03:00
parent 9e655d3347
commit 7432b6d794
3 changed files with 7 additions and 6 deletions

View file

@ -15,7 +15,6 @@
#define HYPER_SPACE_END 0xFFFFF77FFFFFFFFFULL
//#define MI_SHARED_SYSTEM_PAGE 0xFFFFF78000000000ULL
#define MI_LOADER_MAPPINGS 0xFFFFF80000000000ULL // 512 GB loader mappings aka KSEG0_BASE (NDK) [MiVaBootLoaded]
#define MM_SYSTEM_SPACE_START 0xFFFFF88000000000ULL // 128 GB system PTEs [MiVaSystemPtes]
#define MI_SESSION_SPACE_START 0xFFFFF90000000000ULL // 512 GB session space [MiVaSessionSpace]
//#define MI_SESSION_VIEW_END 0xFFFFF97FFF000000ULL
#define MI_SESSION_SPACE_END 0xFFFFF98000000000ULL
@ -39,11 +38,13 @@
#define PPE_MAPPED_VA (PDE_PER_PAGE * (ULONG64)PDE_MAPPED_VA)
#define PXE_MAPPED_VA (PPE_PER_PAGE * (ULONG64)PPE_MAPPED_VA)
extern PVOID MiSystemPteSpaceStart;
/* Misc address definitions */
//#define MI_NON_PAGED_SYSTEM_START_MIN MM_SYSTEM_SPACE_START // FIXME
//#define MI_SYSTEM_PTE_START MM_SYSTEM_SPACE_START
//#define MI_SYSTEM_PTE_END (MI_SYSTEM_PTE_START + MI_NUMBER_SYSTEM_PTES * PAGE_SIZE - 1)
#define MI_SYSTEM_PTE_BASE (PVOID)MiAddressToPte(KSEG0_BASE)
#define MI_SYSTEM_PTE_BASE (PVOID)MiAddressToPte(MiSystemPteSpaceStart)
#define MM_HIGHEST_VAD_ADDRESS (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE))
#define MI_MAPPING_RANGE_START HYPER_SPACE
#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + MI_HYPERSPACE_PTES * PAGE_SIZE)

View file

@ -407,7 +407,7 @@ MiBuildSystemPteSpace(VOID)
NonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE;
/* Put system PTEs at the start of the system VA space */
MiSystemPteSpaceStart = MmNonPagedSystemStart;
MiSystemPteSpaceStart = MiSystemVaRegions[AssignedRegionSystemPtes].BaseAddress;
MiSystemPteSpaceEnd = (PUCHAR)MiSystemPteSpaceStart + NonPagedSystemSize;
/* Map the PPEs and PDEs for the system PTEs */

View file

@ -194,9 +194,6 @@ SetupVaRegions(
MI_LOADER_MAPPINGS,
BootImageSize + PAGE_SIZE);
/* Reserve 128 GB for system PTEs */
ReserveVaRegion(AssignedRegionSystemPtes, MM_SYSTEM_SPACE_START, 128 * _1GB);
/* Reserve up to 8 TB for the PFN database */
PFN_NUMBER HighestPfn = FindHighestPfnNumber(LoaderBlock);
ULONG64 PfnDbSize = HighestPfn * sizeof(MMPFN) + _1MB;
@ -211,6 +208,9 @@ SetupVaRegions(
/* Reserve 128 GB for paged pool */
RandomizeVaRegion(AssignedRegionPagedPool, 128 * _1GB, PDE_MAPPED_VA);
/* Reserve 32 GB for system PTEs (this is the limit of the implementation) */
RandomizeVaRegion(AssignedRegionSystemPtes, 32 * _1GB, PDE_MAPPED_VA);
/* Reserve 128 GB for kernel stacks */
RandomizeVaRegion(AssignedRegionKernelStacks, 128 * _1GB, PDE_MAPPED_VA);