https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3625238ecb5eec1b65d6ef...
commit 3625238ecb5eec1b65d6efd756013d3738bacb95 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Sun Jul 14 00:04:19 2019 +0200 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun Jul 14 22:23:49 2019 +0200
[NTOS:MM] Add a MmChangeKernelResourceSectionProtection() helper. (#1649)
This allows setting the memory protection of the kernel's resource section as will. MmMakeKernelResourceSectionWritable() is re-implemented around this helper. --- ntoskrnl/include/internal/mm.h | 4 ++++ ntoskrnl/mm/ARM3/sysldr.c | 41 +++++++++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index da3a720d4dc..32fd7b1146d 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -1370,6 +1370,10 @@ MiInitializeLoadedModuleList( IN PLOADER_PARAMETER_BLOCK LoaderBlock );
+BOOLEAN +NTAPI +MmChangeKernelResourceSectionProtection(IN ULONG_PTR ProtectionMask); + VOID NTAPI MmMakeKernelResourceSectionWritable(VOID); diff --git a/ntoskrnl/mm/ARM3/sysldr.c b/ntoskrnl/mm/ARM3/sysldr.c index 036c38505d6..ab6e1165cc1 100644 --- a/ntoskrnl/mm/ARM3/sysldr.c +++ b/ntoskrnl/mm/ARM3/sysldr.c @@ -2281,20 +2281,20 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) return TRUE; }
-VOID +BOOLEAN NTAPI -MmMakeKernelResourceSectionWritable(VOID) +MmChangeKernelResourceSectionProtection(IN ULONG_PTR ProtectionMask) { PMMPTE PointerPte; MMPTE TempPte;
/* Don't do anything if the resource section is already writable */ if (MiKernelResourceStartPte == NULL || MiKernelResourceEndPte == NULL) - return; + return FALSE;
/* If the resource section is physical, we cannot change its protection */ if (MI_IS_PHYSICAL_ADDRESS(MiPteToAddress(MiKernelResourceStartPte))) - return; + return FALSE;
/* Loop the PTEs */ for (PointerPte = MiKernelResourceStartPte; PointerPte < MiKernelResourceEndPte; ++PointerPte) @@ -2303,19 +2303,36 @@ MmMakeKernelResourceSectionWritable(VOID) TempPte = *PointerPte;
/* Update the protection */ - MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, PointerPte, MM_READWRITE, TempPte.u.Hard.PageFrameNumber); + MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, PointerPte, ProtectionMask, TempPte.u.Hard.PageFrameNumber); MI_UPDATE_VALID_PTE(PointerPte, TempPte); }
- /* - * Invalidate the cached resource section PTEs - * so as to not change its protection again later. - */ - MiKernelResourceStartPte = NULL; - MiKernelResourceEndPte = NULL; - /* Only flush the current processor's TLB */ KeFlushCurrentTb(); + return TRUE; +} + +VOID +NTAPI +MmMakeKernelResourceSectionWritable(VOID) +{ + /* Don't do anything if the resource section is already writable */ + if (MiKernelResourceStartPte == NULL || MiKernelResourceEndPte == NULL) + return; + + /* If the resource section is physical, we cannot change its protection */ + if (MI_IS_PHYSICAL_ADDRESS(MiPteToAddress(MiKernelResourceStartPte))) + return; + + if (MmChangeKernelResourceSectionProtection(MM_READWRITE)) + { + /* + * Invalidate the cached resource section PTEs + * so as to not change its protection again later. + */ + MiKernelResourceStartPte = NULL; + MiKernelResourceEndPte = NULL; + } }
LOGICAL