if (MmPageArray[Start].MapCount != 0)
{
DbgPrint("Transfering mapped page.\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
RemoveEntryList(&MmPageArray[Start].ListEntry);
InsertTailList(&UsedPageListHeads[NewConsumer],
return((LARGE_INTEGER)((LONGLONG)start * PAGE_SIZE));
}
-VOID
+VOID INIT_FUNCTION
MiParseRangeToFreeList(PADDRESS_RANGE Range)
{
ULONG i, first, last;
first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE;
last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE);
- for (i = first; i < last; i++)
+ for (i = first; i < last && i < MmPageArraySize; i++)
{
if (MmPageArray[i].Flags.Type == 0)
{
}
}
-VOID
+VOID INIT_FUNCTION
MiParseRangeToBiosList(PADDRESS_RANGE Range)
{
ULONG i, first, last;
first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE;
last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE);
- for (i = first; i < last; i++)
+ for (i = first; i < last && i < MmPageArraySize; i++)
{
/* Remove the page from the free list if it is there */
if (MmPageArray[i].Flags.Type == MM_PHYSICAL_PAGE_FREE)
}
}
-VOID
-MiParseBIOSMemoryMap(ULONG MemorySizeInPages,
- PADDRESS_RANGE BIOSMemoryMap,
+VOID INIT_FUNCTION
+MiParseBIOSMemoryMap(PADDRESS_RANGE BIOSMemoryMap,
ULONG AddressRangeCount)
{
PADDRESS_RANGE p;
ULONG i;
p = BIOSMemoryMap;
- for (i = 0; i < AddressRangeCount; i++)
+ for (i = 0; i < AddressRangeCount; i++, p++)
{
- if (((p->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE) < MemorySizeInPages)
+ if (p->Type == 1)
{
- if (p->Type == 1)
- {
- MiParseRangeToFreeList(p);
- }
- else
- {
- MiParseRangeToBiosList(p);
- }
+ MiParseRangeToFreeList(p);
+ }
+ else
+ {
+ MiParseRangeToBiosList(p);
}
- p += 1;
}
}
-PVOID
+PVOID INIT_FUNCTION
MmInitializePageList(PVOID FirstPhysKernelAddress,
PVOID LastPhysKernelAddress,
ULONG MemorySizeInPages,
if (!NT_SUCCESS(Status))
{
DbgPrint("Unable to create virtual mapping\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
}
memset((PVOID)MmPageArray + (i * PAGE_SIZE), 0, PAGE_SIZE);
if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0))
{
MiParseBIOSMemoryMap(
- MemorySizeInPages,
BIOSMemoryMap,
AddressRangeCount);
}
MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages +
MmStats.NrReservedPages + MmStats.NrUserPages;
- MmInitializeBalancer(MmStats.NrFreePages);
+ MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages + MmStats.NrReservedPages);
return((PVOID)LastKernelAddress);
}
if (MmPageArray[Start].Flags.Type == MM_PHYSICAL_PAGE_FREE)
{
DbgPrint("Mapping non-used page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
MmPageArray[Start].MapCount++;
KeReleaseSpinLock(&PageListLock, oldIrql);
if (MmPageArray[Start].Flags.Type == MM_PHYSICAL_PAGE_FREE)
{
DbgPrint("Unmapping non-used page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (MmPageArray[Start].MapCount == 0)
{
DbgPrint("Unmapping not mapped page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
MmPageArray[Start].MapCount--;
KeReleaseSpinLock(&PageListLock, oldIrql);
if (PhysicalAddress.u.LowPart == 0)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
KeAcquireSpinLock(&PageListLock, &oldIrql);
if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DbgPrint("Referencing non-used page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
MmPageArray[Start].ReferenceCount++;
if (PhysicalAddress.u.LowPart == 0)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
KeAcquireSpinLock(&PageListLock, &oldIrql);
if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DbgPrint("Getting reference count for free page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
RCount = MmPageArray[Start].ReferenceCount;
if (PhysicalAddress.u.LowPart == 0)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED &&
if (PhysicalAddress.u.LowPart == 0)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
KeAcquireSpinLock(&PageListLock, &oldIrql);
if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DbgPrint("Dereferencing free page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
MmPageArray[Start].ReferenceCount--;
if (MmPageArray[Start].RmapListHead != NULL)
{
DbgPrint("Freeing page with rmap entries.\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (MmPageArray[Start].MapCount != 0)
{
DbgPrint("Freeing mapped page (0x%I64x count %d)\n",
PhysicalAddress, MmPageArray[Start].MapCount);
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (MmPageArray[Start].LockCount > 0)
{
DbgPrint("Freeing locked page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (MmPageArray[Start].SavedSwapEntry != 0)
{
DbgPrint("Freeing page with swap entry.\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DbgPrint("Freeing page with flags %x\n",
MmPageArray[Start].Flags.Type);
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
MmPageArray[Start].Flags.Type = MM_PHYSICAL_PAGE_FREE;
InsertTailList(&FreeUnzeroedPageListHead,
if (PhysicalAddress.u.LowPart == 0)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
KeAcquireSpinLock(&PageListLock, &oldIrql);
if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DbgPrint("Getting lock count for free page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
LockCount = MmPageArray[Start].LockCount;
if (PhysicalAddress.u.LowPart == 0)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
KeAcquireSpinLock(&PageListLock, &oldIrql);
if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DbgPrint("Locking free page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
MmPageArray[Start].LockCount++;
if (PhysicalAddress.u.LowPart == 0)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
KeAcquireSpinLock(&PageListLock, &oldIrql);
if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
{
DbgPrint("Unlocking free page\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
MmPageArray[Start].LockCount--;
if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE)
{
DbgPrint("Got non-free page from freelist\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
if (PageDescriptor->MapCount != 0)
{
DbgPrint("Got mapped page from freelist\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
PageDescriptor->Flags.Consumer = Consumer;
if (PageDescriptor->MapCount != 0)
{
DbgPrint("Returning mapped page.\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
return(PageOffset);
}
if (!NT_SUCCESS(Status))
{
DbgPrint("ZeroPageThread: Wait failed\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
return(STATUS_UNSUCCESSFUL);
}
if (!NT_SUCCESS(Status))
{
DbgPrint("Unable to create virtual mapping\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
}
memset(Address, 0, PAGE_SIZE);
if (PageDescriptor->MapCount != 0)
{
DbgPrint("Mapped page on freelist.\n");
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE;
InsertHeadList(&FreeZeroedPageListHead, ListEntry);
}
}
-NTSTATUS MmInitZeroPageThread(VOID)
+NTSTATUS INIT_FUNCTION
+MmInitZeroPageThread(VOID)
{
KPRIORITY Priority;
NTSTATUS Status;
NULL,
NULL,
&ZeroPageThreadId,
- MmZeroPageThreadMain,
+ (PKSTART_ROUTINE) MmZeroPageThreadMain,
NULL);
if (!NT_SUCCESS(Status))
{