From aa365b7e33083dda4a7c118cb45f25ffcbc23ed6 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sat, 14 Mar 2009 21:29:37 +0000 Subject: [PATCH] - Use MmCreateHyperspaceMapping() again. - Delete hyperspace mapping before releasing cache segment (bug #4249). svn path=/trunk/; revision=40018 --- reactos/ntoskrnl/mm/i386/page.c | 12 ++++++++---- reactos/ntoskrnl/mm/section.c | 6 +++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 00bf5436883..108699b6e92 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -1076,18 +1076,18 @@ MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size) { ULONG StartOffset, EndOffset, Offset; PULONG Pde; - + if (Address < MmSystemRangeStart) { KeBugCheck(MEMORY_MANAGEMENT); } - + StartOffset = ADDR_TO_PDE_OFFSET(Address); EndOffset = ADDR_TO_PDE_OFFSET((PVOID)((ULONG_PTR)Address + Size)); - + if (Process != NULL && Process != PsGetCurrentProcess()) { - Pde = MiMapPageToZeroInHyperSpace(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0])); + Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0])); } else { @@ -1100,6 +1100,10 @@ MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size) InterlockedCompareExchangePte(&Pde[Offset], MmGlobalKernelPageDirectory[Offset], 0); } } + if (Pde != (PULONG)PAGEDIRECTORY_MAP) + { + MmDeleteHyperspaceMapping(Pde); + } } extern MMPTE HyperTemplatePte; diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 04ef3db244c..cba0cedec2a 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -691,7 +691,8 @@ MiReadPage(PMEMORY_AREA MemoryArea, return Status; } } - PageAddr = MiMapPageToZeroInHyperSpace(*Page); + + PageAddr = MmCreateHyperspaceMapping(*Page); CacheSegOffset = BaseOffset + CacheSeg->Bcb->CacheSegmentSize - FileOffset; Length = RawLength - SegOffset; if (Length <= CacheSegOffset && Length <= PAGE_SIZE) @@ -705,6 +706,7 @@ MiReadPage(PMEMORY_AREA MemoryArea, else { memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, CacheSegOffset); + MmDeleteHyperspaceMapping(PageAddr); CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE); Status = CcRosGetCacheSegment(Bcb, FileOffset + CacheSegOffset, @@ -729,6 +731,7 @@ MiReadPage(PMEMORY_AREA MemoryArea, return Status; } } + PageAddr = MmCreateHyperspaceMapping(*Page); if (Length < PAGE_SIZE) { memcpy((char*)PageAddr + CacheSegOffset, BaseAddress, Length - CacheSegOffset); @@ -738,6 +741,7 @@ MiReadPage(PMEMORY_AREA MemoryArea, memcpy((char*)PageAddr + CacheSegOffset, BaseAddress, PAGE_SIZE - CacheSegOffset); } } + MmDeleteHyperspaceMapping(PageAddr); CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE); } return(STATUS_SUCCESS);