If we delete a page table, we have also to clear the entry in the page directory...
authorHartmut Birr <osexpert@googlemail.com>
Tue, 16 Aug 2005 16:17:47 +0000 (16:17 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Tue, 16 Aug 2005 16:17:47 +0000 (16:17 +0000)
svn path=/trunk/; revision=17414

reactos/ntoskrnl/mm/i386/page.c

index f578771..2f6725a 100644 (file)
@@ -411,17 +411,18 @@ VOID MmDeletePageTable(PEPROCESS Process, PVOID Address)
    {
       ULONGLONG ZeroPde = 0LL;
       ExfpInterlockedExchange64UL(PAE_ADDR_TO_PDE(Address), &ZeroPde);
+      MiFlushTlb((PULONG)PAE_ADDR_TO_PDE(Address), PAE_ADDR_TO_PTE(Address));
    }
    else
    {
       *(ADDR_TO_PDE(Address)) = 0;
+      MiFlushTlb(ADDR_TO_PDE(Address), ADDR_TO_PTE(Address));
    }
    if (Address >= MmSystemRangeStart)
    {
       KEBUGCHECK(0);
       //       MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0;
    }
-   MiFlushTlb(NULL, Address);
    if (Process != NULL && Process != CurrentProcess)
    {
       KeDetachProcess();
@@ -455,6 +456,7 @@ VOID MmFreePageTable(PEPROCESS Process, PVOID Address)
       }
       Pfn = PAE_PTE_TO_PFN(*(PAE_ADDR_TO_PDE(Address)));
       ExfpInterlockedExchange64UL(PAE_ADDR_TO_PDE(Address), &ZeroPte);
+      MiFlushTlb((PULONG)PAE_ADDR_TO_PDE(Address), PAE_ADDR_TO_PTE(Address));
    }
    else
    {
@@ -471,8 +473,8 @@ VOID MmFreePageTable(PEPROCESS Process, PVOID Address)
       }
       Pfn = PTE_TO_PFN(*(ADDR_TO_PDE(Address)));
       *(ADDR_TO_PDE(Address)) = 0;
+      MiFlushTlb(ADDR_TO_PDE(Address), ADDR_TO_PTE(Address));
    }
-   MiFlushTlb(NULL, Address);
 
    if (Address >= MmSystemRangeStart)
    {