Author: tkreuzer
Date: Wed Feb 8 22:23:10 2012
New Revision: 55505
URL:
http://svn.reactos.org/svn/reactos?rev=55505&view=rev
Log:
[NTOSKRNL]
- Implement amd64 version of MmDeleteProcessPageDirectory
- Fix amd64 build
Modified:
trunk/reactos/ntoskrnl/kd64/kddata.c
trunk/reactos/ntoskrnl/mm/ARM3/mminit.c
trunk/reactos/ntoskrnl/mm/amd64/page.c
Modified: trunk/reactos/ntoskrnl/kd64/kddata.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd64/kddata.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/kd64/kddata.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd64/kddata.c [iso-8859-1] Wed Feb 8 22:23:10 2012
@@ -12,6 +12,7 @@
#define NDEBUG
#include <debug.h>
#include "../mm/ARM3/miarm.h"
+#undef MmSystemRangeStart
VOID NTAPI RtlpBreakWithStatusInstruction(VOID);
Modified: trunk/reactos/ntoskrnl/mm/ARM3/mminit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/mminit.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/mminit.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/mminit.c [iso-8859-1] Wed Feb 8 22:23:10 2012
@@ -14,6 +14,7 @@
#define MODULE_INVOLVED_IN_ARM3
#include "miarm.h"
+#undef MmSystemRangeStart
/* GLOBALS ********************************************************************/
@@ -170,7 +171,7 @@
//
// This should be 0xC0C00000 -- the cache itself starts at 0xC1000000
//
-PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START;
+PMMWSL MmSystemCacheWorkingSetList = (PVOID)MI_SYSTEM_CACHE_WS_START;
//
// Windows NT seems to choose between 7000, 11000 and 50000
Modified: trunk/reactos/ntoskrnl/mm/amd64/page.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/amd64/page.c?r…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/amd64/page.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/amd64/page.c [iso-8859-1] Wed Feb 8 22:23:10 2012
@@ -138,6 +138,80 @@
}
static
+VOID
+MmDeletePageTablePfn(PFN_NUMBER PageFrameNumber, ULONG Level)
+{
+ PMMPTE PageTable;
+ KIRQL OldIrql;
+ PMMPFN PfnEntry;
+ ULONG i, NumberEntries;
+
+ /* Check if this is a page table */
+ if (Level > 0)
+ {
+ NumberEntries = (Level == 4) ? MiAddressToPxi(MmHighestUserAddress)+1 : 512;
+
+ /* Map the page table in hyperspace */
+ PageTable = (PMMPTE)MmCreateHyperspaceMapping(PageFrameNumber);
+
+ /* Loop all page table entries */
+ for (i = 0; i < NumberEntries; i++)
+ {
+ /* Check if the entry is valid */
+ if (PageTable[i].u.Hard.Valid)
+ {
+ /* Recursively free the page that backs it */
+ MmDeletePageTablePfn(PageTable[i].u.Hard.PageFrameNumber, Level - 1);
+ }
+ }
+
+ /* Delete the hyperspace mapping */
+ MmDeleteHyperspaceMapping(PageTable);
+ }
+
+ /* Check if this is a legacy allocation */
+ PfnEntry = MiGetPfnEntry(PageFrameNumber);
+ if (MI_IS_ROS_PFN(PfnEntry))
+ {
+ /* Free it using the legacy API */
+ MmReleasePageMemoryConsumer(MC_SYSTEM, PageFrameNumber);
+ }
+ else
+ {
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+ /* Free it using the ARM3 API */
+ MI_SET_PFN_DELETED(PfnEntry);
+ MiDecrementShareCount(PfnEntry, PageFrameNumber);
+
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+ }
+}
+
+VOID
+NTAPI
+MmDeleteProcessPageDirectory(PEPROCESS Process)
+{
+ PFN_NUMBER TableBasePfn;
+ PMMPTE PageDir;
+
+ /* Get the page directory PFN */
+ TableBasePfn = Process->Pcb.DirectoryTableBase[0] >> PAGE_SHIFT;
+
+ /* Map the page directory in hyperspace */
+ PageDir = (PMMPTE)MmCreateHyperspaceMapping(TableBasePfn);
+
+ /* Free the hyperspace mapping page (ARM3) */
+
//MmDeletePageTablePfn(PageDir[ADDR_TO_PDE_OFFSET(HYPERSPACE)].u.Hard.PageFrameNumber,
3);
+
+ /* Delete the hyperspace mapping */
+ MmDeleteHyperspaceMapping(PageDir);
+
+ /* Recursively free the page directories */
+ MmDeletePageTablePfn(TableBasePfn, 4);
+}
+
+static
PMMPTE
MiGetPteForProcess(
PEPROCESS Process,
@@ -626,44 +700,6 @@
}
return MmCreateVirtualMappingUnsafe(Process, Address, Protect, Pages, PageCount);
-}
-
-static PMMPTE
-MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
-{
- __debugbreak();
- return 0;
-}
-
-BOOLEAN MmUnmapPageTable(PMMPTE Pt)
-{
- ASSERT(FALSE);
- return 0;
-}
-
-static ULONG64 MmGetPageEntryForProcess(PEPROCESS Process, PVOID Address)
-{
- MMPTE Pte, *PointerPte;
-
- PointerPte = MmGetPageTableForProcess(Process, Address, FALSE);
- if (PointerPte)
- {
- Pte = *PointerPte;
- MmUnmapPageTable(PointerPte);
- return Pte.u.Long;
- }
- return 0;
-}
-
-VOID
-NTAPI
-MmGetPageFileMapping(
- PEPROCESS Process,
- PVOID Address,
- SWAPENTRY* SwapEntry)
-{
- ULONG64 Entry = MmGetPageEntryForProcess(Process, Address);
- *SwapEntry = Entry >> 1;
}
BOOLEAN