Author: fireball
Date: Sun Dec 28 04:16:59 2008
New Revision: 38404
URL:
http://svn.reactos.org/svn/reactos?rev=38404&view=rev
Log:
- Update to trunk (makes it 6kb less too).
Modified:
branches/cache_manager_rewrite/mm.patch (contents, props changed)
Modified: branches/cache_manager_rewrite/mm.patch
URL:
http://svn.reactos.org/svn/reactos/branches/cache_manager_rewrite/mm.patch?…
==============================================================================
--- branches/cache_manager_rewrite/mm.patch [iso-8859-1] (original)
+++ branches/cache_manager_rewrite/mm.patch [iso-8859-1] Sun Dec 28 04:16:59 2008
@@ -1,14 +1,8 @@
-Index: mm/elf.inc.h
-===================================================================
---- mm/elf.inc.h (revision 34040)
-+++ mm/elf.inc.h (working copy)
-@@ -1,3 +1,5 @@
-+#include <ntoskrnl.h>
-+
- #define NDEBUG
- #include <internal/debug.h>
-
-@@ -444,6 +446,7 @@
+Index: elf.inc.h
+===================================================================
+--- elf.inc.h (revision 38402)
++++ elf.inc.h (working copy)
+@@ -444,6 +444,7 @@
nReadStatus = ReadFileCb
(
File,
@@ -16,36 +10,11 @@
&lnOffset,
cbPHdrSize,
&pData,
-Index: mm/elf32.c
-===================================================================
---- mm/elf32.c (revision 34040)
-+++ mm/elf32.c (working copy)
-@@ -6,7 +6,7 @@
- *
- * PROGRAMMERS: No programmer listed.
- */
--#include <ntoskrnl.h>
-+
- #define __ELF_WORD_SIZE 32
- #include "elf.inc.h"
-
-Index: mm/elf64.c
-===================================================================
---- mm/elf64.c (revision 34040)
-+++ mm/elf64.c (working copy)
-@@ -6,6 +6,6 @@
- *
- * PROGRAMMERS: No programmer listed.
- */
--#include <ntoskrnl.h>
-+
- #define __ELF_WORD_SIZE 64
- #include "elf.inc.h"
-Index: mm/freelist.c
-===================================================================
---- mm/freelist.c (revision 34040)
-+++ mm/freelist.c (working copy)
-@@ -634,6 +634,12 @@
+Index: freelist.c
+===================================================================
+--- freelist.c (revision 38402)
++++ freelist.c (working copy)
+@@ -632,6 +632,12 @@
}
ULONG
@@ -58,11 +27,11 @@
NTAPI
MmGetLockCountPage(PFN_TYPE Pfn)
{
-Index: mm/mm.c
-===================================================================
---- mm/mm.c (revision 34040)
-+++ mm/mm.c (working copy)
-@@ -246,6 +246,7 @@
+Index: mm.c
+===================================================================
+--- mm.c (revision 38402)
++++ mm.c (working copy)
+@@ -277,6 +277,7 @@
break;
case MEMORY_AREA_SECTION_VIEW:
@@ -70,11 +39,11 @@
Status = MmNotPresentFaultSectionView(AddressSpace,
MemoryArea,
(PVOID)Address,
-Index: mm/mminit.c
-===================================================================
---- mm/mminit.c (revision 34040)
-+++ mm/mminit.c (working copy)
-@@ -67,6 +67,9 @@
+Index: mminit.c
+===================================================================
+--- mminit.c (revision 38402)
++++ mminit.c (working copy)
+@@ -68,6 +68,9 @@
FALSE;
#endif
@@ -84,19 +53,19 @@
/* PRIVATE FUNCTIONS *********************************************************/
VOID
-@@ -509,6 +512,7 @@
- MmInitBsmThread();
-
+@@ -509,6 +512,7 @@
/* FIXME: Read parameters from memory */
+ }
+
+ MmInitSectionImplementation2();
- }
-
return TRUE;
-Index: mm/mpw.c
-===================================================================
---- mm/mpw.c (revision 34040)
-+++ mm/mpw.c (working copy)
-@@ -88,7 +88,7 @@
+ }
+
+Index: mpw.c
+===================================================================
+--- mpw.c (revision 38402)
++++ mpw.c (working copy)
+@@ -88,7 +88,7 @@
MmWriteDirtyPages(128, &PagesWritten);
#endif
@@ -105,22 +74,21 @@
}
}
-Index: mm/pagefile.c
-===================================================================
---- mm/pagefile.c (revision 34040)
-+++ mm/pagefile.c (working copy)
-@@ -1,5 +1,4 @@
--/*
+Index: pagefile.c
+===================================================================
+--- pagefile.c (revision 38402)
++++ pagefile.c (working copy)
+@@ -1,5 +1,4 @@
+ /*
- * ReactOS kernel
-+/* ReactOS kernel
* Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
-Index: mm/pageop.c
-===================================================================
---- mm/pageop.c (revision 34040)
-+++ mm/pageop.c (working copy)
-@@ -81,14 +81,23 @@
+Index: pageop.c
+===================================================================
+--- pageop.c (revision 38402)
++++ pageop.c (working copy)
+@@ -81,14 +81,23 @@
/*
* Calcuate the hash value for pageop structure
*/
@@ -140,13 +108,13 @@
+ {
+ Hash = 0;
+ DPRINT1("MmCheckForPageOp was called for %d\n", MArea->Type);
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
Hash = Hash % PAGEOP_HASH_TABLE_SIZE;
KeAcquireSpinLock(&MmPageOpHashTableLock, &oldIrql);
-@@ -99,7 +108,8 @@
+@@ -99,7 +108,8 @@
PageOp = MmPageOpHashTable[Hash];
while (PageOp != NULL)
{
@@ -156,7 +124,7 @@
{
if (PageOp->Segment == Segment &&
PageOp->Offset == Offset)
-@@ -149,14 +159,22 @@
+@@ -149,14 +159,22 @@
/*
* Calcuate the hash value for pageop structure
*/
@@ -176,12 +144,12 @@
+ {
+ Hash = 0;
+ DPRINT1("MmGetPageOp was called for %d\n", MArea->Type);
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
Hash = Hash % PAGEOP_HASH_TABLE_SIZE;
KeAcquireSpinLock(&MmPageOpHashTableLock, &oldIrql);
-@@ -167,7 +185,8 @@
+@@ -167,7 +185,8 @@
PageOp = MmPageOpHashTable[Hash];
while (PageOp != NULL)
{
@@ -191,7 +159,7 @@
{
if (PageOp->Segment == Segment &&
PageOp->Offset == Offset)
-@@ -215,15 +234,16 @@
+@@ -215,15 +234,16 @@
return(NULL);
}
@@ -213,7 +181,7 @@
}
PageOp->ReferenceCount = 1;
PageOp->Next = MmPageOpHashTable[Hash];
-@@ -258,11 +278,3 @@
+@@ -258,11 +278,3 @@
50);
}
@@ -225,11 +193,11 @@
-
-
-
-Index: mm/pe.c
-===================================================================
---- mm/pe.c (revision 34040)
-+++ mm/pe.c (working copy)
-@@ -240,7 +240,7 @@
+Index: pe.c
+===================================================================
+--- pe.c (revision 38402)
++++ pe.c (working copy)
+@@ -240,7 +240,7 @@
lnOffset.QuadPart = pidhDosHeader->e_lfanew;
/* read the header from the file */
@@ -238,7 +206,7 @@
if(!NT_SUCCESS(nStatus))
DIE(("ReadFile failed, status %08X\n", nStatus));
-@@ -522,7 +522,7 @@
+@@ -533,7 +533,7 @@
lnOffset.QuadPart = cbSectionHeadersOffset;
/* read the header from the file */
@@ -247,11 +215,11 @@
if(!NT_SUCCESS(nStatus))
DIE(("ReadFile failed with status %08X\n", nStatus));
-Index: mm/rmap.c
-===================================================================
---- mm/rmap.c (revision 34040)
-+++ mm/rmap.c (working copy)
-@@ -299,6 +299,17 @@
+Index: rmap.c
+===================================================================
+--- rmap.c (revision 38402)
++++ rmap.c (working copy)
+@@ -299,6 +299,17 @@
Status = MmPageOutVirtualMemory(AddressSpace, MemoryArea,
Address, PageOp);
}
@@ -261,28 +229,19 @@
+ * We do not need to write the page to the pagefile if is a
+ * cache segment: It will be reloaded from the original file
+ */
-+ MmDeleteVirtualMapping(AddressSpace->Process, (PVOID)Address, FALSE, NULL,
NULL);
++ MmDeleteVirtualMapping(Process, (PVOID)Address, FALSE, NULL, NULL);
+ MmUnlockAddressSpace(AddressSpace);
+ MmDeleteAllRmaps(Page, NULL, NULL);
+ MmReleasePageMemoryConsumer(MC_CACHE, Page);
+ }
else
{
- KEBUGCHECK(0);
-Index: mm/section.c
-===================================================================
---- mm/section.c (revision 34040)
-+++ mm/section.c (working copy)
-@@ -31,7 +31,7 @@
- * Ge van Geldorp
- * Royce Mitchell III
- * Filip Navara
-- * Aleksey Bragin
-+ * Aleksey Bragin
- * Jason Filby
- * Thomas Weidenmueller
- * Gunnar Andre' Dalsnes
-@@ -62,6 +62,7 @@
+ KeBugCheck(MEMORY_MANAGEMENT);
+Index: section.c
+===================================================================
+--- section.c (revision 38402)
++++ section.c (working copy)
+@@ -62,6 +62,7 @@
PROS_SECTION_OBJECT Section;
PMM_SECTION_SEGMENT Segment;
ULONG Offset;
@@ -290,7 +249,7 @@
BOOLEAN WasDirty;
BOOLEAN Private;
}
-@@ -69,8 +70,28 @@
+@@ -69,8 +70,28 @@
/* GLOBALS *******************************************************************/
@@ -319,15 +278,7 @@
static GENERIC_MAPPING MmpSectionMapping = {
STANDARD_RIGHTS_READ | SECTION_MAP_READ | SECTION_QUERY,
STANDARD_RIGHTS_WRITE | SECTION_MAP_WRITE,
-@@ -79,7 +100,6 @@
-
- #define PAGE_FROM_SSE(E) ((E) & 0xFFFFF000)
- #define PFN_FROM_SSE(E) ((E) >> PAGE_SHIFT)
--#define SHARE_COUNT_FROM_SSE(E) (((E) & 0x00000FFE) >> 1)
- #define IS_SWAP_FROM_SSE(E) ((E) & 0x00000001)
- #define MAX_SHARE_COUNT 0x7FF
- #define MAKE_SSE(P, C) ((P) | ((C) << 1))
-@@ -94,6 +114,14 @@
+@@ -94,6 +115,14 @@
/* FUNCTIONS *****************************************************************/
@@ -342,16 +293,7 @@
PFILE_OBJECT
NTAPI
MmGetFileObjectForSection(IN PROS_SECTION_OBJECT Section)
-@@ -153,7 +181,7 @@
- /*
- * FIXME: TODO.
- * Filip says to get the MADDRESS_SPACE from EPROCESS,
-- * then use the MmMarea routines to locate the Marea that
-+ * then use the MmMarea routines to locate the Marea that
- * corresponds to the address. Then make sure it's a section
- * view type (MEMORY_AREA_SECTION_VIEW) and use the marea's
- * per-type union to get the .u.SectionView.Section pointer to
-@@ -200,20 +228,6 @@
+@@ -241,20 +270,6 @@
MmReleasePageOp(PageOp);
}
@@ -372,7 +314,7 @@
VOID
MmFreePageTablesSectionSegment(PMM_SECTION_SEGMENT Segment)
{
-@@ -230,18 +244,17 @@
+@@ -271,18 +286,17 @@
}
}
@@ -396,9 +338,9 @@
NrSegments = ImageSectionObject->NrSegments;
SectionSegments = ImageSectionObject->Segments;
for (i = 0; i < NrSegments; i++)
-@@ -252,46 +265,268 @@
+@@ -293,46 +307,268 @@
SectionSegments[i].ReferenceCount);
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
+ Length = PAGE_ROUND_UP(SectionSegments[i].Length);
+ for (Offset = 0; Offset < Length; Offset += PAGE_SIZE)
@@ -408,11 +350,11 @@
+ {
+ if (IS_SWAP_FROM_SSE(Entry))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else if (MmGetRmapListHeadPage(PFN_FROM_SSE(Entry)))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else
+ {
@@ -463,7 +405,7 @@
+ KEVENT Event;
+ IO_STATUS_BLOCK Iosb;
+ NTSTATUS Status;
-+ BOOL FoundPageOp;
++ BOOLEAN FoundPageOp;
+ PMM_PAGEOP PageOp;
+
+ UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)];
@@ -480,7 +422,7 @@
if (Segment->ReferenceCount != 0)
{
DPRINT1("Data segment still referenced\n");
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
+ Length = PAGE_ROUND_UP(Segment->Length);
+ Offset = 0;
@@ -494,7 +436,7 @@
+ if (Status != STATUS_SUCCESS)
+ {
+ DPRINT1("Failed to wait for page op, status = %x\n", Status);
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ MmLockSectionSegment(Segment);
+ MmspCompleteAndReleasePageOp(PageOp);
@@ -513,11 +455,11 @@
+ {
+ if (IS_SWAP_FROM_SSE(Entry))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else if (MmGetRmapListHeadPage(PFN_FROM_SSE(Entry)))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else
+ {
@@ -590,7 +532,7 @@
+ TAG_SECTION_PAGE_TABLE);
+ if (Table == NULL)
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ memcpy(Table, Segment->PageDirectory.PageTables,
sizeof(SECTION_PAGE_TABLE));
+ memset(Segment->PageDirectory.PageTables, 0,
sizeof(SECTION_PAGE_TABLE));
@@ -616,7 +558,7 @@
+ {
+ if (i >
PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(PAGE_ROUND_UP(Segment->Length)))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ if (i == PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(PAGE_ROUND_UP(NewLength))
&&
+ PAGE_ROUND_UP(NewLength) % (NR_SECTION_PAGE_TABLES * PAGE_SIZE))
@@ -631,7 +573,7 @@
+ {
+ if(Table->Entry[j])
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ }
+ if (i >
PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(PAGE_ROUND_UP(NewLength)))
@@ -648,7 +590,7 @@
+ {
+ if (Segment->PageDirectory.PageTables[i])
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ }
+ }
@@ -680,40 +622,7 @@
MmSetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
ULONG Offset,
ULONG Entry)
-@@ -358,32 +593,6 @@
- return(Entry);
- }
-
--VOID
--NTAPI
--MmSharePageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
-- ULONG Offset)
--{
-- ULONG Entry;
--
-- Entry = MmGetPageEntrySectionSegment(Segment, Offset);
-- if (Entry == 0)
-- {
-- DPRINT1("Entry == 0 for MmSharePageEntrySectionSegment\n");
-- KEBUGCHECK(0);
-- }
-- if (SHARE_COUNT_FROM_SSE(Entry) == MAX_SHARE_COUNT)
-- {
-- DPRINT1("Maximum share count reached\n");
-- KEBUGCHECK(0);
-- }
-- if (IS_SWAP_FROM_SSE(Entry))
-- {
-- KEBUGCHECK(0);
-- }
-- Entry = MAKE_SSE(PAGE_FROM_SSE(Entry), SHARE_COUNT_FROM_SSE(Entry) + 1);
-- MmSetPageEntrySectionSegment(Segment, Offset, Entry);
--}
--
- BOOLEAN
- NTAPI
- MmUnsharePageEntrySectionSegment(PROS_SECTION_OBJECT Section,
-@@ -393,7 +602,9 @@
+@@ -434,7 +670,9 @@
BOOLEAN PageOut)
{
ULONG Entry;
@@ -724,18 +633,18 @@
Entry = MmGetPageEntrySectionSegment(Segment, Offset);
if (Entry == 0)
-@@ -401,26 +612,21 @@
+@@ -442,26 +680,21 @@
DPRINT1("Entry == 0 for MmUnsharePageEntrySectionSegment\n");
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
- if (SHARE_COUNT_FROM_SSE(Entry) == 0)
- {
- DPRINT1("Zero share count for unshare\n");
-- KEBUGCHECK(0);
+- KeBugCheck(MEMORY_MANAGEMENT);
- }
if (IS_SWAP_FROM_SSE(Entry))
{
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
- Entry = MAKE_SSE(PAGE_FROM_SSE(Entry), SHARE_COUNT_FROM_SSE(Entry) - 1);
+ Page = PFN_FROM_SSE(Entry);
@@ -755,7 +664,7 @@
BOOLEAN IsImageSection;
ULONG FileOffset;
-@@ -428,326 +634,430 @@
+@@ -469,327 +702,430 @@
IsImageSection = Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE;
@@ -786,11 +695,11 @@
+ if (SavedSwapEntry)
{
- DPRINT1("CcRosUnmapCacheSegment failed, status = %x\n",
Status);
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
+ if (Dirty || (Entry & 0x2))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
}
- }
@@ -814,7 +723,7 @@
- MmSetPageEntrySectionSegment(Segment, Offset, Entry);
+ if (SavedSwapEntry)
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ if (Dirty && !(Entry & 0x2))
+ {
@@ -841,7 +750,7 @@
+ else
{
- if (!PageOut)
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ if (SavedSwapEntry == 0)
{
- if (Dirty)
@@ -868,7 +777,7 @@
+ if (IsImageSection)
{
- DPRINT1("MM: Failed to write to swap page (Status was
0x%.8X)\n", Status);
-- KEBUGCHECK(0);
+- KeBugCheck(MEMORY_MANAGEMENT);
+ if (PageOut)
+ {
+ MmSetPageEntrySectionSegment(Segment, Offset, 0);
@@ -909,7 +818,6 @@
+ if ((Segment->Flags & MM_PAGEFILE_SEGMENT) ||
+ (Segment->Characteristics & IMAGE_SCN_MEM_SHARED))
+ {
-+ CHECKPOINT1;
+ if (!PageOut)
+ {
+ if (Dirty)
@@ -924,7 +832,7 @@
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("MM: Failed to write to swap page (Status was
0x%.8X)\n", Status);
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ }
+ MmSetPageEntrySectionSegment(Segment, Offset,
MAKE_SWAP_SSE(SavedSwapEntry));
@@ -932,7 +840,6 @@
+ }
+ else
+ {
-+ CHECKPOINT1;
+// MmSetPageEntrySectionSegment(Segment, Offset, 0);
+ }
+ MmReleasePageMemoryConsumer(Consumer, Page);
@@ -940,14 +847,14 @@
+ else
+ {
+ DPRINT1("Found a swapentry for a non private page in an image or
data file sgment\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ }
}
- else
- {
- DPRINT1("Found a swapentry for a non private page in an image or data
file sgment\n");
-- KEBUGCHECK(0);
+- KeBugCheck(MEMORY_MANAGEMENT);
- }
}
}
@@ -1254,7 +1161,7 @@
NTSTATUS
-NTAPI
--MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
+-MmNotPresentFaultSectionView(PMM_AVL_TABLE AddressSpace,
- MEMORY_AREA* MemoryArea,
- PVOID Address,
- BOOLEAN Locked)
@@ -1281,7 +1188,7 @@
+ Length = PageCount * PAGE_SIZE;
+ if (SegOffset > SectionData->Segment->RawLength)
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ Status = MmspRawReadPages(SectionData->Section->FileObject,
@@ -1301,7 +1208,7 @@
+/*****************************************************************************************************/
+
+NTSTATUS
-+MmspNotPresentFaultPhysMemSectionView(PMADDRESS_SPACE AddressSpace,
++MmspNotPresentFaultPhysMemSectionView(PMM_AVL_TABLE AddressSpace,
+ MEMORY_AREA* MemoryArea,
+ PVOID Address,
+ BOOLEAN Locked)
@@ -1320,7 +1227,8 @@
- PMM_PAGEOP PageOp;
PMM_REGION Region;
- BOOLEAN HasSwapEntry;
-
+ PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
+
+ PAddress = MM_ROUND_DOWN(Address, PAGE_SIZE);
+ Offset = (ULONG_PTR)PAddress - (ULONG_PTR)MemoryArea->StartingAddress;
+
@@ -1340,9 +1248,9 @@
- * that.
+ * Just map the desired physical page
*/
-- if (MmIsPagePresent(AddressSpace->Process, Address))
+- if (MmIsPagePresent(Process, Address))
+ Pfn = (Offset + MemoryArea->Data.SectionData.ViewOffset) >> PAGE_SHIFT;
-+ Status = MmCreateVirtualMappingUnsafe(AddressSpace->Process,
++ Status = MmCreateVirtualMappingUnsafe(Process,
+ Address,
+ Region->Protect,
+ &Pfn,
@@ -1351,11 +1259,11 @@
{
- if (Locked)
- {
-- MmLockPage(MmGetPfnForProcess(AddressSpace->Process, Address));
+- MmLockPage(MmGetPfnForProcess(Process, Address));
- }
- return(STATUS_SUCCESS);
+ DPRINT("MmCreateVirtualMapping failed, not out of memory\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ return(Status);
}
@@ -1378,7 +1286,7 @@
+/*****************************************************************************************************/
+
+NTSTATUS
-+MmspNotPresentFaultImageSectionView(PMADDRESS_SPACE AddressSpace,
++MmspNotPresentFaultImageSectionView(PMM_AVL_TABLE AddressSpace,
+ MEMORY_AREA* MemoryArea,
+ PVOID Address,
+ BOOLEAN Locked)
@@ -1393,10 +1301,11 @@
+ PMM_PAGEOP PageOp[4];
+ PVOID RegionBase;
+ NTSTATUS Status = STATUS_SUCCESS;
-+ BOOL HasSwapEntry;
++ BOOLEAN HasSwapEntry;
+ PFN_TYPE Pfn[4];
+ ULONG PageCount;
+ ULONG i;
++ PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
+
+ DPRINT("MmspNotPresentFaultImageSectionView(%x, %x, %x, %d)\n",
+ AddressSpace, MemoryArea, Address, Locked);
@@ -1417,7 +1326,7 @@
/*
* Lock the segment
*/
-@@ -756,7 +1066,7 @@
+@@ -798,7 +1134,7 @@
/*
* Check if this page needs to be mapped COW
*/
@@ -1426,7 +1335,7 @@
(Region->Protect == PAGE_READWRITE ||
Region->Protect == PAGE_EXECUTE_READWRITE))
{
-@@ -770,8 +1080,8 @@
+@@ -812,8 +1148,8 @@
/*
* Get or create a page operation descriptor
*/
@@ -1436,8 +1345,8 @@
+ if (PageOp[0] == NULL)
{
DPRINT1("MmGetPageOp failed\n");
- KEBUGCHECK(0);
-@@ -781,11 +1091,11 @@
+ KeBugCheck(MEMORY_MANAGEMENT);
+@@ -823,11 +1159,11 @@
* Check if someone else is already handling this fault, if so wait
* for them
*/
@@ -1451,16 +1360,16 @@
/*
* Check for various strange conditions
*/
-@@ -794,7 +1104,7 @@
+@@ -836,7 +1172,7 @@
DPRINT1("Failed to wait for page op, status = %x\n", Status);
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
- if (PageOp->Status == STATUS_PENDING)
+ if (PageOp[0]->Status == STATUS_PENDING)
{
DPRINT1("Woke for page op before completion\n");
- KEBUGCHECK(0);
-@@ -803,20 +1113,20 @@
+ KeBugCheck(MEMORY_MANAGEMENT);
+@@ -845,20 +1181,20 @@
/*
* If this wasn't a pagein then restart the operation
*/
@@ -1488,12 +1397,12 @@
DPRINT("Address 0x%.8X\n", Address);
return(Status);
}
-@@ -827,51 +1137,51 @@
+@@ -869,51 +1205,51 @@
*/
- if (!MmIsPagePresent(AddressSpace->Process, Address))
+ if (!MmIsPagePresent(Process, Address))
{
- Entry = MmGetPageEntrySectionSegment(Segment, Offset);
- HasSwapEntry = MmIsPageSwapEntry(AddressSpace->Process, (PVOID)PAddress);
+ HasSwapEntry = MmIsPageSwapEntry(Process, (PVOID)PAddress);
-
- if (PAGE_FROM_SSE(Entry) == 0 || HasSwapEntry)
+ if (!HasSwapEntry)
@@ -1519,7 +1428,7 @@
/* FIXME: Should we call MmCreateVirtualMappingUnsafe if
* (Section->AllocationAttributes & SEC_PHYSICALMEMORY) is true?
*/
- Status = MmCreateVirtualMapping(AddressSpace->Process,
+ Status = MmCreateVirtualMapping(Process,
Address,
Attributes,
- &Page,
@@ -1528,10 +1437,10 @@
if (!NT_SUCCESS(Status))
{
DPRINT1("Unable to create virtual mapping\n");
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
-- MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress);
-+ MmInsertRmap(Pfn[0], AddressSpace->Process, (PVOID)PAddress);
+- MmInsertRmap(Page, Process, (PVOID)PAddress);
++ MmInsertRmap(Pfn[0], Process, (PVOID)PAddress);
}
if (Locked)
{
@@ -1546,24 +1455,24 @@
return(STATUS_SUCCESS);
}
-- HasSwapEntry = MmIsPageSwapEntry(AddressSpace->Process, (PVOID)PAddress);
+- HasSwapEntry = MmIsPageSwapEntry(Process, (PVOID)PAddress);
- if (HasSwapEntry)
+ /*
+ * Check for swapped out private page
+ */
-+ if (MmIsPageSwapEntry(AddressSpace->Process, (PVOID)PAddress))
++ if (MmIsPageSwapEntry(Process, (PVOID)PAddress))
{
/*
* Must be private page we have swapped out.
-@@ -891,13 +1201,13 @@
- MmDeletePageFileMapping(AddressSpace->Process, (PVOID)PAddress,
&SwapEntry);
+@@ -933,13 +1269,13 @@
+ MmDeletePageFileMapping(Process, (PVOID)PAddress, &SwapEntry);
MmUnlockAddressSpace(AddressSpace);
- Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page);
+ Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Pfn[0]);
if (!NT_SUCCESS(Status))
{
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
- Status = MmReadFromSwapPage(SwapEntry, Page);
@@ -1571,8 +1480,8 @@
if (!NT_SUCCESS(Status))
{
DPRINT1("MmReadFromSwapPage failed, status = %x\n", Status);
-@@ -907,11 +1217,11 @@
- Status = MmCreateVirtualMapping(AddressSpace->Process,
+@@ -949,11 +1285,11 @@
+ Status = MmCreateVirtualMapping(Process,
Address,
Region->Protect,
- &Page,
@@ -1582,10 +1491,10 @@
{
- DPRINT("MmCreateVirtualMapping failed, not out of memory\n");
+ DPRINT1("MmCreateVirtualMapping failed, not out of memory\n");
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
return(Status);
}
-@@ -919,40 +1229,50 @@
+@@ -961,40 +1297,50 @@
/*
* Store the swap entry for later use.
*/
@@ -1595,8 +1504,8 @@
/*
* Add the page to the process's working set
*/
-- MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress);
-+ MmInsertRmap(Pfn[0], AddressSpace->Process, (PVOID)PAddress);
+- MmInsertRmap(Page, Process, (PVOID)PAddress);
++ MmInsertRmap(Pfn[0], Process, (PVOID)PAddress);
/*
* Finish the operation
@@ -1637,10 +1546,10 @@
+ ? MC_CACHE : MC_USER, TRUE, &Pfn[0]);
+ if (!NT_SUCCESS(Status))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ MmLockAddressSpace(AddressSpace);
- Status = MmCreateVirtualMappingUnsafe(AddressSpace->Process,
+ Status = MmCreateVirtualMappingUnsafe(Process,
Address,
Region->Protect,
- &Page,
@@ -1648,15 +1557,15 @@
1);
if (!NT_SUCCESS(Status))
{
-@@ -960,63 +1280,442 @@
- KEBUGCHECK(0);
+@@ -1002,63 +1348,443 @@
+ KeBugCheck(MEMORY_MANAGEMENT);
return(Status);
}
- /*
- * Don't add an rmap entry since the page mapped could be for
- * anything.
- */
-+ MmInsertRmap(Pfn[0], AddressSpace->Process, (PVOID)PAddress);
++ MmInsertRmap(Pfn[0], Process, (PVOID)PAddress);
if (Locked)
{
- MmLockPageUnsafe(Page);
@@ -1780,7 +1689,7 @@
+ if (Entry != 0)
+ {
+ DPRINT1("Someone changed ppte entry while we slept\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ /*
@@ -1790,7 +1699,7 @@
+ Entry = MAKE_SSE(Pfn[i] << PAGE_SHIFT, 0);
+ MmSetPageEntrySectionSegment(Segment, SegmentOffset + i * PAGE_SIZE, Entry);
+ }
-+ Status = MmCreateVirtualMapping(AddressSpace->Process,
++ Status = MmCreateVirtualMapping(Process,
+ (PVOID)((ULONG_PTR)MemoryArea->StartingAddress
+ SegmentOffset),
+ Attributes,
+ Pfn,
@@ -1799,11 +1708,11 @@
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Unable to create virtual mapping\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ for (i = 0; i < PageCount; i++)
+ {
-+ MmInsertRmap(Pfn[i], AddressSpace->Process, (PVOID)((ULONG_PTR)PAddress + i
* PAGE_SIZE));
++ MmInsertRmap(Pfn[i], Process, (PVOID)((ULONG_PTR)PAddress + i * PAGE_SIZE));
+ }
+
+ MmUnlockSectionSegment(Segment);
@@ -1841,13 +1750,13 @@
- MmUnlockAddressSpace(AddressSpace);
- Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page);
- MmLockAddressSpace(AddressSpace);
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
}
+
+ Status = MmReadFromSwapPage(SwapEntry, Pfn[0]);
if (!NT_SUCCESS(Status))
{
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
}
+
+ /*
@@ -1863,7 +1772,7 @@
+ if (Entry != MmGetPageEntrySectionSegment(Segment, SegmentOffset))
+ {
+ DPRINT1("Someone changed ppte entry while we slept\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ /*
@@ -1877,7 +1786,7 @@
+ * Save the swap entry.
+ */
+ MmSetSavedSwapEntryPage(Pfn[0], SwapEntry);
- Status = MmCreateVirtualMapping(AddressSpace->Process,
+ Status = MmCreateVirtualMapping(Process,
Address,
Region->Protect,
- &Page,
@@ -1887,11 +1796,11 @@
{
- DPRINT("MmCreateVirtualMapping failed, not out of memory\n");
+ DPRINT1("Unable to create virtual mapping\n");
- KEBUGCHECK(0);
+ KeBugCheck(MEMORY_MANAGEMENT);
return(Status);
}
-- MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress);
-+ MmInsertRmap(Pfn[0], AddressSpace->Process, (PVOID)PAddress);
+- MmInsertRmap(Page, Process, (PVOID)PAddress);
++ MmInsertRmap(Pfn[0], Process, (PVOID)PAddress);
+ MmUnlockSectionSegment(Segment);
+
if (Locked)
@@ -1913,7 +1822,7 @@
+ Pfn[0] = PFN_FROM_SSE(Entry);
+
-+ Status = MmCreateVirtualMapping(AddressSpace->Process,
++ Status = MmCreateVirtualMapping(Process,
+ Address,
+ Attributes,
+ &Pfn[0],
@@ -1921,9 +1830,9 @@
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Unable to create virtual mapping\n");
-+ KEBUGCHECK(0);
-+ }
-+ MmInsertRmap(Pfn[0], AddressSpace->Process, (PVOID)PAddress);
++ KeBugCheck(MEMORY_MANAGEMENT);
++ }
++ MmInsertRmap(Pfn[0], Process, (PVOID)PAddress);
+ if (Locked)
+ {
+ MmLockPage(Pfn[0]);
@@ -1940,7 +1849,7 @@
+/*****************************************************************************************************/
+
+NTSTATUS
-+MmspNotPresentFaultDataFileSectionView(PMADDRESS_SPACE AddressSpace,
++MmspNotPresentFaultDataFileSectionView(PMM_AVL_TABLE AddressSpace,
+ MEMORY_AREA* MemoryArea,
+ PVOID Address,
+ BOOLEAN Locked)
@@ -1960,6 +1869,7 @@
+ ULONG PageCount;
+ ULONG i;
+ PVOID RegionBase;
++ PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
+
+ DPRINT("MmspNotPresentFaultDataFileSectionView(%x %x %x %d)\n",
+ AddressSpace, MemoryArea, Address, Locked);
@@ -1980,7 +1890,7 @@
+ }
+ else
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ Offset = (ULONG_PTR)PAddress - (ULONG_PTR)StartingAddress +
SectionData->ViewOffset;
@@ -2009,12 +1919,12 @@
+ Attributes = Region->Protect;
+ }
+
-+ if (MmIsPageSwapEntry(AddressSpace->Process, (PVOID)PAddress))
++ if (MmIsPageSwapEntry(Process, (PVOID)PAddress))
+ {
+ /*
+ * FIXME:
+ */
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ /*
@@ -2024,7 +1934,7 @@
+ if (PageOp[0] == NULL)
+ {
+ DPRINT1("MmGetPageOp failed\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ /*
@@ -2045,12 +1955,12 @@
+ if (Status != STATUS_SUCCESS)
+ {
+ DPRINT1("Failed to wait for page op, status = %x\n", Status);
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ if (PageOp[0]->Status == STATUS_PENDING)
+ {
+ DPRINT1("Woke for page op before completion\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ MmLockAddressSpace(AddressSpace);
+ /*
@@ -2078,20 +1988,20 @@
+ * If the completed fault was for another address space then set the
+ * page in this one.
+ */
-+ if (!MmIsPagePresent(AddressSpace->Process, Address))
++ if (!MmIsPagePresent(Process, Address))
+ {
+ Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+ if (IS_SWAP_FROM_SSE(Entry))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ Pfn[0] = PFN_FROM_SSE(Entry);
+ if (Pfn[0] == 0)
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
-+ Status = MmCreateVirtualMapping(AddressSpace->Process,
++ Status = MmCreateVirtualMapping(Process,
+ Address,
+ Attributes,
+ &Pfn[0],
@@ -2099,9 +2009,9 @@
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Unable to create virtual mapping\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
-+ MmInsertRmap(Pfn[0], AddressSpace->Process, (PVOID)PAddress);
++ MmInsertRmap(Pfn[0], Process, (PVOID)PAddress);
+ }
+ if (Locked)
+ {
@@ -2113,7 +2023,7 @@
DPRINT("Address 0x%.8X\n", Address);
return(STATUS_SUCCESS);
}
-@@ -1026,36 +1725,312 @@
+@@ -1068,36 +1794,313 @@
*/
Entry = MmGetPageEntrySectionSegment(Segment, Offset);
@@ -2121,7 +2031,7 @@
+
+ if (IS_SWAP_FROM_SSE(Entry))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
if (Entry == 0)
@@ -2199,7 +2109,7 @@
+ if (Entry != 0)
+ {
+ DPRINT1("Someone changed ppte entry while we slept\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ /*
@@ -2210,7 +2120,7 @@
+ ASSERT (Entry);
+ MmSetPageEntrySectionSegment(Segment, Offset + i * PAGE_SIZE, Entry);
+ }
-+ Status = MmCreateVirtualMapping(AddressSpace->Process,
++ Status = MmCreateVirtualMapping(Process,
+ PAddress,
+ Attributes,
+ Pfn,
@@ -2219,11 +2129,11 @@
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Unable to create virtual mapping\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ for (i = 0; i < PageCount; i++)
+ {
-+ MmInsertRmap(Pfn[i], AddressSpace->Process, (PVOID)((ULONG_PTR)PAddress + i
* PAGE_SIZE));
++ MmInsertRmap(Pfn[i], Process, (PVOID)((ULONG_PTR)PAddress + i * PAGE_SIZE));
+ if (i == 0 && Locked)
+ {
+ MmLockPage(Pfn[0]);
@@ -2244,7 +2154,7 @@
+
+ Pfn[0] = PFN_FROM_SSE(Entry);
+
-+ Status = MmCreateVirtualMapping(AddressSpace->Process,
++ Status = MmCreateVirtualMapping(Process,
+ PAddress,
+ Attributes,
+ &Pfn[0],
@@ -2252,9 +2162,9 @@
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Unable to create virtual mapping\n");
-+ KEBUGCHECK(0);
-+ }
-+ MmInsertRmap(Pfn[0], AddressSpace->Process, (PVOID)PAddress);
++ KeBugCheck(MEMORY_MANAGEMENT);
++ }
++ MmInsertRmap(Pfn[0], Process, (PVOID)PAddress);
+ if (Locked)
+ {
+ MmLockPage(Pfn[0]);
@@ -2269,7 +2179,7 @@
+
+/*****************************************************************************************************/
+NTSTATUS
-+MmspNotPresentFaultPageFileSectionView(PMADDRESS_SPACE AddressSpace,
++MmspNotPresentFaultPageFileSectionView(PMM_AVL_TABLE AddressSpace,
+ MEMORY_AREA* MemoryArea,
+ PVOID Address,
+ BOOLEAN Locked)
@@ -2285,7 +2195,8 @@
+ NTSTATUS Status;
+ PMM_PAGEOP PageOp;
+ PFN_TYPE Page;
-+
++ PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
++
+ PAddress = MM_ROUND_DOWN(Address, PAGE_SIZE);
+ Offset = (ULONG_PTR)PAddress - (ULONG_PTR)MemoryArea->StartingAddress +
MemoryArea->Data.SectionData.ViewOffset;
+
@@ -2299,9 +2210,9 @@
+ */
+ MmLockSectionSegment(Segment);
+
-+ if (MmIsPageSwapEntry(AddressSpace->Process, (PVOID)PAddress))
-+ {
-+ KEBUGCHECK(0);
++ if (MmIsPageSwapEntry(Process, (PVOID)PAddress))
++ {
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ /*
@@ -2325,7 +2236,7 @@
+ if (PageOp == NULL)
+ {
+ DPRINT1("MmGetPageOp failed\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ /*
@@ -2343,12 +2254,12 @@
+ if (Status != STATUS_SUCCESS)
+ {
+ DPRINT1("Failed to wait for page op, status = %x\n", Status);
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ if (PageOp->Status == STATUS_PENDING)
+ {
+ DPRINT1("Woke for page op before completion\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ MmLockAddressSpace(AddressSpace);
+ /*
@@ -2376,22 +2287,22 @@
+ * If the completed fault was for another address space then set the
+ * page in this one.
+ */
-+ if (!MmIsPagePresent(AddressSpace->Process, Address))
++ if (!MmIsPagePresent(Process, Address))
+ {
+ Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+ if (IS_SWAP_FROM_SSE(Entry))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ Page = PFN_FROM_SSE(Entry);
+ if (Page == 0)
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+
+ Page = PFN_FROM_SSE(Entry);
+
-+ Status = MmCreateVirtualMapping(AddressSpace->Process,
++ Status = MmCreateVirtualMapping(Process,
+ Address,
+ Attributes,
+ &Page,
@@ -2400,9 +2311,9 @@
{
- DPRINT1("MiReadPage failed (Status %x)\n", Status);
+ DPRINT1("Unable to create virtual mapping\n");
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
}
-+ MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress);
++ MmInsertRmap(Page, Process, (PVOID)PAddress);
}
+ if (Locked)
+ {
@@ -2434,7 +2345,7 @@
if (!NT_SUCCESS(Status))
{
/*
-@@ -1080,8 +2055,8 @@
+@@ -1122,8 +2125,8 @@
* Check the entry. No one should change the status of a page
* that has a pending page-in.
*/
@@ -2444,8 +2355,8 @@
+ if (Entry != 0)
{
DPRINT1("Someone changed ppte entry while we slept\n");
- KEBUGCHECK(0);
-@@ -1091,12 +2066,11 @@
+ KeBugCheck(MEMORY_MANAGEMENT);
+@@ -1133,12 +2136,11 @@
* Mark the offset within the section as having valid, in-memory
* data
*/
@@ -2455,21 +2366,21 @@
MmSetPageEntrySectionSegment(Segment, Offset, Entry);
- MmUnlockSectionSegment(Segment);
-
- Status = MmCreateVirtualMapping(AddressSpace->Process,
+ Status = MmCreateVirtualMapping(Process,
- Address,
+ PAddress,
Attributes,
&Page,
1);
-@@ -1106,6 +2080,7 @@
- KEBUGCHECK(0);
+@@ -1148,6 +2150,7 @@
+ KeBugCheck(MEMORY_MANAGEMENT);
}
- MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress);
+ MmInsertRmap(Page, Process, (PVOID)PAddress);
+ MmUnlockSectionSegment(Segment);
if (Locked)
{
-@@ -1162,16 +2137,15 @@
+@@ -1204,16 +2207,15 @@
* Mark the offset within the section as having valid, in-memory
* data
*/
@@ -2482,13 +2393,13 @@
* Save the swap entry.
*/
MmSetSavedSwapEntryPage(Page, SwapEntry);
- Status = MmCreateVirtualMapping(AddressSpace->Process,
+ Status = MmCreateVirtualMapping(Process,
- Address,
+ PAddress,
Region->Protect,
&Page,
1);
-@@ -1185,6 +2159,7 @@
+@@ -1227,6 +2229,7 @@
{
MmLockPage(Page);
}
@@ -2496,20 +2407,20 @@
PageOp->Status = STATUS_SUCCESS;
MmspCompleteAndReleasePageOp(PageOp);
DPRINT("Address 0x%.8X\n", Address);
-@@ -1199,11 +2174,9 @@
+@@ -1241,11 +2244,9 @@
Page = PFN_FROM_SSE(Entry);
- MmSharePageEntrySectionSegment(Segment, Offset);
- MmUnlockSectionSegment(Segment);
- Status = MmCreateVirtualMapping(AddressSpace->Process,
+ Status = MmCreateVirtualMapping(Process,
- Address,
+ PAddress,
Attributes,
&Page,
1);
-@@ -1217,6 +2190,7 @@
+@@ -1259,6 +2260,7 @@
{
MmLockPage(Page);
}
@@ -2517,7 +2428,7 @@
PageOp->Status = STATUS_SUCCESS;
MmspCompleteAndReleasePageOp(PageOp);
DPRINT("Address 0x%.8X\n", Address);
-@@ -1224,8 +2198,52 @@
+@@ -1266,8 +2268,54 @@
}
}
@@ -2525,21 +2436,23 @@
+
NTSTATUS
NTAPI
-+MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
++MmNotPresentFaultSectionView(PMM_AVL_TABLE AddressSpace,
+ MEMORY_AREA* MemoryArea,
+ PVOID Address,
+ BOOLEAN Locked)
+{
++ PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
++
+ /*
+ * There is a window between taking the page fault and locking the
+ * address space when another thread could load the page so we check
+ * that.
+ */
-+ if (MmIsPagePresent(AddressSpace->Process, Address))
++ if (MmIsPagePresent(Process, Address))
+ {
+ if (Locked)
+ {
-+ MmLockPage(MmGetPfnForProcess(AddressSpace->Process, Address));
++ MmLockPage(MmGetPfnForProcess(Process, Address));
+ }
+ return(STATUS_SUCCESS);
+ }
@@ -2567,16 +2480,16 @@
+
+NTSTATUS
+NTAPI
- MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace,
+ MmAccessFaultSectionView(PMM_AVL_TABLE AddressSpace,
MEMORY_AREA* MemoryArea,
PVOID Address,
-@@ -1254,11 +2272,15 @@
+@@ -1297,11 +2345,15 @@
return(STATUS_SUCCESS);
}
+ if (MemoryArea->Type != MEMORY_AREA_SECTION_VIEW)
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
/*
* Find the offset of the page
@@ -2587,7 +2500,7 @@
+ MemoryArea->Data.SectionData.ViewOffset;
Segment = MemoryArea->Data.SectionData.Segment;
-@@ -1272,14 +2294,14 @@
+@@ -1315,14 +2367,14 @@
MmLockSectionSegment(Segment);
OldPage = MmGetPfnForProcess(NULL, Address);
@@ -2604,18 +2517,18 @@
(Region->Protect == PAGE_READWRITE ||
Region->Protect == PAGE_EXECUTE_READWRITE)))
{
-@@ -1391,7 +2413,7 @@
- MmDeleteRmap(OldPage, AddressSpace->Process, PAddress);
- MmInsertRmap(NewPage, AddressSpace->Process, PAddress);
+@@ -1434,7 +2486,7 @@
+ MmDeleteRmap(OldPage, Process, PAddress);
+ MmInsertRmap(NewPage, Process, PAddress);
MmLockSectionSegment(Segment);
- MmUnsharePageEntrySectionSegment(Section, Segment, Offset, FALSE, FALSE);
+ MmUnsharePageEntrySectionSegment(Section, Segment, Offset, FALSE, TRUE);
MmUnlockSectionSegment(Segment);
PageOp->Status = STATUS_SUCCESS;
-@@ -1436,10 +2458,10 @@
- {
- MmUnlockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
+@@ -1479,10 +2531,10 @@
+ {
+ MmUnlockAddressSpace(&Process->VadRoot);
}
-
+
@@ -2626,16 +2539,16 @@
}
DPRINT("PhysicalAddress %x, Address %x\n", Page << PAGE_SHIFT,
Address);
-@@ -1459,8 +2481,6 @@
+@@ -1502,8 +2554,6 @@
ULONG FileOffset;
NTSTATUS Status;
PFILE_OBJECT FileObject;
- PBCB Bcb = NULL;
- BOOLEAN DirectMapped;
BOOLEAN IsImageSection;
-
- Address = (PVOID)PAGE_ROUND_DOWN(Address);
-@@ -1471,32 +2491,16 @@
+ PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
+
+@@ -1515,32 +2565,16 @@
Context.Segment = MemoryArea->Data.SectionData.Segment;
Context.Section = MemoryArea->Data.SectionData.Section;
@@ -2671,7 +2584,7 @@
/*
* This should never happen since mappings of physical memory are never
* placed in the rmap lists.
-@@ -1525,7 +2529,7 @@
+@@ -1569,7 +2603,7 @@
/*
* Prepare the context structure for the rmap delete call.
*/
@@ -2680,7 +2593,7 @@
if (Context.Segment->Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA ||
IS_SWAP_FROM_SSE(Entry) ||
PFN_FROM_SSE(Entry) != Page)
-@@ -1538,20 +2542,9 @@
+@@ -1582,20 +2616,9 @@
}
/*
@@ -2692,7 +2605,7 @@
- if(!MiIsPageFromCache(MemoryArea, Context.Offset))
- {
- DPRINT1("Direct mapped non private page is not associated with the
cache.\n");
-- KEBUGCHECK(0);
+- KeBugCheck(MEMORY_MANAGEMENT);
- }
- }
- else
@@ -2703,7 +2616,7 @@
MmDeleteAllRmaps(Page, (PVOID)&Context, MmPageOutDeleteMapping);
-@@ -1615,28 +2608,10 @@
+@@ -1659,28 +2682,10 @@
return(STATUS_SUCCESS);
}
}
@@ -2714,13 +2627,13 @@
{
- DPRINT1("Found a swapentry for a non private and direct mapped page
(address %x)\n",
- Address);
-- KEBUGCHECK(0);
+- KeBugCheck(MEMORY_MANAGEMENT);
- }
- Status = CcRosUnmapCacheSegment(Bcb, FileOffset, FALSE);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("CCRosUnmapCacheSegment failed, status = %x\n", Status);
-- KEBUGCHECK(0);
+- KeBugCheck(MEMORY_MANAGEMENT);
- }
- PageOp->Status = STATUS_SUCCESS;
- MmspCompleteAndReleasePageOp(PageOp);
@@ -2732,17 +2645,17 @@
- {
DPRINT1("Found a swap entry for a non dirty, non private and not direct
mapped page (address %x)\n",
Address);
- KEBUGCHECK(0);
-@@ -1705,7 +2680,7 @@
+ KeBugCheck(MEMORY_MANAGEMENT);
+@@ -1749,7 +2754,7 @@
MmInsertRmap(Page,
- AddressSpace->Process,
+ Process,
Address);
- Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
+ Entry = MAKE_SSE(Page << PAGE_SHIFT, 0);
MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
}
MmUnlockAddressSpace(AddressSpace);
-@@ -1721,7 +2696,7 @@
+@@ -1765,7 +2770,7 @@
Status = MmWriteToSwapPage(SwapEntry, Page);
if (!NT_SUCCESS(Status))
{
@@ -2751,16 +2664,16 @@
Status);
/*
* As above: undo our actions.
-@@ -1751,7 +2726,7 @@
+@@ -1795,7 +2800,7 @@
MmInsertRmap(Page,
- AddressSpace->Process,
+ Process,
Address);
- Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
+ Entry = MAKE_SSE(Page << PAGE_SHIFT, 0);
MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
}
MmUnlockAddressSpace(AddressSpace);
-@@ -1820,7 +2795,7 @@
+@@ -1865,7 +2870,7 @@
Address = (PVOID)PAGE_ROUND_DOWN(Address);
@@ -2769,19 +2682,19 @@
+ MemoryArea->Data.SectionData.ViewOffset;
/*
-@@ -1900,7 +2875,11 @@
+@@ -1945,7 +2950,11 @@
if (DirectMapped && !Private)
{
ASSERT(SwapEntry == 0);
+#if 1
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+#else
CcRosMarkDirtyCacheSegment(Bcb, Offset + Segment->FileOffset);
+#endif
PageOp->Status = STATUS_SUCCESS;
MmspCompleteAndReleasePageOp(PageOp);
return(STATUS_SUCCESS);
-@@ -1928,7 +2907,7 @@
+@@ -1973,7 +2982,7 @@
Status = MmWriteToSwapPage(SwapEntry, Page);
if (!NT_SUCCESS(Status))
{
@@ -2790,7 +2703,7 @@
Status);
MmSetDirtyAllRmaps(Page);
PageOp->Status = STATUS_UNSUCCESSFUL;
-@@ -1962,7 +2941,7 @@
+@@ -2008,7 +3017,7 @@
MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, BaseAddress);
Segment = MemoryArea->Data.SectionData.Segment;
@@ -2799,7 +2712,7 @@
(NewProtect == PAGE_READWRITE || NewProtect == PAGE_EXECUTE_READWRITE))
{
DoCOW = TRUE;
-@@ -1985,7 +2964,7 @@
+@@ -2031,7 +3040,7 @@
ULONG Entry;
PFN_TYPE Page;
@@ -2807,8 +2720,8 @@
+ Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress
+ MemoryArea->Data.SectionData.ViewOffset;
Entry = MmGetPageEntrySectionSegment(Segment, Offset);
- Page = MmGetPfnForProcess(AddressSpace->Process, Address);
-@@ -2164,6 +3143,9 @@
+ Page = MmGetPfnForProcess(Process, Address);
+@@ -2209,6 +3218,9 @@
MmUnlockSectionSegment(&SectionSegments[i]);
}
}
@@ -2818,7 +2731,7 @@
}
else
{
-@@ -2188,7 +3170,6 @@
+@@ -2233,7 +3245,6 @@
}
if (Section->FileObject != NULL)
{
@@ -2826,7 +2739,7 @@
ObDereferenceObject(Section->FileObject);
Section->FileObject = NULL;
}
-@@ -2201,8 +3182,8 @@
+@@ -2246,8 +3257,8 @@
IN ULONG ProcessHandleCount,
IN ULONG SystemHandleCount)
{
@@ -2837,7 +2750,7 @@
}
NTSTATUS
-@@ -2256,6 +3237,31 @@
+@@ -2301,6 +3312,31 @@
return(STATUS_SUCCESS);
}
@@ -2852,7 +2765,7 @@
+ DueTime.QuadPart = -1;
+ KeInitializeTimerEx(&MmspWorkerThreadTimer, SynchronizationTimer);
+
-+VOID STDCALL
++VOID NTAPI
+MmspWorkerThread(PVOID);
+
+ Status = PsCreateSystemThread(&ThreadHandle,
@@ -2869,7 +2782,7 @@
NTSTATUS
INIT_FUNCTION
NTAPI
-@@ -2265,7 +3271,7 @@
+@@ -2310,7 +3346,7 @@
UNICODE_STRING Name;
DPRINT("Creating Section Object Type\n");
@@ -2878,7 +2791,7 @@
/* Initialize the Section object type */
RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
RtlInitUnicodeString(&Name, L"Section");
-@@ -2279,6 +3285,15 @@
+@@ -2324,6 +3360,15 @@
ObjectTypeInitializer.ValidAccessMask = SECTION_ALL_ACCESS;
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL,
&MmSectionObjectType);
@@ -2894,7 +2807,7 @@
return(STATUS_SUCCESS);
}
-@@ -2362,7 +3377,8 @@
+@@ -2407,7 +3452,8 @@
PLARGE_INTEGER UMaximumSize,
ULONG SectionPageProtection,
ULONG AllocationAttributes,
@@ -2904,7 +2817,7 @@
/*
* Create a section backed by a data file
*/
-@@ -2370,14 +3386,14 @@
+@@ -2415,14 +3461,14 @@
PROS_SECTION_OBJECT Section;
NTSTATUS Status;
LARGE_INTEGER MaximumSize;
@@ -2923,7 +2836,7 @@
/*
* Create the section
*/
-@@ -2415,122 +3431,101 @@
+@@ -2460,122 +3506,100 @@
}
/*
@@ -2969,9 +2882,9 @@
- * FIXME: Revise this once a locking order for file size changes is
- * decided
- */
-- if (UMaximumSize != NULL)
+- if ((UMaximumSize != NULL) && (UMaximumSize->QuadPart != 0))
- {
-- MaximumSize = *UMaximumSize;
+- MaximumSize = *UMaximumSize;
- }
- else
- {
@@ -3096,7 +3009,6 @@
- ObDereferenceObject(Section);
- ObDereferenceObject(FileObject);
- return(Status);
-+ CHECKPOINT;
+ Segment->ReferenceCount++;
}
+ ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&DataSectionObjectLock);
@@ -3110,7 +3022,7 @@
{
Segment = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_SECTION_SEGMENT),
TAG_MM_SECTION_SEGMENT);
-@@ -2544,17 +3539,13 @@
+@@ -2589,17 +3613,13 @@
Section->Segment = Segment;
Segment->ReferenceCount = 1;
ExInitializeFastMutex(&Segment->Lock);
@@ -3130,7 +3042,7 @@
if (AllocationAttributes & SEC_RESERVE)
{
Segment->Length = Segment->RawLength = 0;
-@@ -2566,18 +3557,43 @@
+@@ -2611,18 +3631,41 @@
}
Segment->VirtualAddress = 0;
RtlZeroMemory(&Segment->PageDirectory, sizeof(SECTION_PAGE_DIRECTORY));
@@ -3145,12 +3057,10 @@
+ Segment, NULL);
+ if (tmpSegment != NULL)
+ {
-+ CHECKPOINT;
+ MmUnlockSectionSegment(Segment);
+ ExFreePool(Segment);
+ Segment = tmpSegment;
+ MmLockSectionSegment(Segment);
-+ CHECKPOINT;
+ Segment->ReferenceCount++;
+ Section->Segment = Segment;
+
@@ -3182,7 +3092,7 @@
MmLockSectionSegment(Segment);
if (MaximumSize.u.LowPart > Segment->RawLength &&
-@@ -2590,7 +3606,8 @@
+@@ -2635,7 +3678,8 @@
MmUnlockSectionSegment(Segment);
Section->FileObject = FileObject;
Section->MaximumSize = MaximumSize;
@@ -3192,7 +3102,7 @@
//KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE);
*SectionObject = Section;
return(STATUS_SUCCESS);
-@@ -2660,6 +3677,7 @@
+@@ -2705,6 +3749,7 @@
NTSTATUS
NTAPI
ExeFmtpReadFile(IN PVOID File,
@@ -3200,7 +3110,7 @@
IN PLARGE_INTEGER Offset,
IN ULONG Length,
OUT PVOID * Data,
-@@ -2667,12 +3685,15 @@
+@@ -2712,12 +3757,15 @@
OUT PULONG ReadSize)
{
NTSTATUS Status;
@@ -3216,7 +3126,7 @@
ASSERT_IRQL_LESS(DISPATCH_LEVEL);
-@@ -2702,45 +3723,28 @@
+@@ -2747,45 +3795,28 @@
* always called at low IRQLs and that these buffers don't survive a brief
* initialization phase
*/
@@ -3277,7 +3187,7 @@
if(NT_SUCCESS(Status) && UsedSize < OffsetAdjustment)
{
Status = STATUS_IN_PAGE_ERROR;
-@@ -3099,9 +4103,10 @@
+@@ -3144,9 +4175,10 @@
}
NTSTATUS
@@ -3289,7 +3199,7 @@
LARGE_INTEGER Offset;
PVOID FileHeader;
PVOID FileHeaderBuffer;
-@@ -3109,16 +4114,26 @@
+@@ -3154,16 +4186,26 @@
ULONG Flags;
ULONG OldNrSegments;
NTSTATUS Status;
@@ -3319,7 +3229,7 @@
&Offset,
PAGE_SIZE * 2,
&FileHeader,
-@@ -3140,12 +4155,12 @@
+@@ -3185,12 +4227,12 @@
for (i = 0; i < RTL_NUMBER_OF(ExeFmtpLoaders); ++ i)
{
RtlZeroMemory(ImageSectionObject, sizeof(*ImageSectionObject));
@@ -3334,7 +3244,7 @@
ImageSectionObject,
&Flags,
ExeFmtpReadFile,
-@@ -3223,7 +4238,7 @@
+@@ -3268,7 +4310,7 @@
SizeOfSegments = sizeof(MM_SECTION_SEGMENT) * ImageSectionObject->NrSegments;
@@ -3343,7 +3253,7 @@
SizeOfSegments,
TAG_MM_SECTION_SEGMENT);
-@@ -3243,6 +4258,7 @@
+@@ -3288,6 +4330,7 @@
RtlZeroMemory(&ImageSectionObject->Segments[i].PageDirectory,
sizeof(ImageSectionObject->Segments[i].PageDirectory));
@@ -3351,7 +3261,7 @@
}
ASSERT(NT_SUCCESS(Status));
-@@ -3256,13 +4272,13 @@
+@@ -3301,13 +4344,13 @@
PLARGE_INTEGER UMaximumSize,
ULONG SectionPageProtection,
ULONG AllocationAttributes,
@@ -3367,7 +3277,7 @@
ULONG i;
ULONG FileAccess = 0;
-@@ -3288,14 +4304,12 @@
+@@ -3333,14 +4376,12 @@
}
/*
@@ -3387,7 +3297,7 @@
if (!NT_SUCCESS(Status))
{
-@@ -3326,27 +4340,43 @@
+@@ -3371,27 +4412,42 @@
Section->SectionPageProtection = SectionPageProtection;
Section->AllocationAttributes = AllocationAttributes;
@@ -3416,7 +3326,6 @@
+ {
+ IO_STATUS_BLOCK Iosb;
+
-+ CHECKPOINT;
+ CcFlushCache(FileObject->SectionObjectPointer, NULL, 0, &Iosb);
+ if (!NT_SUCCESS(Iosb.Status))
+ {
@@ -3440,7 +3349,7 @@
if (!NT_SUCCESS(StatusExeFmt))
{
-@@ -3361,29 +4391,33 @@
+@@ -3406,29 +4462,33 @@
Section->ImageSection = ImageSectionObject;
ASSERT(ImageSectionObject->Segments);
@@ -3479,7 +3388,7 @@
+ if (NULL != tmpImageSectionObject)
{
/*
- * An other thread has initialized the some image in the background
+ * An other thread has initialized the same image in the background
*/
ExFreePool(ImageSectionObject->Segments);
ExFreePool(ImageSectionObject);
@@ -3488,7 +3397,7 @@
Section->ImageSection = ImageSectionObject;
SectionSegments = ImageSectionObject->Segments;
-@@ -3392,23 +4426,9 @@
+@@ -3437,23 +4497,9 @@
(void)InterlockedIncrementUL(&SectionSegments[i].ReferenceCount);
}
}
@@ -3512,7 +3421,7 @@
Section->ImageSection = ImageSectionObject;
SectionSegments = ImageSectionObject->Segments;
-@@ -3419,14 +4439,13 @@
+@@ -3464,14 +4510,13 @@
{
(void)InterlockedIncrementUL(&SectionSegments[i].ReferenceCount);
}
@@ -3530,7 +3439,7 @@
}
/*
-@@ -3597,7 +4616,6 @@
+@@ -3642,7 +4687,6 @@
MArea->Data.SectionData.Segment = Segment;
MArea->Data.SectionData.Section = Section;
MArea->Data.SectionData.ViewOffset = ViewOffset;
@@ -3538,7 +3447,7 @@
MmInitializeRegion(&MArea->Data.SectionData.RegionListHead,
ViewSize, 0, Protect);
-@@ -3827,8 +4845,6 @@
+@@ -3870,8 +4914,6 @@
PFN_TYPE Page, SWAPENTRY SwapEntry, BOOLEAN Dirty)
{
ULONG Entry;
@@ -3547,7 +3456,7 @@
ULONG Offset;
SWAPENTRY SavedSwapEntry;
PMM_PAGEOP PageOp;
-@@ -3868,22 +4884,6 @@
+@@ -3913,22 +4955,6 @@
}
Entry = MmGetPageEntrySectionSegment(Segment, Offset);
@@ -3570,20 +3479,20 @@
if (SwapEntry != 0)
{
/*
-@@ -4002,7 +5002,7 @@
+@@ -4047,7 +5073,7 @@
ASSERT(Process);
- AddressSpace = (PMADDRESS_SPACE)&(Process)->VadRoot;
+ AddressSpace = &Process->VadRoot;
-
+
MmLockAddressSpace(AddressSpace);
MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace,
BaseAddress);
-@@ -4368,7 +5368,83 @@
+@@ -4413,7 +5439,83 @@
return STATUS_NOT_IMPLEMENTED;
}
-+NTSTATUS STDCALL
++NTSTATUS NTAPI
+MmChangeSectionSize(PROS_SECTION_OBJECT Section,
+ PLARGE_INTEGER NewMaxSize)
+{
@@ -3598,11 +3507,11 @@
+ if (Section->AllocationAttributes & (SEC_IMAGE|SEC_PHYSICALMEMORY) ||
+ Section->FileObject == NULL)
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ if (NewMaxSize->QuadPart > PAGE_ROUND_DOWN(0xffffffff))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ DPRINT("%wZ\n", &Section->Segment->FileObject->FileName);
+ Segment = Section->Segment;
@@ -3611,7 +3520,7 @@
+ if (Segment->ReferenceCount > 1)
+ {
+ DPRINT1("%d\n", Segment->ReferenceCount);
-+// KEBUGCHECK(0);
++// KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ if (PAGE_ROUND_UP(Segment->Length) > PAGE_ROUND_UP(NewMaxSize->u.LowPart))
+ {
@@ -3623,12 +3532,12 @@
+ {
+ if (IS_SWAP_FROM_SSE(Entry))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else if (MmCheckForPageOp(CcCacheViewMemoryArea, NULL, NULL, Segment,
Offset))
+ {
+ /* page operation in progress */
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else
+ {
@@ -3636,7 +3545,7 @@
+ if (MmGetRmapListHeadPage(PFN_FROM_SSE(Entry)))
+ {
+ /* page is mapped */
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else
+ {
@@ -3663,15 +3572,15 @@
/**********************************************************************
* NAME INTERNAL
* MmAllocateSection@4
-@@ -4505,7 +5581,6 @@
+@@ -4549,7 +5651,6 @@
return STATUS_INVALID_PAGE_PROTECTION;
}
-
Section = (PROS_SECTION_OBJECT)SectionObject;
- AddressSpace = (PMADDRESS_SPACE)&(Process)->VadRoot;
-
-@@ -4698,20 +5773,86 @@
+ AddressSpace = &Process->VadRoot;
+
+@@ -4742,20 +5843,85 @@
MmFlushImageSection (IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
IN MMFLUSH_TYPE FlushType)
{
@@ -3720,7 +3629,7 @@
+ if (Result)
+ {
+#if 1
-+// KEBUGCHECK(0);
++// KeBugCheck(MEMORY_MANAGEMENT);
+#else
+ CcRosSetRemoveOnClose(SectionObjectPointer);
+#endif
@@ -3745,7 +3654,6 @@
+ ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&DataSectionObjectLock);
+ if (Segment)
+ {
-+ CHECKPOINT;
+ if (Segment->ReferenceCount == 0)
+ {
+ MmFreeDataSectionSegments(SectionObjectPointer);
@@ -3764,7 +3672,7 @@
}
/*
-@@ -4900,9 +6041,12 @@
+@@ -4944,9 +6110,12 @@
IN ULONG SectionPageProtection,
IN ULONG AllocationAttributes,
IN HANDLE FileHandle OPTIONAL,
@@ -3778,7 +3686,7 @@
PROS_SECTION_OBJECT *SectionObject = (PROS_SECTION_OBJECT *)Section;
/*
-@@ -4922,37 +6066,558 @@
+@@ -4965,37 +6134,557 @@
return STATUS_INVALID_PAGE_PROTECTION;
}
@@ -3911,11 +3819,11 @@
+ {
+ if (IS_SWAP_FROM_SSE(Entry))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else if (MmGetRmapListHeadPage(PFN_FROM_SSE(Entry)))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ else
+ {
@@ -4016,7 +3924,7 @@
+ WORK_QUEUE_ITEM WorkQueueItem;
+} PAGE_IO_CONTEXT, *PPAGE_IO_CONTEXT;
+
-+VOID STDCALL
++VOID NTAPI
+MmspWriteDataSectionPages(PVOID Context)
+{
+ PMDL Mdl;
@@ -4088,7 +3996,7 @@
+ ExFreePool(Context);
+}
+
-+VOID STDCALL
++VOID NTAPI
+MmspWorkerThread(PVOID Pointer)
+{
+ PLIST_ENTRY entry;
@@ -4181,7 +4089,7 @@
+
+ULONG MmGetPageEntryForProcess(PEPROCESS Process, PVOID Address);
+
-+NTSTATUS STDCALL
++NTSTATUS NTAPI
+MmMapViewInSystemCache(PCACHE_VIEW CacheView)
+{
+ PROS_SECTION_OBJECT Section;
@@ -4207,7 +4115,7 @@
+ return(STATUS_SUCCESS);
+}
+
-+NTSTATUS STDCALL
++NTSTATUS NTAPI
+MmUnmapViewInSystemCache(PCACHE_VIEW CacheView)
+{
+ PROS_SECTION_OBJECT Section;
@@ -4240,7 +4148,7 @@
+ {
+ if (MmIsPageSwapEntry(NULL, (PVOID)((ULONG_PTR)CacheView->BaseAddress +
Offset)))
+ {
-+ KEBUGCHECK(0);
++ KeBugCheck(MEMORY_MANAGEMENT);
+ }
+ Pfn = 0;
+ MmDeleteVirtualMapping(NULL, (PVOID)((ULONG_PTR)CacheView->BaseAddress +
Offset), FALSE, &Dirty, &Pfn);
@@ -4313,7 +4221,6 @@
+ }
+ else
+ {
-+ CHECKPOINT;
+ if (Context)
+ {
+ MmUnlockSectionSegment(Segment);
@@ -4357,17 +4264,17 @@
+NTSTATUS
NTAPI
NtAllocateUserPhysicalPages(IN HANDLE ProcessHandle,
- IN OUT PULONG NumberOfPages,
-Index: mm/virtual.c
-===================================================================
---- mm/virtual.c (revision 34040)
-+++ mm/virtual.c (working copy)
-@@ -594,7 +594,7 @@
+ IN OUT PULONG_PTR NumberOfPages,
+Index: virtual.c
+===================================================================
+--- virtual.c (revision 38402)
++++ virtual.c (working copy)
+@@ -581,7 +581,7 @@
NTSTATUS Status;
-
+
*NumberOfBytesToProtect =
- PAGE_ROUND_UP((ULONG_PTR)(*BaseAddress) + (*NumberOfBytesToProtect)) -
+ PAGE_ROUND_UP((ULONG_PTR)(*BaseAddress) + (ULONG_PTR)(*NumberOfBytesToProtect)) -
PAGE_ROUND_DOWN(*BaseAddress);
*BaseAddress = (PVOID)PAGE_ROUND_DOWN(*BaseAddress);
-
+
Propchange: branches/cache_manager_rewrite/mm.patch
------------------------------------------------------------------------------
--- svn:eol-style (original)
+++ svn:eol-style (removed)
@@ -1,1 +1,0 @@
-native