From f9cbe78f84208162c9ee0f6efc2f759aef47d730 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Tue, 30 Jun 2026 21:41:08 +0200 Subject: [PATCH] Implement architecture-specific user probe address retrieval --- sdk/xtdk/amd64/mmtypes.h | 4 ++++ sdk/xtdk/i686/mmtypes.h | 3 +++ xtoskrnl/includes/mm/amd64/pagemap.hh | 3 +++ xtoskrnl/includes/mm/amd64/paging.hh | 1 + xtoskrnl/includes/mm/i686/pagemap.hh | 1 + xtoskrnl/includes/mm/i686/paging.hh | 1 + xtoskrnl/mm/amd64/pagemap.cc | 30 +++++++++++++++++++++++++++ xtoskrnl/mm/i686/pagemap.cc | 15 ++++++++++++++ xtoskrnl/mm/paging.cc | 15 ++++++++++++++ 9 files changed, 73 insertions(+) diff --git a/sdk/xtdk/amd64/mmtypes.h b/sdk/xtdk/amd64/mmtypes.h index 47ae971..d6f50c4 100644 --- a/sdk/xtdk/amd64/mmtypes.h +++ b/sdk/xtdk/amd64/mmtypes.h @@ -110,6 +110,10 @@ /* Highest system address */ #define MM_HIGHEST_SYSTEM_ADDRESS 0xFFFFFFFFFFFFFFFFULL +/* User probe address */ +#define MM_USER_PROBE_ADDRESS 0x00007FFFFFFF0000ULL +#define MM_USER_PROBE_LA57_ADDRESS 0x00FFFFFFFFFF0000ULL + /* Trampoline code address */ #define MM_TRAMPOLINE_ADDRESS 0x80000 diff --git a/sdk/xtdk/i686/mmtypes.h b/sdk/xtdk/i686/mmtypes.h index 110cf6a..eb20aa6 100644 --- a/sdk/xtdk/i686/mmtypes.h +++ b/sdk/xtdk/i686/mmtypes.h @@ -108,6 +108,9 @@ /* Highest system address */ #define MM_HIGHEST_SYSTEM_ADDRESS 0xFFFFFFFF +/* User probe address */ +#define MM_USER_PROBE_ADDRESS 0x7FFF0000 + /* Trampoline code address */ #define MM_TRAMPOLINE_ADDRESS 0x80000 diff --git a/xtoskrnl/includes/mm/amd64/pagemap.hh b/xtoskrnl/includes/mm/amd64/pagemap.hh index 59e91b8..e62e5c9 100644 --- a/xtoskrnl/includes/mm/amd64/pagemap.hh +++ b/xtoskrnl/includes/mm/amd64/pagemap.hh @@ -52,6 +52,7 @@ namespace MM XTAPI PMMPXE GetPxeAddress(IN PVOID Address); XTAPI ULONG GetPxeOffset(IN PVOID Address); VIRTUAL XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer) = 0; + VIRTUAL ULONG_PTR GetUserProbeAddress(VOID) = 0; XTAPI BOOLEAN GetXpaStatus(); VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0; XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); @@ -80,6 +81,7 @@ namespace MM XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer); XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer); + XTAPI ULONG_PTR GetUserProbeAddress(VOID); XTAPI VOID InitializePageMapInfo(VOID); }; @@ -90,6 +92,7 @@ namespace MM XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer); XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer); + XTAPI ULONG_PTR GetUserProbeAddress(VOID); XTAPI VOID InitializePageMapInfo(VOID); }; } diff --git a/xtoskrnl/includes/mm/amd64/paging.hh b/xtoskrnl/includes/mm/amd64/paging.hh index 6f927bb..e1be0d9 100644 --- a/xtoskrnl/includes/mm/amd64/paging.hh +++ b/xtoskrnl/includes/mm/amd64/paging.hh @@ -49,6 +49,7 @@ namespace MM STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); STATIC XTAPI PMMPXE GetPxeAddress(IN PVOID Address); STATIC XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer); + STATIC XTAPI ULONG_PTR GetUserProbeAddress(VOID); STATIC XTAPI BOOLEAN GetXpaStatus(VOID); STATIC XTAPI VOID InitializePageMapSupport(VOID); STATIC XTAPI XTSTATUS MapVirtualAddress(IN PVOID VirtualAddress, diff --git a/xtoskrnl/includes/mm/i686/pagemap.hh b/xtoskrnl/includes/mm/i686/pagemap.hh index a9edba9..989fc99 100644 --- a/xtoskrnl/includes/mm/i686/pagemap.hh +++ b/xtoskrnl/includes/mm/i686/pagemap.hh @@ -46,6 +46,7 @@ namespace MM VIRTUAL XTAPI ULONG GetPteSoftwarePrototype(IN PMMPTE PtePointer) = 0; VIRTUAL XTAPI ULONG GetPteSoftwareTransition(IN PMMPTE PtePointer) = 0; VIRTUAL XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer) = 0; + XTAPI ULONG_PTR GetUserProbeAddress(VOID); XTAPI BOOLEAN GetXpaStatus(); VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0; VIRTUAL XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer) = 0; diff --git a/xtoskrnl/includes/mm/i686/paging.hh b/xtoskrnl/includes/mm/i686/paging.hh index 3924111..9ac8f8f 100644 --- a/xtoskrnl/includes/mm/i686/paging.hh +++ b/xtoskrnl/includes/mm/i686/paging.hh @@ -45,6 +45,7 @@ namespace MM STATIC XTAPI ULONG GetPteSoftwarePrototype(IN PMMPTE PtePointer); STATIC XTAPI ULONG GetPteSoftwareTransition(IN PMMPTE PtePointer); STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); + STATIC XTAPI ULONG_PTR GetUserProbeAddress(VOID); STATIC XTAPI BOOLEAN GetXpaStatus(VOID); STATIC XTAPI VOID InitializePageMapSupport(VOID); STATIC XTAPI XTSTATUS MapVirtualAddress(IN PVOID VirtualAddress, diff --git a/xtoskrnl/mm/amd64/pagemap.cc b/xtoskrnl/mm/amd64/pagemap.cc index 932a447..8d749f3 100644 --- a/xtoskrnl/mm/amd64/pagemap.cc +++ b/xtoskrnl/mm/amd64/pagemap.cc @@ -755,6 +755,21 @@ MM::PageMapBasic::GetPxeVirtualAddress(IN PMMPXE PxePointer) return (PVOID)(((LONGLONG)PxePointer << 52) >> 16); } +/** + * Retrieves the maximum valid memory address accessible to user-mode applications. + * + * @return This routine returns the user-mode probe address boundary. + * + * @since XT 1.0 + */ +XTAPI +ULONG_PTR +MM::PageMapBasic::GetUserProbeAddress(VOID) +{ + /* Return user probe address */ + return MM_USER_PROBE_ADDRESS; +} + /** * Initializes page map information for basic paging (PML4). * @@ -852,6 +867,21 @@ MM::PageMapXpa::GetPxeVirtualAddress(IN PMMPXE PxePointer) return (PVOID)(((LONGLONG)PxePointer << 43) >> 7); } +/** + * Retrieves the maximum valid memory address accessible to user-mode applications. + * + * @return This routine returns the user-mode probe address boundary. + * + * @since XT 1.0 + */ +XTAPI +ULONG_PTR +MM::PageMapXpa::GetUserProbeAddress(VOID) +{ + /* Return user probe address */ + return MM_USER_PROBE_LA57_ADDRESS; +} + /** * Initializes page map information for XPA paging (PML5). * diff --git a/xtoskrnl/mm/i686/pagemap.cc b/xtoskrnl/mm/i686/pagemap.cc index 9fe00e5..3a22c00 100644 --- a/xtoskrnl/mm/i686/pagemap.cc +++ b/xtoskrnl/mm/i686/pagemap.cc @@ -173,6 +173,21 @@ MM::PageMap::GetPteOffset(IN PVOID Address) return ((((ULONG_PTR)(Address)) >> MM_PTI_SHIFT) & (PageMapInfo.Xpa ? 0x1FF : 0x3FF)); } +/** + * Retrieves the maximum valid memory address accessible to user-mode applications. + * + * @return This routine returns the user-mode probe address boundary. + * + * @since XT 1.0 + */ +XTAPI +ULONG_PTR +MM::PageMap::GetUserProbeAddress(VOID) +{ + /* Return user probe address */ + return MM_USER_PROBE_ADDRESS; +} + /** * Gets the status of Extended Paging Address (XPA) mode. * diff --git a/xtoskrnl/mm/paging.cc b/xtoskrnl/mm/paging.cc index fb56317..4c6e81b 100644 --- a/xtoskrnl/mm/paging.cc +++ b/xtoskrnl/mm/paging.cc @@ -470,6 +470,21 @@ MM::Paging::GetPteVirtualAddress(IN PMMPTE PtePointer) return PmlRoutines->GetPteVirtualAddress(PtePointer); } +/** + * Retrieves the maximum valid memory address accessible to user-mode applications. + * + * @return This routine returns the user-mode probe address boundary. + * + * @since XT 1.0 + */ +XTAPI +ULONG_PTR +MM::Paging::GetUserProbeAddress(VOID) +{ + /* Return user probe address */ + return PmlRoutines->GetUserProbeAddress(); +} + /** * Gets current status of eXtended Physical Addressing (XPA). *