From 7694df7744a93dcb70f26646745fe3613120ce2b Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Sat, 6 Dec 2025 00:19:24 +0100 Subject: [PATCH] Add architecture-specific GetPteDistance --- xtoskrnl/includes/mm/amd64/pagemap.hh | 2 ++ xtoskrnl/includes/mm/amd64/paging.hh | 2 ++ xtoskrnl/includes/mm/i686/pagemap.hh | 4 +++ xtoskrnl/includes/mm/i686/paging.hh | 2 ++ xtoskrnl/mm/amd64/pagemap.cc | 22 ++++++++++++++ xtoskrnl/mm/i686/pagemap.cc | 44 +++++++++++++++++++++++++++ xtoskrnl/mm/paging.cc | 22 ++++++++++++++ 7 files changed, 98 insertions(+) diff --git a/xtoskrnl/includes/mm/amd64/pagemap.hh b/xtoskrnl/includes/mm/amd64/pagemap.hh index fce9480..9aee6cf 100644 --- a/xtoskrnl/includes/mm/amd64/pagemap.hh +++ b/xtoskrnl/includes/mm/amd64/pagemap.hh @@ -39,6 +39,8 @@ namespace MM XTAPI ULONG GetPpeIndex(IN PVOID Address); VIRTUAL XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer) = 0; XTAPI PMMPTE GetPteAddress(IN PVOID Address); + XTAPI LONG GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte); XTAPI ULONG GetPteIndex(IN PVOID Address); XTAPI ULONG GetPteSize(VOID); VIRTUAL XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer) = 0; diff --git a/xtoskrnl/includes/mm/amd64/paging.hh b/xtoskrnl/includes/mm/amd64/paging.hh index 91dcfff..64e7a9e 100644 --- a/xtoskrnl/includes/mm/amd64/paging.hh +++ b/xtoskrnl/includes/mm/amd64/paging.hh @@ -37,6 +37,8 @@ namespace MM STATIC XTAPI PMMPPE GetPpeAddress(IN PVOID Address); STATIC XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer); STATIC XTAPI PMMPTE GetPteAddress(IN PVOID Address); + STATIC XTAPI LONG GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte); STATIC XTAPI ULONG GetPteSize(VOID); STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); STATIC XTAPI PMMPXE GetPxeAddress(IN PVOID Address); diff --git a/xtoskrnl/includes/mm/i686/pagemap.hh b/xtoskrnl/includes/mm/i686/pagemap.hh index 59a4d6a..0ce296f 100644 --- a/xtoskrnl/includes/mm/i686/pagemap.hh +++ b/xtoskrnl/includes/mm/i686/pagemap.hh @@ -63,6 +63,8 @@ namespace MM XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); + XTAPI LONG GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte); XTAPI ULONG GetPteSize(VOID); XTAPI VOID InitializePageMapInfo(VOID); XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); @@ -87,6 +89,8 @@ namespace MM XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); + XTAPI LONG GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte); XTAPI ULONG GetPteSize(VOID); XTAPI VOID InitializePageMapInfo(VOID); XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); diff --git a/xtoskrnl/includes/mm/i686/paging.hh b/xtoskrnl/includes/mm/i686/paging.hh index 819cfa6..a1b13ad 100644 --- a/xtoskrnl/includes/mm/i686/paging.hh +++ b/xtoskrnl/includes/mm/i686/paging.hh @@ -35,6 +35,8 @@ namespace MM STATIC XTAPI PMMPPE GetPpeAddress(IN PVOID Address); STATIC XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer); STATIC XTAPI PMMPTE GetPteAddress(IN PVOID Address); + STATIC XTAPI LONG GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte); STATIC XTAPI ULONG GetPteSize(VOID); STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); STATIC XTAPI BOOLEAN GetXpaStatus(VOID); diff --git a/xtoskrnl/mm/amd64/pagemap.cc b/xtoskrnl/mm/amd64/pagemap.cc index 7384835..290f880 100644 --- a/xtoskrnl/mm/amd64/pagemap.cc +++ b/xtoskrnl/mm/amd64/pagemap.cc @@ -289,6 +289,28 @@ MM::PageMap::GetPteAddress(IN PVOID Address) return (PMMPTE)(PageMapInfo.PteBase + Offset); } +/** + * Calculates the distance between two PTE pointers. + * + * @param EndPte + * Pointer to the ending Page Table Entry. + * + * @param StartPte + * Pointer to the starting Page Table Entry. + * + * @return This routine returns a signed value representing the number of PTEs between EndPte and StartPte. + * + * @since XT 1.0 + */ +XTAPI +LONG +MM::PageMap::GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte) +{ + /* Return distance between PTE pointers */ + return ((ULONG_PTR)EndPte - (ULONG_PTR)StartPte) / sizeof(MMPTE); +} + /** * Gets the index of the PTE (Page Table Entry), that maps given address. * diff --git a/xtoskrnl/mm/i686/pagemap.cc b/xtoskrnl/mm/i686/pagemap.cc index cb38fa4..d695fe8 100644 --- a/xtoskrnl/mm/i686/pagemap.cc +++ b/xtoskrnl/mm/i686/pagemap.cc @@ -317,6 +317,28 @@ MM::PageMapBasic::GetPageFrameNumber(IN PMMPTE Pte) return Pte->Pml2.Hardware.PageFrameNumber; } +/** + * Calculates the distance between two PTE pointers. + * + * @param EndPte + * Pointer to the ending Page Table Entry. + * + * @param StartPte + * Pointer to the starting Page Table Entry. + * + * @return This routine returns a signed value representing the number of PTEs between EndPte and StartPte. + * + * @since XT 1.0 + */ +XTAPI +LONG +MM::PageMapBasic::GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte) +{ + /* Return distance between PTE pointers */ + return ((ULONG_PTR)EndPte - (ULONG_PTR)StartPte) / sizeof(MMPML2_PTE); +} + /** * Gets the size of a PTE for basic paging (PML2). * @@ -568,6 +590,28 @@ MM::PageMapXpa::GetPageFrameNumber(IN PMMPTE Pte) return Pte->Pml3.Hardware.PageFrameNumber; } +/** + * Calculates the distance between two PTE pointers. + * + * @param EndPte + * Pointer to the ending Page Table Entry. + * + * @param StartPte + * Pointer to the starting Page Table Entry. + * + * @return This routine returns a signed value representing the number of PTEs between EndPte and StartPte. + * + * @since XT 1.0 + */ +XTAPI +LONG +MM::PageMapXpa::GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte) +{ + /* Return distance between PTE pointers */ + return ((ULONG_PTR)EndPte - (ULONG_PTR)StartPte) / sizeof(MMPML3_PTE); +} + /** * Gets the size of a PTE for XPA paging (PML3). * diff --git a/xtoskrnl/mm/paging.cc b/xtoskrnl/mm/paging.cc index 5c5316f..18c24d2 100644 --- a/xtoskrnl/mm/paging.cc +++ b/xtoskrnl/mm/paging.cc @@ -311,6 +311,28 @@ MM::Paging::GetPteAddress(IN PVOID Address) return PmlRoutines->GetPteAddress(Address); } +/** + * Calculates the distance between two PTE pointers. + * + * @param EndPte + * Pointer to the ending Page Table Entry. + * + * @param StartPte + * Pointer to the starting Page Table Entry. + * + * @return This routine returns a signed value representing the number of PTEs between EndPte and StartPte. + * + * @since XT 1.0 + */ +XTAPI +LONG +MM::Paging::GetPteDistance(PMMPTE EndPte, + PMMPTE StartPte) +{ + /* Return distance between PTE pointers */ + return PmlRoutines->GetPteDistance(EndPte, StartPte); +} + /** * Gets the size of a PTE. *