diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index ac776199304..75fd0e5ce7d 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -102,7 +102,8 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE; #define MC_USER (1) #define MC_PPOOL (2) #define MC_NPPOOL (3) -#define MC_MAXIMUM (4) +#define MC_SYSTEM (4) +#define MC_MAXIMUM (5) #define PAGED_POOL_MASK 1 #define MUST_SUCCEED_POOL_MASK 2 diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 426bd57e2cf..6ee34130982 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -777,7 +777,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); PfnOffset = PageDescriptor - MmPfnDatabase; - if (NeedClear) + if ((NeedClear) && (Consumer != MC_SYSTEM)) { MiZeroPage(PfnOffset); } diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index f5b7fe4590a..9d2509f2005 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -310,7 +310,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) { return NULL; } - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn); + Status = MmRequestPageMemoryConsumer(MC_SYSTEM, FALSE, &Pfn); if (!NT_SUCCESS(Status) || Pfn == 0) { KeBugCheck(MEMORY_MANAGEMENT); @@ -322,8 +322,11 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) } if(0 != InterlockedCompareExchangePte(&MmGlobalKernelPageDirectory[PdeOffset], Entry, 0)) { - MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn); + MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn); } + InterlockedExchangePte(PageDir, MmGlobalKernelPageDirectory[PdeOffset]); + RtlZeroMemory(MiPteToAddress(PageDir), PAGE_SIZE); + return (PULONG)MiAddressToPte(Address); } InterlockedExchangePte(PageDir, MmGlobalKernelPageDirectory[PdeOffset]); }