[NTOS]: Correctly setup the PFN entries for freshly allocated paged pool pages. Fixes a problem where the page could've still had stale/garbage data.
[NTOS]: Add some extra assertions in the code to catch memory corruption and detect invalid logic.
[NTOS]: Fix some typos in the code (comments/whitespace).
[NTOS]: Make the dreaded page fault message that breaks paged pool on some systems more verbose for future debugging.
svn path=/trunk/; revision=47189
StartPfn = Pfn1;
Pfn1->u3.e1.StartOfAllocation = 0;
- /* Look the PFNs until we find the one that marks the end of the allocation */
+ /* Loop the PFNs until we find the one that marks the end of the allocation */
do
{
/* Make sure these are the pages we setup in the allocation routine */
//
// Loop all the pages
//
- LastPage = PageFrameIndex + PageCount;
+ LastPage = PageFrameIndex + PageCount;
do
{
//
// Free each one, and move on
//
- MmReleasePageMemoryConsumer(MC_NPPOOL, PageFrameIndex);
- } while (++PageFrameIndex < LastPage);
+ MmReleasePageMemoryConsumer(MC_NPPOOL, PageFrameIndex++);
+ } while (PageFrameIndex < LastPage);
//
// Release the PFN lock
//
// Creates a software PTE with the given protection
//
-#define MI_MAKE_SOFTWARE_PTE(x) ((x) << MM_PTE_SOFTWARE_PROTECTION_BITS)
+#define MI_MAKE_SOFTWARE_PTE(p, x) ((p)->u.Long = (x << MM_PTE_SOFTWARE_PROTECTION_BITS))
//
// Special values for LoadedImports
//
// This might happen...not sure yet
//
- DPRINT1("FAULT ON PAGE TABLES!\n");
+ DPRINT1("FAULT ON PAGE TABLES: %p %lx %lx!\n", Address, *PointerPte, *PointerPde);
//
// Map in the page table
//
PageFrameNumber = MmAllocPage(MC_NPPOOL);
- //
- // Get the PFN entry for it
- //
+ /* Get the PFN entry for it and fill it out */
Pfn1 = MiGetPfnEntry(PageFrameNumber);
+ Pfn1->u3.e2.ReferenceCount = 1;
+ Pfn1->u2.ShareCount = 1;
+ Pfn1->PteAddress = PointerPte;
+ Pfn1->u3.e1.PageLocation = ActiveAndValid;
+ Pfn1->u4.VerifierAllocation = 0;
- //
- // Write the PTE for it
- //
+ /* Write the PTE for it */
TempPte.u.Hard.PageFrameNumber = PageFrameNumber;
ASSERT(PointerPte->u.Hard.Valid == 0);
ASSERT(TempPte.u.Hard.Valid == 1);
// Next PTE
//
PointerPte++;
- ASSERT(PointerPte->u.Hard.Valid == 0);
//
// Get a page
//
// Write it
//
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
*PointerPte = TempPte;
}
// Acquire the PFN DB lock
//
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-
+
//
// Loop each stack page
//
while (LimitPte >= NewLimitPte)
{
- //
- // Sanity check
- //
- ASSERT(LimitPte->u.Hard.Valid == 0);
-
//
// Get a page
//
PageFrameIndex = MmAllocPage(MC_NPPOOL);
TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
- //
- // Write it
- //
+ /* Write the valid PTE */
+ ASSERT(LimitPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
*LimitPte-- = TempPte;
}