PFN_NUMBER MmResidentAvailablePages;
PFN_NUMBER MmResidentAvailableAtInit;
-SIZE_T MmTotalCommitLimit;
SIZE_T MmTotalCommittedPages;
SIZE_T MmSharedCommit;
SIZE_T MmDriverCommit;
SIZE_T MmProcessCommit;
SIZE_T MmPagedPoolCommit;
-SIZE_T MmPeakCommitment;
+SIZE_T MmPeakCommitment;
SIZE_T MmtotalCommitLimitMaximum;
static RTL_BITMAP MiUserPfnBitMap;
/* Initialize it and clear all the bits to begin with */
RtlInitializeBitMap(&MiUserPfnBitMap,
Bitmap,
- MmHighestPhysicalPage + 1);
+ (ULONG)MmHighestPhysicalPage + 1);
RtlClearAllBits(&MiUserPfnBitMap);
}
if (Position == 0xFFFFFFFF) return 0;
/* Return it */
+ ASSERT(Position != 0);
+ ASSERT_IS_ROS_PFN(MiGetPfnEntry(Position));
return Position;
}
KIRQL OldIrql;
/* Set the page as a user page */
+ ASSERT(Pfn != 0);
+ ASSERT_IS_ROS_PFN(MiGetPfnEntry(Pfn));
+ ASSERT(!RtlCheckBit(&MiUserPfnBitMap, (ULONG)Pfn));
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- RtlSetBit(&MiUserPfnBitMap, Pfn);
+ RtlSetBit(&MiUserPfnBitMap, (ULONG)Pfn);
KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
/* Find the next user page */
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- Position = RtlFindSetBits(&MiUserPfnBitMap, 1, PreviousPfn + 1);
+ Position = RtlFindSetBits(&MiUserPfnBitMap, 1, (ULONG)PreviousPfn + 1);
KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
if (Position == 0xFFFFFFFF) return 0;
/* Return it */
+ ASSERT(Position != 0);
+ ASSERT_IS_ROS_PFN(MiGetPfnEntry(Position));
return Position;
}
NTAPI
MmRemoveLRUUserPage(PFN_NUMBER Page)
{
+ KIRQL OldIrql;
+
/* Unset the page as a user page */
- RtlClearBit(&MiUserPfnBitMap, Page);
+ ASSERT(Page != 0);
+ ASSERT_IS_ROS_PFN(MiGetPfnEntry(Page));
+ ASSERT(RtlCheckBit(&MiUserPfnBitMap, (ULONG)Page));
+ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+ RtlClearBit(&MiUserPfnBitMap, (ULONG)Page);
+ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
}
BOOLEAN
//
// Convert, and normalize, the high address into a PFN
//
- HighPage = (PFN_NUMBER)(HighAddress.QuadPart >> PAGE_SHIFT);
+ HighPage = (PFN_NUMBER)(HighAddress.QuadPart >> PAGE_SHIFT);
if (HighPage > MmHighestPhysicalPage) HighPage = MmHighestPhysicalPage;
//
while (PagesFound < PageCount)
{
/* Grab a page */
+ MI_SET_USAGE(MI_USAGE_MDL);
+ MI_SET_PROCESS2("Kernel");
Page = MiRemoveAnyPage(0);
if (Page == 0)
{
//
ASSERT(Pfn1->u3.e2.ReferenceCount == 0);
- //
- // Allocate it and mark it
- //
+ /* Now setup the page and mark it */
+ Pfn1->u3.e2.ReferenceCount = 1;
+ Pfn1->u2.ShareCount = 1;
+ MI_SET_PFN_DELETED(Pfn1);
+ Pfn1->u4.PteFrame = 0x1FFEDCB;
Pfn1->u3.e1.StartOfAllocation = 1;
Pfn1->u3.e1.EndOfAllocation = 1;
- Pfn1->u3.e2.ReferenceCount = 1;
+ Pfn1->u4.VerifierAllocation = 0;
//
// Save it into the MDL
/* Remove the page from the free or zero list */
ASSERT(Pfn1->u3.e1.ReadInProgress == 0);
+ MI_SET_USAGE(MI_USAGE_MDL);
+ MI_SET_PROCESS2("Kernel");
MiUnlinkFreeOrZeroedPage(Pfn1);
//
}
//
- // We're done, mark the pages as locked (should we lock them, though???)
+ // We're done, mark the pages as locked
//
Mdl->Process = NULL;
- Mdl->MdlFlags |= MDL_PAGES_LOCKED;
+ Mdl->MdlFlags |= MDL_PAGES_LOCKED;
return Mdl;
}
-VOID
-NTAPI
-MmDumpPfnDatabase(VOID)
-{
- /* Pretty useless for now, to be improved later */
- return;
-}
-
VOID
NTAPI
MmSetRmapListHeadPage(PFN_NUMBER Pfn, PMM_RMAP_ENTRY ListHead)
PFN_NUMBER PfnOffset;
PMMPFN Pfn1;
- if (Type != MC_SYSTEM)
- {
- PfnOffset = MiRemoveZeroPage(MI_GET_NEXT_COLOR());
- }
- else
- {
- PfnOffset = MiRemoveAnyPage(MI_GET_NEXT_COLOR());
- }
+ PfnOffset = MiRemoveZeroPage(MI_GET_NEXT_COLOR());
if (!PfnOffset)
{