mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
Bounds checking in MmMarkPage(Un)Mapped, call MmMarkPageMapped from
MmMapIoSpace() for symmetry with MmUnmapIoSpace() svn path=/trunk/; revision=4938
This commit is contained in:
parent
ba8e03d72f
commit
500b7199f9
2 changed files with 23 additions and 13 deletions
|
@ -40,6 +40,7 @@ typedef struct _PHYSICAL_PAGE
|
||||||
/* GLOBALS ****************************************************************/
|
/* GLOBALS ****************************************************************/
|
||||||
|
|
||||||
static PPHYSICAL_PAGE MmPageArray;
|
static PPHYSICAL_PAGE MmPageArray;
|
||||||
|
static ULONG MmPageArraySize;
|
||||||
|
|
||||||
static KSPIN_LOCK PageListLock;
|
static KSPIN_LOCK PageListLock;
|
||||||
static LIST_ENTRY UsedPageListHeads[MC_MAXIMUM];
|
static LIST_ENTRY UsedPageListHeads[MC_MAXIMUM];
|
||||||
|
@ -303,8 +304,9 @@ MmInitializePageList(PVOID FirstPhysKernelAddress,
|
||||||
|
|
||||||
LastKernelAddress = PAGE_ROUND_UP(LastKernelAddress);
|
LastKernelAddress = PAGE_ROUND_UP(LastKernelAddress);
|
||||||
|
|
||||||
|
MmPageArraySize = MemorySizeInPages;
|
||||||
Reserved =
|
Reserved =
|
||||||
PAGE_ROUND_UP((MemorySizeInPages * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE;
|
PAGE_ROUND_UP((MmPageArraySize * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE;
|
||||||
MmPageArray = (PHYSICAL_PAGE *)LastKernelAddress;
|
MmPageArray = (PHYSICAL_PAGE *)LastKernelAddress;
|
||||||
|
|
||||||
DPRINT("Reserved %d\n", Reserved);
|
DPRINT("Reserved %d\n", Reserved);
|
||||||
|
@ -490,23 +492,29 @@ MmGetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress)
|
||||||
VOID
|
VOID
|
||||||
MmMarkPageMapped(PHYSICAL_ADDRESS PhysicalAddress)
|
MmMarkPageMapped(PHYSICAL_ADDRESS PhysicalAddress)
|
||||||
{
|
{
|
||||||
ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE;
|
ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
|
|
||||||
KeAcquireSpinLock(&PageListLock, &oldIrql);
|
if (Start < MmPageArraySize)
|
||||||
MmPageArray[Start].MapCount++;
|
{
|
||||||
KeReleaseSpinLock(&PageListLock, oldIrql);
|
KeAcquireSpinLock(&PageListLock, &oldIrql);
|
||||||
|
MmPageArray[Start].MapCount++;
|
||||||
|
KeReleaseSpinLock(&PageListLock, oldIrql);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
MmMarkPageUnmapped(PHYSICAL_ADDRESS PhysicalAddress)
|
MmMarkPageUnmapped(PHYSICAL_ADDRESS PhysicalAddress)
|
||||||
{
|
{
|
||||||
ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE;
|
ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
|
|
||||||
KeAcquireSpinLock(&PageListLock, &oldIrql);
|
if (Start < MmPageArraySize)
|
||||||
MmPageArray[Start].MapCount--;
|
{
|
||||||
KeReleaseSpinLock(&PageListLock, oldIrql);
|
KeAcquireSpinLock(&PageListLock, &oldIrql);
|
||||||
|
MmPageArray[Start].MapCount--;
|
||||||
|
KeReleaseSpinLock(&PageListLock, oldIrql);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* 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
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/mm/iospace.c
|
* FILE: ntoskrnl/mm/iospace.c
|
||||||
|
@ -110,6 +110,8 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||||
DbgPrint("Unable to create virtual mapping\n");
|
DbgPrint("Unable to create virtual mapping\n");
|
||||||
KeBugCheck(0);
|
KeBugCheck(0);
|
||||||
}
|
}
|
||||||
|
MmMarkPageMapped((PHYSICAL_ADDRESS) (PhysicalAddress.QuadPart +
|
||||||
|
(i * PAGE_SIZE)));
|
||||||
}
|
}
|
||||||
return ((PVOID)(Result + PhysicalAddress.QuadPart % PAGE_SIZE));
|
return ((PVOID)(Result + PhysicalAddress.QuadPart % PAGE_SIZE));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue