Fixed several off-by-one errors when playing with the PFN database array size. Among other things, certain valid pages would be considered invalid, and also the PFN database wouldn't be properly erased on startup (which would result in a crash after a warm reboot or restarting the emulator).

svn path=/trunk/; revision=32371
This commit is contained in:
ReactOS Portable Systems Group 2008-02-15 01:04:22 +00:00
parent d6cd3275f2
commit f19e397250

View file

@ -337,7 +337,7 @@ MmInitializePageList(IN PADDRESS_RANGE BIOSMemoryMap,
}
/* Clear the PFN database */
RtlZeroMemory(MmPageArray, MmPageArraySize * sizeof(PHYSICAL_PAGE));
RtlZeroMemory(MmPageArray, (MmPageArraySize + 1) * sizeof(PHYSICAL_PAGE));
/* This is what a used page looks like */
RtlZeroMemory(&UsedPage, sizeof(UsedPage));
@ -436,6 +436,7 @@ MmInitializePageList(IN PADDRESS_RANGE BIOSMemoryMap,
* Descriptor List, why bother, right?
*/
MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreeUnzeroedPageListHead,
&MmPageArray[i].ListEntry);
UnzeroedPageCount++;
@ -501,7 +502,7 @@ MmMarkPageMapped(PFN_TYPE Pfn)
KIRQL oldIrql;
PPHYSICAL_PAGE Page;
if (Pfn < MmPageArraySize)
if (Pfn <= MmPageArraySize)
{
KeAcquireSpinLock(&PageListLock, &oldIrql);
Page = MiGetPfnEntry(Pfn);
@ -523,7 +524,7 @@ MmMarkPageUnmapped(PFN_TYPE Pfn)
KIRQL oldIrql;
PPHYSICAL_PAGE Page;
if (Pfn < MmPageArraySize)
if (Pfn <= MmPageArraySize)
{
KeAcquireSpinLock(&PageListLock, &oldIrql);
Page = MiGetPfnEntry(Pfn);
@ -592,7 +593,7 @@ MmReferencePageUnsafe(PFN_TYPE Pfn)
DPRINT("MmReferencePageUnsafe(PysicalAddress %x)\n", Pfn << PAGE_SHIFT);
if (Pfn == 0 || Pfn >= MmPageArraySize)
if (Pfn == 0 || Pfn > MmPageArraySize)
{
return;
}
@ -616,11 +617,6 @@ MmReferencePage(PFN_TYPE Pfn)
{
DPRINT("MmReferencePage(PysicalAddress %x)\n", Pfn << PAGE_SHIFT);
if (Pfn == 0 || Pfn >= MmPageArraySize)
{
KEBUGCHECK(0);
}
MmReferencePageUnsafe(Pfn);
}
@ -634,11 +630,6 @@ MmGetReferenceCountPage(PFN_TYPE Pfn)
DPRINT("MmGetReferenceCountPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);
if (Pfn == 0 || Pfn >= MmPageArraySize)
{
KEBUGCHECK(0);
}
KeAcquireSpinLock(&PageListLock, &oldIrql);
Page = MiGetPfnEntry(Pfn);
if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)