- Fix a couple of bugs, and majorly refactor MmDeleteVirtualMapping to sync it to the x86 version somewhat more.

svn path=/trunk/; revision=34859
This commit is contained in:
ReactOS Portable Systems Group 2008-07-27 20:58:23 +00:00
parent 8054941a9f
commit ac0487dfa5

View file

@ -569,40 +569,19 @@ MmDeleteVirtualMapping(IN PEPROCESS Process,
{ {
PMMPTE PointerPte; PMMPTE PointerPte;
MMPTE Pte; MMPTE Pte;
PFN_NUMBER Pfn = 0;
// //
// Get the PTE // Get the PTE
// //
PointerPte = MiGetPageTableForProcess(NULL, Address, FALSE); PointerPte = MiGetPageTableForProcess(NULL, Address, FALSE);
if (!PointerPte) if (PointerPte)
{ {
// //
// Invalid PDE // Save and destroy the PTE
//
if (WasDirty) *WasDirty = FALSE;
if (Page) *Page = 0;
return;
}
//
// Save the PTE
// //
Pte = *PointerPte; Pte = *PointerPte;
if (PointerPte->u.Hard.L1.Fault.Type == FaultPte)
{
//
// Invalid PTE
//
if (WasDirty) *WasDirty = FALSE;
if (Page) *Page = 0;
return;
}
//
// Destroy the PTE
//
PointerPte->u.Hard.AsUlong = 0; PointerPte->u.Hard.AsUlong = 0;
ASSERT(PointerPte->u.Hard.L2.Fault.Type == FaultPte);
// //
// Flush the TLB // Flush the TLB
@ -610,39 +589,22 @@ MmDeleteVirtualMapping(IN PEPROCESS Process,
MiFlushTlb(PointerPte, Address); MiFlushTlb(PointerPte, Address);
// //
// Check if the PTE was valid // Unmap the PFN
// //
if (Pte.u.Hard.L2.Fault.Type != FaultPte) Pfn = Pte.u.Hard.L2.Small.BaseAddress;
{ if (Pfn) MmMarkPageUnmapped(Pfn);
//
// Mark the page as unmapped
//
MmMarkPageUnmapped(Pte.u.Hard.L2.Small.BaseAddress);
}
else
{
//
// Make it sane
//
Pte.u.Hard.L2.Small.BaseAddress = 0;
}
// //
// Check if this was our page, and valid // Release the PFN if it was ours
// //
if ((FreePage) && (Pte.u.Hard.L2.Fault.Type != FaultPte)) if ((FreePage) && (Pfn)) MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn);
{
//
// Release it
//
MmReleasePageMemoryConsumer(MC_NPPOOL, Pte.u.Hard.L2.Small.BaseAddress);
} }
// //
// Return if the page was dirty // Return if the page was dirty
// //
if (WasDirty) *WasDirty = TRUE; // LIE!!! if (WasDirty) *WasDirty = FALSE; // LIE!!!
if (Page) *Page = Pte.u.Hard.L2.Small.BaseAddress; if (Page) *Page = Pfn;
} }
PVOID PVOID