If we delete a page table, we have also to clear the entry in the page directory area explicitly. This may fix parts of bug #710. Modified: trunk/reactos/ntoskrnl/mm/i386/page.c _____
Modified: trunk/reactos/ntoskrnl/mm/i386/page.c --- trunk/reactos/ntoskrnl/mm/i386/page.c 2005-08-16 15:47:38 UTC (rev 17413) +++ trunk/reactos/ntoskrnl/mm/i386/page.c 2005-08-16 16:17:47 UTC (rev 17414) @@ -411,17 +411,18 @@
{ 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 @@ } 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 @@ } 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) {