From e6cdd4d0fd20a9a92f0e5202334272000ba10528 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 21 Jul 2010 17:58:09 +0000 Subject: [PATCH] [NTOS]: If the memory area is owned by ARM3, and it's being freed, don't touch the pages, just unlink it and free the memory. This is useful for MAREAs being used by ARM3 to protect pieces of address space from the Ros Mm Allocator, but when we don't want it to start playing with our pages. When we do free those MAREAs, keep it away! svn path=/trunk/; revision=48163 --- reactos/ntoskrnl/mm/marea.c | 92 +++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c index d102a2da563..0466de055c0 100644 --- a/reactos/ntoskrnl/mm/marea.c +++ b/reactos/ntoskrnl/mm/marea.c @@ -732,51 +732,55 @@ MmFreeMemoryArea( PMEMORY_AREA *ParentReplace; ULONG_PTR Address; PVOID EndAddress; - PEPROCESS CurrentProcess = PsGetCurrentProcess(); - PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); - - if (Process != NULL && - Process != CurrentProcess) - { - KeAttachProcess(&Process->Pcb); - } - - EndAddress = MM_ROUND_UP(MemoryArea->EndingAddress, PAGE_SIZE); - for (Address = (ULONG_PTR)MemoryArea->StartingAddress; - Address < (ULONG_PTR)EndAddress; - Address += PAGE_SIZE) - { - if (MemoryArea->Type == MEMORY_AREA_IO_MAPPING) - { - MmRawDeleteVirtualMapping((PVOID)Address); - } - else - { - BOOLEAN Dirty = FALSE; - SWAPENTRY SwapEntry = 0; - PFN_NUMBER Page = 0; - - if (MmIsPageSwapEntry(Process, (PVOID)Address)) - { - MmDeletePageFileMapping(Process, (PVOID)Address, &SwapEntry); - } - else - { - MmDeleteVirtualMapping(Process, (PVOID)Address, FALSE, &Dirty, &Page); - } - if (FreePage != NULL) - { - FreePage(FreePageContext, MemoryArea, (PVOID)Address, - Page, SwapEntry, (BOOLEAN)Dirty); - } - } - } - - if (Process != NULL && - Process != CurrentProcess) + + if (MemoryArea->Type != MEMORY_AREA_OWNED_BY_ARM3) { - KeDetachProcess(); - } + PEPROCESS CurrentProcess = PsGetCurrentProcess(); + PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); + + if (Process != NULL && + Process != CurrentProcess) + { + KeAttachProcess(&Process->Pcb); + } + + EndAddress = MM_ROUND_UP(MemoryArea->EndingAddress, PAGE_SIZE); + for (Address = (ULONG_PTR)MemoryArea->StartingAddress; + Address < (ULONG_PTR)EndAddress; + Address += PAGE_SIZE) + { + if (MemoryArea->Type == MEMORY_AREA_IO_MAPPING) + { + MmRawDeleteVirtualMapping((PVOID)Address); + } + else + { + BOOLEAN Dirty = FALSE; + SWAPENTRY SwapEntry = 0; + PFN_NUMBER Page = 0; + + if (MmIsPageSwapEntry(Process, (PVOID)Address)) + { + MmDeletePageFileMapping(Process, (PVOID)Address, &SwapEntry); + } + else + { + MmDeleteVirtualMapping(Process, (PVOID)Address, FALSE, &Dirty, &Page); + } + if (FreePage != NULL) + { + FreePage(FreePageContext, MemoryArea, (PVOID)Address, + Page, SwapEntry, (BOOLEAN)Dirty); + } + } + } + + if (Process != NULL && + Process != CurrentProcess) + { + KeDetachProcess(); + } + } /* Remove the tree item. */ { -- 2.17.1