https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a5ea259b2864b25b62bf1b...
commit a5ea259b2864b25b62bf1bb4045c6961877a342a Author: Jérôme Gardou jerome.gardou@reactos.org AuthorDate: Tue Jun 1 10:32:12 2021 +0200 Commit: Jérôme Gardou zefklop@users.noreply.github.com CommitDate: Mon Jun 7 17:04:18 2021 +0200
[NTOS:MM] Fix remnants of CORE-17587 --- ntoskrnl/mm/i386/page.c | 26 +++++++++++++++++--------- ntoskrnl/mm/section.c | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/ntoskrnl/mm/i386/page.c b/ntoskrnl/mm/i386/page.c index 3e5f5797218..d15a9f74964 100644 --- a/ntoskrnl/mm/i386/page.c +++ b/ntoskrnl/mm/i386/page.c @@ -540,6 +540,10 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process, /* Make sure our PDE is valid, and that everything is going fine */ if (Process == NULL) { + /* We don't support this in legacy Mm for kernel mappings */ + ASSERT(ProtectionMask != MM_WRITECOPY); + ASSERT(ProtectionMask != MM_EXECUTE_WRITECOPY); + if (Address < MmSystemRangeStart) { DPRINT1("NULL process given for user-mode mapping at %p\n", Address); @@ -567,14 +571,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
PointerPte = MiAddressToPte(Address);
- if (Address >= MmSystemRangeStart) - { - MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, PointerPte, ProtectionMask, Page); - } - else - { - MI_MAKE_HARDWARE_PTE_USER(&TempPte, PointerPte, ProtectionMask, Page); - } + MI_MAKE_HARDWARE_PTE(&TempPte, PointerPte, ProtectionMask, Page);
Pte = InterlockedExchangePte(PointerPte, TempPte.u.Long); /* There should not have been anything valid here */ @@ -710,7 +707,18 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
PointerPte = MiAddressToPte(Address);
- MI_MAKE_HARDWARE_PTE_USER(&TempPte, PointerPte, ProtectionMask, PFN_FROM_PTE(PointerPte)); + /* Sanity check */ + ASSERT(PointerPte->u.Hard.Owner == 1); + + TempPte.u.Long = 0; + TempPte.u.Hard.PageFrameNumber = PointerPte->u.Hard.PageFrameNumber; + TempPte.u.Long |= MmProtectToPteMask[ProtectionMask]; + TempPte.u.Hard.Owner = 1; + + /* Only set valid bit if we have to */ + if ((ProtectionMask != MM_NOACCESS) && !FlagOn(ProtectionMask, MM_GUARDPAGE)) + TempPte.u.Hard.Valid = 1; + /* Keep dirty & accessed bits */ TempPte.u.Hard.Accessed = PointerPte->u.Hard.Accessed; TempPte.u.Hard.Dirty = PointerPte->u.Hard.Dirty; diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c index 005e686e771..c6b618cdbf8 100644 --- a/ntoskrnl/mm/section.c +++ b/ntoskrnl/mm/section.c @@ -1474,7 +1474,7 @@ MmAlterViewAttributes(PMMSUPPORT AddressSpace, * If we doing COW for this segment then check if the page is * already private. */ - if (DoCOW && MmIsPagePresent(Process, Address)) + if (DoCOW && (MmIsPagePresent(Process, Address) || MmIsDisabledPage(Process, Address))) { LARGE_INTEGER Offset; ULONG_PTR Entry;