mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 00:43:21 +00:00
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:
parent
d6cd3275f2
commit
f19e397250
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue