mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
Change page file PTE format to distinguish paged out pages from
noaccess pages. It fixes kernel crash at the end of Sun JRE setup. svn path=/trunk/; revision=39681
This commit is contained in:
parent
4f7122ff29
commit
e884b38e1f
2 changed files with 12 additions and 10 deletions
|
@ -671,7 +671,7 @@ BOOLEAN
|
|||
NTAPI
|
||||
MmIsPagePresent(PEPROCESS Process, PVOID Address)
|
||||
{
|
||||
return MmGetPageEntryForProcess(Process, Address) & PA_PRESENT ? TRUE : FALSE;
|
||||
return MmGetPageEntryForProcess(Process, Address) & PA_PRESENT;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
|
@ -680,7 +680,7 @@ MmIsPageSwapEntry(PEPROCESS Process, PVOID Address)
|
|||
{
|
||||
ULONG Entry;
|
||||
Entry = MmGetPageEntryForProcess(Process, Address);
|
||||
return !(Entry & PA_PRESENT) && Entry != 0 ? TRUE : FALSE;
|
||||
return !(Entry & PA_PRESENT) && (Entry & 0x800) && Entry != 0;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
|
@ -841,7 +841,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
|
|||
if (PageCount > 0x10000 ||
|
||||
(ULONG_PTR) Address / PAGE_SIZE + PageCount > 0x100000)
|
||||
{
|
||||
DPRINT1("Page count to large\n");
|
||||
DPRINT1("Page count too large\n");
|
||||
KeBugCheck(MEMORY_MANAGEMENT);
|
||||
}
|
||||
}
|
||||
|
@ -856,7 +856,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
|
|||
(ULONG_PTR) Address / PAGE_SIZE + PageCount >
|
||||
(ULONG_PTR)MmSystemRangeStart / PAGE_SIZE)
|
||||
{
|
||||
DPRINT1("Page Count to large\n");
|
||||
DPRINT1("Page Count too large\n");
|
||||
KeBugCheck(MEMORY_MANAGEMENT);
|
||||
}
|
||||
}
|
||||
|
@ -909,13 +909,14 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
|
|||
|
||||
Pte = *Pt;
|
||||
MmMarkPageMapped(Pages[i]);
|
||||
if (PAGE_MASK((Pte)) != 0 && !((Pte) & PA_PRESENT))
|
||||
if (PAGE_MASK(Pte) != 0 && !(Pte & PA_PRESENT) && (Pte & 0x800))
|
||||
{
|
||||
DPRINT1("Bad PTE %lx\n", Pte);
|
||||
KeBugCheck(MEMORY_MANAGEMENT);
|
||||
}
|
||||
if (PAGE_MASK((Pte)) != 0)
|
||||
if (PAGE_MASK(Pte) != 0)
|
||||
{
|
||||
MmMarkPageUnmapped(PTE_TO_PFN((Pte)));
|
||||
MmMarkPageUnmapped(PTE_TO_PFN(Pte));
|
||||
}
|
||||
InterlockedExchangePte(Pt, PFN_TO_PTE(Pages[i]) | Attributes);
|
||||
if (Pte != 0)
|
||||
|
@ -1014,6 +1015,7 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
|
|||
Process, Address, flProtect);
|
||||
|
||||
Attributes = ProtectToPTE(flProtect);
|
||||
|
||||
if (Attributes & 0x80000000)
|
||||
{
|
||||
NoExecute = TRUE;
|
||||
|
|
|
@ -117,9 +117,9 @@ ULONG MmCoreDumpType = MM_CORE_DUMP_TYPE_NONE;
|
|||
/*
|
||||
* Translate between a swap entry and a file and offset pair.
|
||||
*/
|
||||
#define FILE_FROM_ENTRY(i) ((i) >> 24)
|
||||
#define OFFSET_FROM_ENTRY(i) (((i) & 0xffffff) - 1)
|
||||
#define ENTRY_FROM_FILE_OFFSET(i, j) (((i) << 24) | ((j) + 1))
|
||||
#define FILE_FROM_ENTRY(i) ((i) & 0x0f)
|
||||
#define OFFSET_FROM_ENTRY(i) ((i) >> 11)
|
||||
#define ENTRY_FROM_FILE_OFFSET(i, j) ((i) | (j) << 11 | 0x400)
|
||||
|
||||
static BOOLEAN MmSwapSpaceMessage = FALSE;
|
||||
|
||||
|
|
Loading…
Reference in a new issue