-VOID
-NTAPI
-MmInitializePageList(VOID)
-{
- ULONG i;
- PHYSICAL_PAGE UsedPage;
- PMEMORY_ALLOCATION_DESCRIPTOR Md;
- PLIST_ENTRY NextEntry;
- ULONG NrSystemPages = 0;
- KIRQL OldIrql;
-
- /* This is what a used page looks like */
- RtlZeroMemory(&UsedPage, sizeof(UsedPage));
- UsedPage.u3.e1.PageLocation = ActiveAndValid;
- UsedPage.u3.e2.ReferenceCount = 1;
-
- /* Lock PFN database */
- OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-
- /* Loop the memory descriptors */
- for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink;
- NextEntry != &KeLoaderBlock->MemoryDescriptorListHead;
- NextEntry = NextEntry->Flink)
- {
- /* Get the descriptor */
- Md = CONTAINING_RECORD(NextEntry,
- MEMORY_ALLOCATION_DESCRIPTOR,
- ListEntry);
-
- /* Skip bad memory */
- if ((Md->MemoryType == LoaderFirmwarePermanent) ||
- (Md->MemoryType == LoaderBBTMemory) ||
- (Md->MemoryType == LoaderSpecialMemory) ||
- (Md->MemoryType == LoaderBad))
- {
- //
- // We do not build PFN entries for this
- //
- continue;
- }
- else if ((Md->MemoryType == LoaderFree) ||
- (Md->MemoryType == LoaderLoadedProgram) ||
- (Md->MemoryType == LoaderFirmwareTemporary) ||
- (Md->MemoryType == LoaderOsloaderStack))
- {
- /* Loop every page part of the block */
- for (i = 0; i < Md->PageCount; i++)
- {
- /* Mark it as a free page */
- MmPfnDatabase[0][Md->BasePage + i].u3.e1.PageLocation = FreePageList;
- MiInsertInListTail(&MmFreePageListHead,
- &MmPfnDatabase[0][Md->BasePage + i]);
- MmAvailablePages++;
- }
- }
- else
- {
- /* Loop every page part of the block */
- for (i = 0; i < Md->PageCount; i++)
- {
- /* Everything else is used memory */
- MmPfnDatabase[0][Md->BasePage + i] = UsedPage;
- NrSystemPages++;
- }
- }
- }
-
- /* Finally handle the pages describing the PFN database themselves */
- for (i = MxOldFreeDescriptor.BasePage; i < MxFreeDescriptor->BasePage; i++)
- {
- /* Mark it as used kernel memory */
- MmPfnDatabase[0][i] = UsedPage;
- NrSystemPages++;
- }
-
- /* Release the PFN database lock */
- KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-
- KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE);
- DPRINT("Pages: %x %x\n", MmAvailablePages, NrSystemPages);
- MmInitializeBalancer(MmAvailablePages, NrSystemPages);
-}
-