diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 4a017592b79..0ffd15fd375 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -40,6 +40,7 @@ typedef struct _PHYSICAL_PAGE /* GLOBALS ****************************************************************/ static PPHYSICAL_PAGE MmPageArray; +static ULONG MmPageArraySize; static KSPIN_LOCK PageListLock; static LIST_ENTRY UsedPageListHeads[MC_MAXIMUM]; @@ -303,8 +304,9 @@ MmInitializePageList(PVOID FirstPhysKernelAddress, LastKernelAddress = PAGE_ROUND_UP(LastKernelAddress); + MmPageArraySize = MemorySizeInPages; Reserved = - PAGE_ROUND_UP((MemorySizeInPages * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE; + PAGE_ROUND_UP((MmPageArraySize * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE; MmPageArray = (PHYSICAL_PAGE *)LastKernelAddress; DPRINT("Reserved %d\n", Reserved); @@ -490,23 +492,29 @@ MmGetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress) VOID MmMarkPageMapped(PHYSICAL_ADDRESS PhysicalAddress) { - ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; - KIRQL oldIrql; - - KeAcquireSpinLock(&PageListLock, &oldIrql); - MmPageArray[Start].MapCount++; - KeReleaseSpinLock(&PageListLock, oldIrql); + ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; + KIRQL oldIrql; + + if (Start < MmPageArraySize) + { + KeAcquireSpinLock(&PageListLock, &oldIrql); + MmPageArray[Start].MapCount++; + KeReleaseSpinLock(&PageListLock, oldIrql); + } } VOID MmMarkPageUnmapped(PHYSICAL_ADDRESS PhysicalAddress) { - ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; - KIRQL oldIrql; + ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; + KIRQL oldIrql; - KeAcquireSpinLock(&PageListLock, &oldIrql); - MmPageArray[Start].MapCount--; - KeReleaseSpinLock(&PageListLock, oldIrql); + if (Start < MmPageArraySize) + { + KeAcquireSpinLock(&PageListLock, &oldIrql); + MmPageArray[Start].MapCount--; + KeReleaseSpinLock(&PageListLock, oldIrql); + } } ULONG diff --git a/reactos/ntoskrnl/mm/iospace.c b/reactos/ntoskrnl/mm/iospace.c index e5d0fffccf4..848df0f6ec7 100644 --- a/reactos/ntoskrnl/mm/iospace.c +++ b/reactos/ntoskrnl/mm/iospace.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: iospace.c,v 1.18 2003/05/17 15:28:58 ekohl Exp $ +/* $Id: iospace.c,v 1.19 2003/06/21 14:30:42 gvg Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/iospace.c @@ -110,6 +110,8 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, DbgPrint("Unable to create virtual mapping\n"); KeBugCheck(0); } + MmMarkPageMapped((PHYSICAL_ADDRESS) (PhysicalAddress.QuadPart + + (i * PAGE_SIZE))); } return ((PVOID)(Result + PhysicalAddress.QuadPart % PAGE_SIZE)); }