From 66f27e4b9a8d736389ab7b16bf22e216c9bb1536 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Tue, 4 Nov 2025 23:03:47 +0100 Subject: [PATCH] Add GetPageFrameNumber() to PTE interfaces --- xtoskrnl/includes/mm/amd64/pagemap.hh | 1 + xtoskrnl/includes/mm/i686/pagemap.hh | 3 +++ xtoskrnl/includes/mm/paging.hh | 1 + xtoskrnl/mm/amd64/pagemap.cc | 17 ++++++++++++++ xtoskrnl/mm/i686/pagemap.cc | 34 +++++++++++++++++++++++++++ xtoskrnl/mm/paging.cc | 17 ++++++++++++++ 6 files changed, 73 insertions(+) diff --git a/xtoskrnl/includes/mm/amd64/pagemap.hh b/xtoskrnl/includes/mm/amd64/pagemap.hh index 99f09b0..14d32a7 100644 --- a/xtoskrnl/includes/mm/amd64/pagemap.hh +++ b/xtoskrnl/includes/mm/amd64/pagemap.hh @@ -31,6 +31,7 @@ namespace MM XTAPI PMMP5E GetP5eAddress(IN PVOID Address); XTAPI ULONG GetP5eIndex(IN PVOID Address); XTAPI PVOID GetP5eVirtualAddress(IN PMMP5E P5ePointer); + XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); XTAPI PMMPDE GetPdeAddress(IN PVOID Address); XTAPI ULONG GetPdeIndex(IN PVOID Address); XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); diff --git a/xtoskrnl/includes/mm/i686/pagemap.hh b/xtoskrnl/includes/mm/i686/pagemap.hh index 9868836..2ae64d1 100644 --- a/xtoskrnl/includes/mm/i686/pagemap.hh +++ b/xtoskrnl/includes/mm/i686/pagemap.hh @@ -28,6 +28,7 @@ namespace MM VIRTUAL XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte) = 0; VIRTUAL XTAPI PMMPTE GetNextPte(IN PMMPTE Pte) = 0; VIRTUAL XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte) = 0; + VIRTUAL XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte) = 0; XTAPI PMMPDE GetPdeAddress(IN PVOID Address); XTAPI ULONG GetPdeIndex(IN PVOID Address); XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); @@ -60,6 +61,7 @@ namespace MM XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte); XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); + XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); XTAPI ULONG GetPteSize(VOID); XTAPI VOID InitializePageMapInfo(VOID); XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); @@ -83,6 +85,7 @@ namespace MM XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte); XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); + XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); XTAPI ULONG GetPteSize(VOID); XTAPI VOID InitializePageMapInfo(VOID); XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); diff --git a/xtoskrnl/includes/mm/paging.hh b/xtoskrnl/includes/mm/paging.hh index 7662dec..17b65a6 100644 --- a/xtoskrnl/includes/mm/paging.hh +++ b/xtoskrnl/includes/mm/paging.hh @@ -30,6 +30,7 @@ namespace MM STATIC XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte); STATIC XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); STATIC XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); + STATIC XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); STATIC XTAPI PMMPDE GetPdeAddress(IN PVOID Address); STATIC XTAPI PMMPPE GetPpeAddress(IN PVOID Address); STATIC XTAPI PMMPTE GetPteAddress(IN PVOID Address); diff --git a/xtoskrnl/mm/amd64/pagemap.cc b/xtoskrnl/mm/amd64/pagemap.cc index f7774f3..e807467 100644 --- a/xtoskrnl/mm/amd64/pagemap.cc +++ b/xtoskrnl/mm/amd64/pagemap.cc @@ -173,6 +173,23 @@ MM::PageMap::GetP5eVirtualAddress(IN PMMP5E P5ePointer) return (PVOID)((((LONGLONG)P5ePointer << 61) >> 16) * PageMapInfo.Xpa); } +/** + * Gets the page frame number from a corresponding PTE. + * + * @param Pte + * The PTE pointer to get the page frame number from. + * + * @return This routine returns the page frame number. + * + * @since XT 1.0 + */ +XTAPI +PFN_NUMBER +MM::PageMap::GetPageFrameNumber(IN PMMPTE Pte) +{ + return Pte->Hardware.PageFrameNumber; +} + /** * Gets the address of the PDE (Page Directory Entry), that maps given address. * diff --git a/xtoskrnl/mm/i686/pagemap.cc b/xtoskrnl/mm/i686/pagemap.cc index 67bf253..278351a 100644 --- a/xtoskrnl/mm/i686/pagemap.cc +++ b/xtoskrnl/mm/i686/pagemap.cc @@ -286,6 +286,23 @@ MM::PageMapBasic::GetOneEntry(IN PMMPTE Pte) return Pte->Pml2.List.OneEntry; } +/** + * Gets the page frame number from a corresponding PTE. + * + * @param Pte + * The PTE pointer to get the page frame number from. + * + * @return This routine returns the page frame number. + * + * @since XT 1.0 + */ +XTAPI +PFN_NUMBER +MM::PageMapBasic::GetPageFrameNumber(IN PMMPTE Pte) +{ + return Pte->Pml2.Hardware.PageFrameNumber; +} + /** * Gets the size of a PTE for basic paging (PML2). * @@ -520,6 +537,23 @@ MM::PageMapXpa::GetOneEntry(IN PMMPTE Pte) return Pte->Pml3.List.OneEntry; } +/** + * Gets the page frame number from a corresponding PTE. + * + * @param Pte + * The PTE pointer to get the page frame number from. + * + * @return This routine returns the page frame number. + * + * @since XT 1.0 + */ +XTAPI +PFN_NUMBER +MM::PageMapBasic::GetPageFrameNumber(IN PMMPTE Pte) +{ + return Pte->Pml3.Hardware.PageFrameNumber; +} + /** * Gets the size of a PTE for XPA paging (PML3). * diff --git a/xtoskrnl/mm/paging.cc b/xtoskrnl/mm/paging.cc index 78d3278..c85744e 100644 --- a/xtoskrnl/mm/paging.cc +++ b/xtoskrnl/mm/paging.cc @@ -170,6 +170,23 @@ MM::Paging::GetOneEntry(IN PMMPTE Pte) return PmlRoutines->GetOneEntry(Pte); } +/** + * Gets the page frame number from a corresponding PTE. + * + * @param Pte + * The PTE pointer to get the page frame number from. + * + * @return This routine returns the page frame number. + * + * @since XT 1.0 + */ +XTAPI +PFN_NUMBER +MM::Paging::GetPageFrameNumber(IN PMMPTE Pte) +{ + return PmlRoutines->GetPageFrameNumber(Pte); +} + /** * Gets the page map routines for basic paging mode (non-XPA). *