[ros-diffs] [arty] 44106: Wide page tables.

arty at svn.reactos.org arty at svn.reactos.org
Wed Nov 11 16:14:33 CET 2009


Author: arty
Date: Wed Nov 11 16:14:32 2009
New Revision: 44106

URL: http://svn.reactos.org/svn/reactos?rev=44106&view=rev
Log:
Wide page tables.

Added:
    branches/arty-newcc/ntoskrnl/mm/section/sptab.c   (with props)
Modified:
    branches/arty-newcc/ntoskrnl/include/internal/newmm.h
    branches/arty-newcc/ntoskrnl/mm/section/data.c
    branches/arty-newcc/ntoskrnl/mm/section/image.c
    branches/arty-newcc/ntoskrnl/mm/section/pagefile.c
    branches/arty-newcc/ntoskrnl/ntoskrnl-generic.rbuild

Modified: branches/arty-newcc/ntoskrnl/include/internal/newmm.h
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/include/internal/newmm.h?rev=44106&r1=44105&r2=44106&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/include/internal/newmm.h [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/include/internal/newmm.h [iso-8859-1] Wed Nov 11 16:14:32 2009
@@ -256,16 +256,6 @@
 #define InterlockedExchangePte(PointerPte, Value) \
     InterlockedExchange((PLONG)(PointerPte), Value)
 
-typedef struct
-{
-    ULONG Entry[NR_SECTION_PAGE_ENTRIES];
-} SECTION_PAGE_TABLE, *PSECTION_PAGE_TABLE;
-
-typedef struct
-{
-    PSECTION_PAGE_TABLE PageTables[NR_SECTION_PAGE_TABLES];
-} SECTION_PAGE_DIRECTORY, *PSECTION_PAGE_DIRECTORY;
-
 typedef struct _MM_SECTION_SEGMENT
 {
     FAST_MUTEX Lock;		/* lock which protects the page directory */
@@ -276,7 +266,6 @@
     ULONG Protection;
     ULONG Flags;
     BOOLEAN WriteCopy;
-    SECTION_PAGE_DIRECTORY PageDirectory;
 
 	struct 
 	{
@@ -284,6 +273,8 @@
 		ULONG_PTR VirtualAddress;	/* dtart offset into the address range for image sections */
 		ULONG Characteristics;
 	} Image;
+
+	RTL_GENERIC_TABLE PageTable;
 } MM_SECTION_SEGMENT, *PMM_SECTION_SEGMENT;
 
 typedef struct _MM_IMAGE_SECTION_OBJECT
@@ -517,7 +508,7 @@
 {
    PROS_SECTION_OBJECT Section;
    PMM_SECTION_SEGMENT Segment;
-   ULONG Offset;
+   LARGE_INTEGER Offset;
    BOOLEAN WasDirty;
    BOOLEAN Private;
 }
@@ -1054,7 +1045,30 @@
 MmDeleteKernelStack(PVOID Stack,
                     BOOLEAN GuiStack);
 
-/* balace.c ******************************************************************/
+/* sptab.c *******************************************************************/
+
+VOID
+NTAPI
+MiInitializeSectionPageTable(PMM_SECTION_SEGMENT Segment);
+
+NTSTATUS
+NTAPI
+MiSetPageEntrySectionSegment
+(PMM_SECTION_SEGMENT Segment,
+ PLARGE_INTEGER Offset,
+ ULONG Entry);
+
+ULONG
+NTAPI
+MiGetPageEntrySectionSegment
+(PMM_SECTION_SEGMENT Segment,
+ PLARGE_INTEGER Offset);
+
+VOID
+NTAPI
+MiFreePageTablesSectionSegment(PMM_SECTION_SEGMENT Segment);
+
+/* balance.c ******************************************************************/
 
 VOID
 NTAPI
@@ -1699,21 +1713,16 @@
 VOID
 MmPageOutDeleteMapping(PVOID Context, PEPROCESS Process, PVOID Address);
 
-ULONG
-NTAPI
-MmGetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
-                             ULONG Offset);
-
 VOID
 NTAPI
 MmSharePageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
-                               ULONG Offset);
+                               PLARGE_INTEGER Offset);
 
 BOOLEAN
 NTAPI
 MmUnsharePageEntrySectionSegment(PROS_SECTION_OBJECT Section,
                                  PMM_SECTION_SEGMENT Segment,
-                                 ULONG Offset,
+								 PLARGE_INTEGER Offset,
                                  BOOLEAN Dirty,
                                  BOOLEAN PageOut);
 

Modified: branches/arty-newcc/ntoskrnl/mm/section/data.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/mm/section/data.c?rev=44106&r1=44105&r2=44106&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/mm/section/data.c [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/mm/section/data.c [iso-8859-1] Wed Nov 11 16:14:32 2009
@@ -86,21 +86,6 @@
 
 /* Note: Mmsp prefix denotes "Memory Manager Section Private". */
 
-
-VOID
-NTAPI
-MiFreePageTablesSectionSegment(PMM_SECTION_SEGMENT Segment)
-{
-   ULONG i;
-   for (i = 0; i < NR_SECTION_PAGE_TABLES; i++)
-   {
-	   if (Segment->PageDirectory.PageTables[i] != NULL)
-	   {
-		   ExFreePool(Segment->PageDirectory.PageTables[i]);
-	   }
-   }
-}
-
 /*
  * FUNCTION:  Waits in kernel mode up to ten seconds for an MM_PAGEOP event.
  * ARGUMENTS: PMM_PAGEOP which event we should wait for.
@@ -153,69 +138,12 @@
 
 VOID
 NTAPI
-MmSetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
-                             ULONG Offset,
-                             ULONG Entry)
-{
-   PSECTION_PAGE_TABLE Table;
-   ULONG DirectoryOffset;
-   ULONG TableOffset;
-
-   DirectoryOffset = PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(Offset);
-   Table = Segment->PageDirectory.PageTables[DirectoryOffset];
-   if (Table == NULL)
-   {
-	   Table =
-		   Segment->PageDirectory.PageTables[DirectoryOffset] =
-		   ExAllocatePoolWithTag(NonPagedPool, sizeof(SECTION_PAGE_TABLE),
-								 TAG_SECTION_PAGE_TABLE);
-	   if (Table == NULL)
-	   {
-		   ASSERT(FALSE);
-	   }
-	   memset(Table, 0, sizeof(SECTION_PAGE_TABLE));
-	   DPRINT("Table %x\n", Table);
-   }
-   TableOffset = PAGE_TO_SECTION_PAGE_TABLE_OFFSET(Offset);
-   Table->Entry[TableOffset] = Entry;
-}
-
-
-ULONG
-NTAPI
-MmGetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
-                             ULONG Offset)
-{
-   PSECTION_PAGE_TABLE Table;
+MmSharePageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
+                               PLARGE_INTEGER Offset)
+{
    ULONG Entry;
-   ULONG DirectoryOffset;
-   ULONG TableOffset;
-
-   //DPRINT("MmGetPageEntrySection(Segment %x, Offset %x)\n", Segment, Offset);
-
-   DirectoryOffset = PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(Offset);
-   Table = Segment->PageDirectory.PageTables[DirectoryOffset];
-   if (Table == NULL)
-   {
-	   return(0);
-   }
-
-   TableOffset = PAGE_TO_SECTION_PAGE_TABLE_OFFSET(Offset);
-   Entry = Table->Entry[TableOffset];
-
-   //DPRINT("MmGetPageEntrySection(%p,%x) -> %x\n", Segment, Offset, Entry);
-
-   return(Entry);
-}
-
-VOID
-NTAPI
-MmSharePageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
-                               ULONG Offset)
-{
-   ULONG Entry;
-
-   Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+
+   Entry = MiGetPageEntrySectionSegment(Segment, Offset);
    if (Entry == 0)
    {
       DPRINT1("Entry == 0 for MmSharePageEntrySectionSegment\n");
@@ -231,14 +159,14 @@
       ASSERT(FALSE);
    }
    Entry = MAKE_SSE(PAGE_FROM_SSE(Entry), SHARE_COUNT_FROM_SSE(Entry) + 1);
-   MmSetPageEntrySectionSegment(Segment, Offset, Entry);
+   MiSetPageEntrySectionSegment(Segment, Offset, Entry);
 }
 
 BOOLEAN
 NTAPI
 MmUnsharePageEntrySectionSegment(PROS_SECTION_OBJECT Section,
                                  PMM_SECTION_SEGMENT Segment,
-                                 ULONG Offset,
+                                 PLARGE_INTEGER Offset,
                                  BOOLEAN Dirty,
                                  BOOLEAN PageOut)
 {
@@ -246,7 +174,7 @@
 
    DPRINT("MmUnsharePageEntrySectionSegment(%p,%x,Type %x)\n", Segment, Offset, Segment->Flags);
 
-   Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+   Entry = MiGetPageEntrySectionSegment(Segment, Offset);
    if (Entry == 0)
    {
       DPRINT1("Entry == 0 for MmUnsharePageEntrySectionSegment\n");
@@ -272,16 +200,13 @@
       SWAPENTRY SavedSwapEntry;
       PFN_TYPE Page;
 	  NTSTATUS Status;
-      LARGE_INTEGER FileOffset;
-
-      FileOffset.QuadPart = Offset;
 
       Page = PFN_FROM_SSE(Entry);
       FileObject = Section->FileObject;
 
 	  if (MmIsDirtyPageRmap(Page))
 	  {
-		  Status = MiWriteBackPage(FileObject, &FileOffset, PAGE_SIZE, Page);
+		  Status = MiWriteBackPage(FileObject, Offset, PAGE_SIZE, Page);
 		  if (!NT_SUCCESS(Status))
 		  {
 			  DPRINT1("CcRosUnmapCacheSegment failed, status = %x\n", Status);
@@ -293,13 +218,13 @@
 	  SavedSwapEntry = MmGetSavedSwapEntryPage(Page);
 	  if (SavedSwapEntry == 0)
 	  {
-		  MmSetPageEntrySectionSegment(Segment, Offset, 0);
+		  MiSetPageEntrySectionSegment(Segment, Offset, 0);
 		  MmReleasePageMemoryConsumer(MC_USER, Page);
 	  }
    }
    else
    {
-      MmSetPageEntrySectionSegment(Segment, Offset, Entry);
+      MiSetPageEntrySectionSegment(Segment, Offset, Entry);
    }
    DPRINT("MmUnsharePageEntrySectionSegment(%p,%x) -> Done\n", Segment, Offset);
    return(SHARE_COUNT_FROM_SSE(Entry) > 0);
@@ -440,7 +365,7 @@
 	 */
 	MmLockSectionSegment(Segment);
 
-	Entry = MmGetPageEntrySectionSegment(Segment, TotalOffset.QuadPart);
+	Entry = MiGetPageEntrySectionSegment(Segment, &TotalOffset);
 	HasSwapEntry = MmIsPageSwapEntry(Process, (PVOID)PAddress);
 	DPRINT("Entry %x HasSwapEntry %x Offset %x\n", Entry, HasSwapEntry, TotalOffset.QuadPart);
 
@@ -461,7 +386,7 @@
 		}
 
 		MmLockSectionSegment(Segment);
-		Entry = MmGetPageEntrySectionSegment(Segment, TotalOffset.QuadPart);
+		Entry = MiGetPageEntrySectionSegment(Segment, &TotalOffset);
 
 		if (Entry != 0) // Handled elsewhere
 		{
@@ -568,7 +493,7 @@
 		 * Check the entry. No one should change the status of a page
 		 * that has a pending page-in.
 		 */
-		Entry1 = MmGetPageEntrySectionSegment(Segment, TotalOffset.QuadPart);
+		Entry1 = MiGetPageEntrySectionSegment(Segment, &TotalOffset);
 		if (Entry != Entry1)
 		{
 			DPRINT1("Someone changed ppte entry while we slept\n");
@@ -580,7 +505,7 @@
 		 * data
 		 */
 		Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-		MmSetPageEntrySectionSegment(Segment, TotalOffset.QuadPart, Entry);
+		MiSetPageEntrySectionSegment(Segment, &TotalOffset, Entry);
 
 		MmInsertRmap(Page, Process, (PVOID)PAddress);
 		MmSetCleanAllRmaps(Page);
@@ -614,7 +539,7 @@
 
 		Page = PFN_FROM_SSE(Entry);
 
-		MmSharePageEntrySectionSegment(Segment, TotalOffset.QuadPart);
+		MmSharePageEntrySectionSegment(Segment, &TotalOffset);
 
 		Status = MmCreateVirtualMapping(Process,
 										Address,
@@ -670,7 +595,7 @@
    PFN_TYPE NewPage;
    NTSTATUS Status;
    PVOID PAddress;
-   ULONG Offset;
+   LARGE_INTEGER Offset;
    PMM_REGION Region;
    ULONG Entry;
    PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
@@ -691,8 +616,8 @@
     * Find the offset of the page
     */
    PAddress = MM_ROUND_DOWN(Address, PAGE_SIZE);
-   Offset = (ULONG_PTR)PAddress - (ULONG_PTR)MemoryArea->StartingAddress
-            + MemoryArea->Data.SectionData.ViewOffset;
+   Offset.QuadPart = (ULONG_PTR)PAddress - (ULONG_PTR)MemoryArea->StartingAddress
+	   + MemoryArea->Data.SectionData.ViewOffset;
 
    Segment = MemoryArea->Data.SectionData.Segment;
    Section = MemoryArea->Data.SectionData.Section;
@@ -705,7 +630,7 @@
    MmLockSectionSegment(Segment);
 
    OldPage = MmGetPfnForProcess(Process, Address);
-   Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+   Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 
    /*
     * Check if we are doing COW
@@ -779,7 +704,7 @@
     */
    MmDeleteRmap(OldPage, Process, PAddress);
    MmInsertRmap(NewPage, Process, PAddress);
-   MmUnsharePageEntrySectionSegment(Section, Segment, Offset, FALSE, FALSE);
+   MmUnsharePageEntrySectionSegment(Section, Segment, &Offset, FALSE, FALSE);
    MmUnlockSectionSegment(Segment);
 
    DPRINT("Address 0x%.8X\n", Address);
@@ -795,19 +720,19 @@
  PVOID Address,
  PPFN_TYPE Page)
 {
-	ULONG Offset;
 	NTSTATUS Status;
 	ULONG Entry, Entry1;
 	SWAPENTRY SwapEntry;
 	PMM_REGION Region;
+	LARGE_INTEGER Offset;
 	PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
 	
 	Address = MM_ROUND_DOWN(Address, PAGE_SIZE);
-	Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress;
+	Offset.QuadPart = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress;
 	Region = MmFindRegion(MemoryArea->StartingAddress,
 						  &MemoryArea->Data.SectionData.RegionListHead,
 						  Address, NULL);
-	Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+	Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 	SwapEntry = SWAPENTRY_FROM_SSE(Entry);
 	
 	/*
@@ -839,7 +764,7 @@
 	 * Check the entry. No one should change the status of a page
 	 * that has a pending page-in.
 	 */
-	Entry1 = MmGetPageEntrySectionSegment(Segment, Offset);
+	Entry1 = MiGetPageEntrySectionSegment(Segment, &Offset);
 	if (Entry != Entry1)
 	{
 		DPRINT1("Someone changed ppte entry while we slept\n");
@@ -851,7 +776,7 @@
 	 * data
 	 */
 	Entry = MAKE_SSE(*Page << PAGE_SHIFT, 1);
-	MmSetPageEntrySectionSegment(Segment, Offset, Entry);
+	MiSetPageEntrySectionSegment(Segment, &Offset, Entry);
 	MmUnlockSectionSegment(Segment);
 	
 	/*
@@ -905,7 +830,7 @@
 	while (FileOffset.QuadPart < End.QuadPart)
 	{
 		PVOID Address;
-		ULONG Entry = MmGetPageEntrySectionSegment(Segment, FileOffset.QuadPart);
+		ULONG Entry = MiGetPageEntrySectionSegment(Segment, &FileOffset);
 		if (Entry == 0)
 		{
 			if (!NT_SUCCESS(MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page)))
@@ -917,7 +842,7 @@
 			Address = ((PCHAR)MemoryArea->StartingAddress) + FileOffset.QuadPart - FirstMapped.QuadPart;
 			MmCreateVirtualMapping(NULL, Address, PAGE_READWRITE, &Page, 1);
 			MmInsertRmap(Page, NULL, Address);
-			MmSetPageEntrySectionSegment(Segment, FileOffset.QuadPart, MAKE_SSE(Page << PAGE_SHIFT, 1));
+			MiSetPageEntrySectionSegment(Segment, &FileOffset, MAKE_SSE(Page << PAGE_SHIFT, 1));
 		}
 		FileOffset.QuadPart += PAGE_SIZE;
 	}
@@ -963,7 +888,7 @@
       MmLockSectionSegment(PageOutContext->Segment);
       MmUnsharePageEntrySectionSegment((PROS_SECTION_OBJECT)PageOutContext->Section,
                                        PageOutContext->Segment,
-                                       PageOutContext->Offset,
+                                       &PageOutContext->Offset,
                                        PageOutContext->WasDirty,
                                        TRUE);
       MmUnlockSectionSegment(PageOutContext->Segment);
@@ -1005,15 +930,15 @@
    Context.Segment = MemoryArea->Data.SectionData.Segment;
    Context.Section = MemoryArea->Data.SectionData.Section;
 
-   Context.Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress;
-   FileOffset.QuadPart = Context.Offset;
+   Context.Offset.QuadPart = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress;
+   FileOffset = Context.Offset;
 
    FileObject = Context.Section->FileObject;
 
    /*
     * Get the section segment entry and the physical address.
     */
-   Entry = MmGetPageEntrySectionSegment(Context.Segment, Context.Offset);
+   Entry = MiGetPageEntrySectionSegment(Context.Segment, &Context.Offset);
    if (!MmIsPagePresent(Process, Address))
    {
       DPRINT1("Trying to page out not-present page at (%d,0x%.8X).\n",
@@ -1132,7 +1057,7 @@
                          Process,
                          Address);
             Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-            MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+            MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
          }
          MmUnlockAddressSpace(AddressSpace);
          PageOp->Status = STATUS_UNSUCCESSFUL;
@@ -1178,7 +1103,7 @@
                       Process,
                       Address);
          Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-         MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+         MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
       }
       MmUnlockAddressSpace(AddressSpace);
       PageOp->Status = STATUS_UNSUCCESSFUL;
@@ -1208,7 +1133,7 @@
    else
    {
       Entry = MAKE_SWAP_SSE(SwapEntry);
-      MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+      MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
    }
 
    PageOp->Status = STATUS_SUCCESS;
@@ -1250,7 +1175,7 @@
    /*
     * Get the section segment entry and the physical address.
     */
-   Entry = MmGetPageEntrySectionSegment(Segment, Offset.QuadPart);
+   Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
    if (!MmIsPagePresent(Process, Address))
    {
       DPRINT1("Trying to page out not-present page at (%d,0x%.8X).\n",
@@ -1376,9 +1301,9 @@
 		ULONG Entry;
 		FileOffset.QuadPart = PageAddress - BeginningAddress + ViewOffset.QuadPart;
 		Entry =
-			MmGetPageEntrySectionSegment
+			MiGetPageEntrySectionSegment
 			(MemoryArea->Data.SectionData.Segment, 
-			 FileOffset.QuadPart);
+			 &FileOffset);
 		Page = PFN_FROM_SSE(Entry);
 		if (Entry != 0 && !IS_SWAP_FROM_SSE(Entry) && MmIsDirtyPageRmap(Page) &&
 			FileOffset.QuadPart < FileSize->QuadPart)
@@ -1464,13 +1389,13 @@
 		 Present = MmIsPagePresent(Process, Address);
          if (DoCOW && Present)
          {
-            ULONG Offset;
+            LARGE_INTEGER Offset;
             ULONG Entry;
             PFN_TYPE Page;
 
-            Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress
+            Offset.QuadPart = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress
                      + MemoryArea->Data.SectionData.ViewOffset;
-            Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+            Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
             Page = MmGetPfnForProcess(Process, Address);
 
             Protect = PAGE_READONLY;
@@ -1797,7 +1722,7 @@
          Segment->RawLength = MaximumSize;
          Segment->Length.QuadPart = PAGE_ROUND_UP(Segment->RawLength.QuadPart);
       }
-      RtlZeroMemory(&Segment->PageDirectory, sizeof(SECTION_PAGE_DIRECTORY));
+	  MiInitializeSectionPageTable(Segment);
    }
    else
    {
@@ -2320,7 +2245,7 @@
       PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset.QuadPart);
    }
 
-   Entry = MmGetPageEntrySectionSegment(Segment, Offset.QuadPart);
+   Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 
    /*
     * For a dirty, datafile, non-private page mark it as dirty in the
@@ -2356,7 +2281,7 @@
       else
       {
          MmDeleteRmap(Page, Process, Address);
-         MmUnsharePageEntrySectionSegment(Section, Segment, Offset.QuadPart, Dirty, FALSE);
+         MmUnsharePageEntrySectionSegment(Section, Segment, &Offset, Dirty, FALSE);
       }
    }
 }
@@ -2703,7 +2628,6 @@
  BOOLEAN ExtendFile)
 {
 	PMM_SECTION_SEGMENT Segment = Section->Segment;
-	PSECTION_PAGE_TABLE PageTable = NULL;
 	LARGE_INTEGER OldSize;
 	DPRINT("Extend Segment %x\n", Segment);
 
@@ -2719,11 +2643,7 @@
 	{
 		NTSTATUS Status;
 		Status = IoSetInformation(Segment->FileObject, FileEndOfFileInformation, sizeof(LARGE_INTEGER), NewSize);
-		if (!NT_SUCCESS(Status))
-		{
-			if (PageTable) ExFreePool(PageTable);
-			return Status;
-		}
+		if (!NT_SUCCESS(Status)) return Status;
 	}
 
 	MmLockSectionSegment(Segment);

Modified: branches/arty-newcc/ntoskrnl/mm/section/image.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/mm/section/image.c?rev=44106&r1=44105&r2=44106&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/mm/section/image.c [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/mm/section/image.c [iso-8859-1] Wed Nov 11 16:14:32 2009
@@ -86,15 +86,15 @@
 MmUnsharePageEntryImageSectionSegment
 (PROS_SECTION_OBJECT Section,
  PMM_SECTION_SEGMENT Segment,
- ULONG Offset,
+ PLARGE_INTEGER Offset,
  BOOLEAN Dirty,
  BOOLEAN PageOut)
 {
    ULONG Entry;
 
-   DPRINT("MmUnsharePageEntrySectionSegment(%p,%x)\n", Segment, Offset);
-
-   Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+   DPRINT("MmUnsharePageEntrySectionSegment(%p,%x)\n", Segment, Offset->u.LowPart);
+
+   Entry = MiGetPageEntrySectionSegment(Segment, Offset);
    if (Entry == 0)
    {
       DPRINT1("Entry == 0 for MmUnsharePageEntrySectionSegment\n");
@@ -120,7 +120,7 @@
       PFN_TYPE Page;
       LARGE_INTEGER FileOffset;
 
-      FileOffset.QuadPart = Offset + Segment->Image.FileOffset/*.QuadPart*/;
+      FileOffset.QuadPart = Offset->QuadPart + Segment->Image.FileOffset/*.QuadPart*/;
 
       Page = PFN_FROM_SSE(Entry);
 
@@ -136,11 +136,11 @@
              *   for this page. The pager thread can't page out a
              *   page without a rmap entry.
              */
-            MmSetPageEntrySectionSegment(Segment, Offset, Entry);
+			MiSetPageEntrySectionSegment(Segment, Offset, Entry);
          }
          else
          {
-            MmSetPageEntrySectionSegment(Segment, Offset, 0);
+            MiSetPageEntrySectionSegment(Segment, Offset, 0);
 			MmReleasePageMemoryConsumer(MC_USER, Page);
          }
       }
@@ -165,7 +165,7 @@
                      ASSERT(FALSE);
                   }
                }
-               MmSetPageEntrySectionSegment(Segment, Offset, MAKE_SWAP_SSE(SavedSwapEntry));
+               MiSetPageEntrySectionSegment(Segment, Offset, MAKE_SWAP_SSE(SavedSwapEntry));
                MmSetSavedSwapEntryPage(Page, 0);
             }
             MmReleasePageMemoryConsumer(MC_USER, Page);
@@ -179,9 +179,9 @@
    }
    else
    {
-      MmSetPageEntrySectionSegment(Segment, Offset, Entry);
-   }
-   DPRINT("MmUnsharePageEntrySectionSegment(%p,%x) -> Done\n", Segment, Offset);
+      MiSetPageEntrySectionSegment(Segment, Offset, Entry);
+   }
+   DPRINT("MmUnsharePageEntrySectionSegment(%p,%x) -> Done\n", Segment, Offset->u.LowPart);
    return(SHARE_COUNT_FROM_SSE(Entry) > 0);
 }
 
@@ -193,7 +193,7 @@
  PVOID Address,
  BOOLEAN Locked)
 {
-	ULONG Offset;
+	LARGE_INTEGER Offset;
 	PFN_TYPE Page;
 	NTSTATUS Status;
 	PVOID PAddress;
@@ -226,7 +226,7 @@
 	}
 
 	PAddress = MM_ROUND_DOWN(Address, PAGE_SIZE);
-	Offset = (ULONG_PTR)PAddress - (ULONG_PTR)MemoryArea->StartingAddress;
+	Offset.QuadPart = (ULONG_PTR)PAddress - (ULONG_PTR)MemoryArea->StartingAddress;
 
 	Segment = MemoryArea->Data.SectionData.Segment;
 	Section = MemoryArea->Data.SectionData.Section;
@@ -239,13 +239,13 @@
 	 */
 	MmLockSectionSegment(Segment);
 
-	Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+	Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 	HasSwapEntry = MmIsPageSwapEntry(Process, (PVOID)PAddress);
-	DPRINT("Entry %x HasSwapEntry %x Offset %x\n", Entry, HasSwapEntry, Offset);
-
-	if (Entry == 0 && !HasSwapEntry && Offset < PAGE_ROUND_UP(Segment->RawLength.QuadPart))
+	DPRINT("Entry %x HasSwapEntry %x Offset %x\n", Entry, HasSwapEntry, Offset.u.LowPart);
+
+	if (Entry == 0 && !HasSwapEntry && Offset.QuadPart < PAGE_ROUND_UP(Segment->RawLength.QuadPart))
 	{
-		TotalOffset.QuadPart = Offset + Segment->Image.FileOffset/*.QuadPart*/;
+		TotalOffset.QuadPart = Offset.QuadPart + Segment->Image.FileOffset/*.QuadPart*/;
 
 		MmUnlockSectionSegment(Segment);
 		MmUnlockAddressSpace(AddressSpace);
@@ -258,7 +258,7 @@
 		}
 
 		MmLockSectionSegment(Segment);
-		Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+		Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 		if (Entry != 0) // Handled elsewhere
 		{
 			MmUnlockSectionSegment(Segment);
@@ -385,7 +385,7 @@
 	 * Get the entry corresponding to the offset within the section
 	 */
 	DPRINT("MmNotPresentFaultSectionView -> MmGetPageEntrySectionSegment(%p, %x)\n", Segment, Offset);
-	Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+	Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 	DPRINT("Got entry %x\n", Entry);
 
 	if (Entry == 0)
@@ -400,7 +400,7 @@
 		 */
 		MmUnlockAddressSpace(AddressSpace);
 
-		if (Offset >= PAGE_ROUND_UP(Segment->RawLength.QuadPart))
+		if (Offset.QuadPart >= PAGE_ROUND_UP(Segment->RawLength.QuadPart))
 		{
 			Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page);
 			if (!NT_SUCCESS(Status))
@@ -453,7 +453,7 @@
 		 * data
 		 */
 		Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-		MmSetPageEntrySectionSegment(Segment, Offset, Entry);
+		MiSetPageEntrySectionSegment(Segment, &Offset, Entry);
 
 		MmInsertRmap(Page, Process, (PVOID)PAddress);
 
@@ -485,7 +485,7 @@
 
 		Page = PFN_FROM_SSE(Entry);
 
-		MmSharePageEntrySectionSegment(Segment, Offset);
+		MmSharePageEntrySectionSegment(Segment, &Offset);
 
 		Status = MmCreateVirtualMapping(Process,
 										Address,
@@ -534,8 +534,8 @@
    Context.Segment = MemoryArea->Data.SectionData.Segment;
    Context.Section = MemoryArea->Data.SectionData.Section;
 
-   Context.Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress;
-   FileOffset.QuadPart = Context.Offset + Context.Segment->Image.FileOffset/*.QuadPart*/;
+   Context.Offset.QuadPart = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress;
+   FileOffset.QuadPart = Context.Offset.QuadPart + Context.Segment->Image.FileOffset/*.QuadPart*/;
 
    IsImageSection = Context.Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE;
 
@@ -549,7 +549,7 @@
        * then note this is a direct mapped page.
        */
       if ((FileOffset.QuadPart % PAGE_SIZE) == 0 &&
-            (Context.Offset + PAGE_SIZE <= Context.Segment->RawLength.QuadPart || !IsImageSection))
+            (Context.Offset.QuadPart + PAGE_SIZE <= Context.Segment->RawLength.QuadPart || !IsImageSection))
       {
          DirectMapped = TRUE;
       }
@@ -559,7 +559,7 @@
     * Get the section segment entry and the physical address.
     */
    DPRINT("MmPageOutSectionView -> MmGetPageEntrySectionSegment(%p, %x)\n", Context.Segment, Context.Offset);
-   Entry = MmGetPageEntrySectionSegment(Context.Segment, Context.Offset);
+   Entry = MiGetPageEntrySectionSegment(Context.Segment, &Context.Offset);
    if (!MmIsPagePresent(Process, Address))
    {
       DPRINT1("Trying to page out not-present page at (%d,0x%.8X).\n",
@@ -608,7 +608,7 @@
          MmSetSavedSwapEntryPage(Page, 0);
          if (SwapEntry != 0)
          {
-            MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, MAKE_SWAP_SSE(SwapEntry));
+            MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, MAKE_SWAP_SSE(SwapEntry));
          }
          MmReleasePageMemoryConsumer(MC_USER, Page);
          PageOp->Status = STATUS_SUCCESS;
@@ -715,7 +715,7 @@
                          Process,
                          Address);
             Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-            MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+            MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
          }
          MmUnlockAddressSpace(AddressSpace);
          PageOp->Status = STATUS_UNSUCCESSFUL;
@@ -761,7 +761,7 @@
                       Process,
                       Address);
          Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-         MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+         MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
       }
       MmUnlockAddressSpace(AddressSpace);
       PageOp->Status = STATUS_UNSUCCESSFUL;
@@ -776,7 +776,7 @@
    MmSetSavedSwapEntryPage(Page, 0);
    if (Context.Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)
    {
-      MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, MAKE_SWAP_SSE(SwapEntry));
+      MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, MAKE_SWAP_SSE(SwapEntry));
    }
    else
    {
@@ -798,7 +798,7 @@
    else
    {
       Entry = MAKE_SWAP_SSE(SwapEntry);
-      MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+      MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
    }
 
    PageOp->Status = STATUS_SUCCESS;
@@ -1438,9 +1438,7 @@
       ExInitializeFastMutex(&ImageSectionObject->Segments[i].Lock);
 	  ImageSectionObject->Segments[i].Flags = MM_IMAGE_SEGMENT;
       ImageSectionObject->Segments[i].ReferenceCount = 1;
-
-      RtlZeroMemory(&ImageSectionObject->Segments[i].PageDirectory,
-                    sizeof(ImageSectionObject->Segments[i].PageDirectory));
+	  MiInitializeSectionPageTable(&ImageSectionObject->Segments[i]);
    }
 
    ASSERT(NT_SUCCESS(Status));
@@ -1618,18 +1616,18 @@
 MmpFreeSharedSegment(PMM_SECTION_SEGMENT Segment)
 {
    ULONG Length;
-   ULONG Offset;
    ULONG Entry;
    ULONG SavedSwapEntry;
    PFN_TYPE Page;
+   LARGE_INTEGER Offset;
 
    Page = 0;
 
    Length = PAGE_ROUND_UP(Segment->Length.QuadPart);
-   for (Offset = 0; Offset < Length; Offset += PAGE_SIZE)
-   {
-      DPRINT("MmAlterViewAttributes -> MmGetPageEntrySectionSegment(%p, %x)\n", Segment, Offset);
-      Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+   for (Offset.QuadPart = 0; Offset.QuadPart < Length; Offset.QuadPart += PAGE_SIZE)
+   {
+      DPRINT("MmAlterViewAttributes -> MmGetPageEntrySectionSegment(%p, %x)\n", Segment, Offset.u.LowPart);
+      Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
       if (Entry)
       {
          if (IS_SWAP_FROM_SSE(Entry))
@@ -1647,7 +1645,7 @@
             }
             MmReleasePageMemoryConsumer(MC_USER, Page);
          }
-         MmSetPageEntrySectionSegment(Segment, Offset, 0);
+         MiSetPageEntrySectionSegment(Segment,& Offset, 0);
       }
    }
 }
@@ -1784,10 +1782,10 @@
 {
    ULONG Entry;
    PFILE_OBJECT FileObject;
-   ULONG Offset;
    SWAPENTRY SavedSwapEntry;
    PMM_PAGEOP PageOp;
    NTSTATUS Status;
+   LARGE_INTEGER Offset;
    PROS_SECTION_OBJECT Section;
    PMM_SECTION_SEGMENT Segment;
    PMMSUPPORT AddressSpace;
@@ -1798,13 +1796,13 @@
 
    Address = (PVOID)PAGE_ROUND_DOWN(Address);
 
-   Offset = ((ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress) +
+   Offset.QuadPart = ((ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress) +
             MemoryArea->Data.SectionData.ViewOffset;
 
    Section = MemoryArea->Data.SectionData.Section;
    Segment = MemoryArea->Data.SectionData.Segment;
 
-   PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset);
+   PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset.QuadPart);
 
    while (PageOp)
    {
@@ -1821,11 +1819,11 @@
       MmLockAddressSpace(AddressSpace);
       MmLockSectionSegment(Segment);
       MmspCompleteAndReleasePageOp(PageOp);
-      PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset);
-   }
-
-   DPRINT("MmFreeSectionPage -> MmGetPageEntrySectionSegment(%p, %x)\n", Segment, Offset);
-   Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+      PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset.QuadPart);
+   }
+
+   DPRINT("MmFreeSectionPage -> MmGetPageEntrySectionSegment(%p, %x)\n", Segment, Offset.u.LowPart);
+   Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 
    /*
     * For a dirty, datafile, non-private page mark it as dirty in the
@@ -1872,7 +1870,7 @@
       else
       {
          MmDeleteRmap(Page, Process, Address);
-         MmUnsharePageEntryImageSectionSegment(Section, Segment, Offset, Dirty, FALSE);
+         MmUnsharePageEntryImageSectionSegment(Section, Segment, &Offset, Dirty, FALSE);
       }
    }
 }

Modified: branches/arty-newcc/ntoskrnl/mm/section/pagefile.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/mm/section/pagefile.c?rev=44106&r1=44105&r2=44106&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/mm/section/pagefile.c [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/mm/section/pagefile.c [iso-8859-1] Wed Nov 11 16:14:32 2009
@@ -62,10 +62,10 @@
  PVOID Address,
  BOOLEAN Locked)
 {
-	ULONG Offset;
 	PFN_TYPE Page;
 	NTSTATUS Status;
 	PVOID PAddress;
+	LARGE_INTEGER Offset;
 	PROS_SECTION_OBJECT Section;
 	PMM_SECTION_SEGMENT Segment;
 	ULONG Entry;
@@ -93,7 +93,7 @@
 	}
 
 	PAddress = MM_ROUND_DOWN(Address, PAGE_SIZE);
-	Offset = (ULONG_PTR)PAddress - (ULONG_PTR)MemoryArea->StartingAddress;
+	Offset.QuadPart = (ULONG_PTR)PAddress - (ULONG_PTR)MemoryArea->StartingAddress;
 
 	Segment = MemoryArea->Data.SectionData.Segment;
 	Section = MemoryArea->Data.SectionData.Section;
@@ -122,7 +122,7 @@
 	/*
 	 * Get or create a page operation descriptor
 	 */
-	PageOp = MmGetPageOp(MemoryArea, NULL, 0, Segment, Offset, MM_PAGEOP_PAGEIN, FALSE);
+	PageOp = MmGetPageOp(MemoryArea, NULL, 0, Segment, Offset.QuadPart, MM_PAGEOP_PAGEIN, FALSE);
 	if (PageOp == NULL)
 	{
 		DPRINT1("MmGetPageOp failed\n");
@@ -181,7 +181,7 @@
 		{
 			DPRINT("!MmIsPagePresent(%p, %p)\n", Process, Address);
 
-			Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+			Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 			HasSwapEntry = MmIsPageSwapEntry(Process, (PVOID)PAddress);
 
 			if (PAGE_FROM_SSE(Entry) == 0 || HasSwapEntry)
@@ -196,7 +196,7 @@
 
 			Page = PFN_FROM_SSE(Entry);
 
-			MmSharePageEntrySectionSegment(Segment, Offset);
+			MmSharePageEntrySectionSegment(Segment, &Offset);
 
 			/* FIXME: Should we call MmCreateVirtualMappingUnsafe if
 			 * (Section->AllocationAttributes & SEC_PHYSICALMEMORY) is true?
@@ -227,7 +227,7 @@
 	/*
 	 * Get the entry corresponding to the offset within the section
 	 */
-	Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+	Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 
 	if (Entry == 0)
 	{
@@ -268,7 +268,7 @@
 		 * Check the entry. No one should change the status of a page
 		 * that has a pending page-in.
 		 */
-		Entry1 = MmGetPageEntrySectionSegment(Segment, Offset);
+		Entry1 = MiGetPageEntrySectionSegment(Segment, &Offset);
 		if (Entry != Entry1)
 		{
 			DPRINT1("Someone changed ppte entry while we slept\n");
@@ -280,7 +280,7 @@
 		 * data
 		 */
 		Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-		MmSetPageEntrySectionSegment(Segment, Offset, Entry);
+		MiSetPageEntrySectionSegment(Segment, &Offset, Entry);
 		MmUnlockSectionSegment(Segment);
 
 		MmInsertRmap(Page, Process, (PVOID)PAddress);
@@ -314,7 +314,7 @@
 
 		Page = PFN_FROM_SSE(Entry);
 
-		MmSharePageEntrySectionSegment(Segment, Offset);
+		MmSharePageEntrySectionSegment(Segment, &Offset);
 		MmUnlockSectionSegment(Segment);
 
 		Status = MmCreateVirtualMapping(Process,
@@ -414,7 +414,7 @@
    Segment->Length.QuadPart = PAGE_ROUND_UP(MaximumSize.QuadPart);
    Segment->Flags = MM_PAGEFILE_SEGMENT;
    Segment->WriteCopy = FALSE;
-   RtlZeroMemory(&Segment->PageDirectory, sizeof(SECTION_PAGE_DIRECTORY));
+   MiInitializeSectionPageTable(Segment);
    *SectionObject = Section;
    return(STATUS_SUCCESS);
 }
@@ -446,7 +446,7 @@
       MmLockSectionSegment(PageOutContext->Segment);
       MmUnsharePageEntrySectionSegment((PROS_SECTION_OBJECT)PageOutContext->Section,
                                        PageOutContext->Segment,
-                                       PageOutContext->Offset,
+                                       &PageOutContext->Offset,
                                        PageOutContext->WasDirty,
                                        TRUE);
       MmUnlockSectionSegment(PageOutContext->Segment);
@@ -490,8 +490,8 @@
    Context.Segment = MemoryArea->Data.SectionData.Segment;
    Context.Section = MemoryArea->Data.SectionData.Section;
 
-   Context.Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress;
-   FileOffset.QuadPart = Context.Offset;
+   Context.Offset.QuadPart = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress;
+   FileOffset = Context.Offset;
 
    IsImageSection = Context.Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE;
 
@@ -501,7 +501,7 @@
     * Get the section segment entry and the physical address.
     */
    DPRINT("MmPageOutSectionView -> MmGetPageEntrySectionSegment(%p, %x)\n", Context.Segment, Context.Offset);
-   Entry = MmGetPageEntrySectionSegment(Context.Segment, Context.Offset);
+   Entry = MiGetPageEntrySectionSegment(Context.Segment, &Context.Offset);
    if (!MmIsPagePresent(Process, Address))
    {
       DPRINT1("Trying to page out not-present page at (%d,0x%.8X).\n",
@@ -608,7 +608,7 @@
                          Process,
                          Address);
             Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-            MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+            MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
          }
          MmUnlockAddressSpace(AddressSpace);
          PageOp->Status = STATUS_UNSUCCESSFUL;
@@ -654,7 +654,7 @@
                       Process,
                       Address);
          Entry = MAKE_SSE(Page << PAGE_SHIFT, 1);
-         MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+         MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
       }
       MmUnlockAddressSpace(AddressSpace);
       PageOp->Status = STATUS_UNSUCCESSFUL;
@@ -684,7 +684,7 @@
    else
    {
       Entry = MAKE_SWAP_SSE(SwapEntry);
-      MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry);
+      MiSetPageEntrySectionSegment(Context.Segment, &Context.Offset, Entry);
    }
 
    PageOp->Status = STATUS_SUCCESS;
@@ -698,9 +698,9 @@
  PFN_TYPE Page, SWAPENTRY SwapEntry, BOOLEAN Dirty)
 {
    ULONG Entry;
-   ULONG Offset;
    PMM_PAGEOP PageOp;
    NTSTATUS Status;
+   LARGE_INTEGER Offset;
    PROS_SECTION_OBJECT Section;
    PMM_SECTION_SEGMENT Segment;
    PMMSUPPORT AddressSpace;
@@ -711,13 +711,13 @@
 
    Address = (PVOID)PAGE_ROUND_DOWN(Address);
 
-   Offset = ((ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress) +
+   Offset.QuadPart = ((ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress) +
             MemoryArea->Data.SectionData.ViewOffset;
 
    Section = MemoryArea->Data.SectionData.Section;
    Segment = MemoryArea->Data.SectionData.Segment;
 
-   PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset);
+   PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset.QuadPart);
 
    while (PageOp)
    {
@@ -734,16 +734,16 @@
       MmLockAddressSpace(AddressSpace);
       MmLockSectionSegment(Segment);
       MmspCompleteAndReleasePageOp(PageOp);
-      PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset);
-   }
-
-   DPRINT("MmFreeSectionPage -> MmGetPageEntrySectionSegment(%p, %x)\n", Segment, Offset);
-   Entry = MmGetPageEntrySectionSegment(Segment, Offset);
+      PageOp = MmCheckForPageOp(MemoryArea, NULL, NULL, Segment, Offset.QuadPart);
+   }
+
+   DPRINT("MmFreeSectionPage -> MmGetPageEntrySectionSegment(%p, %x)\n", Segment, Offset.u.LowPart);
+   Entry = MiGetPageEntrySectionSegment(Segment, &Offset);
 
    if (Page != 0)
    {
 	   MmDeleteRmap(Page, Process, Address);
-	   MmUnsharePageEntrySectionSegment(Section, Segment, Offset, Dirty, FALSE);
+	   MmUnsharePageEntrySectionSegment(Section, Segment, &Offset, Dirty, FALSE);
    }
 }
 

Added: branches/arty-newcc/ntoskrnl/mm/section/sptab.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/mm/section/sptab.c?rev=44106&view=auto
==============================================================================
--- branches/arty-newcc/ntoskrnl/mm/section/sptab.c (added)
+++ branches/arty-newcc/ntoskrnl/mm/section/sptab.c [iso-8859-1] Wed Nov 11 16:14:32 2009
@@ -1,0 +1,202 @@
+/*
+ * Copyright (C) 1998-2005 ReactOS Team (and the authors from the programmers section)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/mm/section.c
+ * PURPOSE:         Section object page tables
+ *
+ * PROGRAMMERS:     arty
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+/* TYPES *********************************************************************/
+
+#define ENTRIES_PER_ELEMENT 244
+
+PVOID NTAPI RtlGetElementGenericTable(PRTL_GENERIC_TABLE Table, PVOID Data);
+ULONG NTAPI RtlNumberGenericTableElements(PRTL_GENERIC_TABLE Table);
+
+typedef struct _SECTION_PAGE_TABLE 
+{
+    LARGE_INTEGER FileOffset;
+    ULONG Refcount;
+    ULONG PageEntries[ENTRIES_PER_ELEMENT];
+} SECTION_PAGE_TABLE, *PSECTION_PAGE_TABLE;
+
+SECTION_PAGE_TABLE MiSectionZeroPageTable = { };
+
+static
+PVOID
+NTAPI
+MiSectionPageTableAllocate(PRTL_GENERIC_TABLE Table, CLONG Bytes)
+{
+    PVOID Result;
+    Result = ExAllocatePoolWithTag(NonPagedPool, Bytes, 'MmPt');
+    DPRINT("MiSectionPageTableAllocate(%d) => %p\n", Bytes, Result);
+    return Result;
+}
+
+static
+VOID
+NTAPI
+MiSectionPageTableFree(PRTL_GENERIC_TABLE Table, PVOID Data)
+{
+    DPRINT("MiSectionPageTableFree(%p)\n", Data);
+    ExFreePoolWithTag(Data, 'MmPt');
+}
+
+static
+RTL_GENERIC_COMPARE_RESULTS
+NTAPI
+MiSectionPageTableCompare(PRTL_GENERIC_TABLE Table, PVOID PtrA, PVOID PtrB)
+{
+    PLARGE_INTEGER A = PtrA, B = PtrB;
+    BOOLEAN Result = (A->QuadPart < B->QuadPart) ? GenericLessThan : 
+        (A->QuadPart == B->QuadPart) ? GenericEqual : GenericGreaterThan;
+
+    DPRINT
+        ("Compare: %08x%08x vs %08x%08x => %s\n",
+         A->u.HighPart, A->u.LowPart,
+         B->u.HighPart, B->u.LowPart,
+         Result == GenericLessThan ? "GenericLessThan" :
+         Result == GenericGreaterThan ? "GenericGreaterThan" : 
+            "GenericEqual");
+
+    return Result;
+}
+
+static
+PSECTION_PAGE_TABLE
+NTAPI
+MiSectionPageTableGet
+(PRTL_GENERIC_TABLE Table, 
+ PLARGE_INTEGER FileOffset)
+{
+    LARGE_INTEGER SearchFileOffset;
+    SearchFileOffset.QuadPart = ROUND_DOWN(FileOffset->QuadPart, ENTRIES_PER_ELEMENT * PAGE_SIZE);
+    return RtlLookupElementGenericTable(Table, &SearchFileOffset);
+}
+
+static
+PSECTION_PAGE_TABLE
+NTAPI
+MiSectionPageTableGetOrAllocate
+(PRTL_GENERIC_TABLE Table, 
+ PLARGE_INTEGER FileOffset)
+{
+    LARGE_INTEGER SearchFileOffset;
+    PSECTION_PAGE_TABLE PageTableSlice = 
+        MiSectionPageTableGet(Table, FileOffset);
+    if (!PageTableSlice)
+    {
+        SearchFileOffset.QuadPart = ROUND_DOWN(FileOffset->QuadPart, ENTRIES_PER_ELEMENT * PAGE_SIZE);
+        MiSectionZeroPageTable.FileOffset = SearchFileOffset;
+        MiSectionZeroPageTable.Refcount = 1;
+        PageTableSlice = RtlInsertElementGenericTable
+            (Table, &MiSectionZeroPageTable, sizeof(MiSectionZeroPageTable), NULL);
+        DPRINT
+            ("Allocate page table %x (%08x%08x)\n", 
+             PageTableSlice,
+             PageTableSlice->FileOffset.u.HighPart,
+             PageTableSlice->FileOffset.u.LowPart);
+        if (!PageTableSlice) return NULL;
+    }
+    return PageTableSlice;
+}
+
+VOID
+NTAPI
+MiInitializeSectionPageTable(PMM_SECTION_SEGMENT Segment)
+{
+    RtlInitializeGenericTable
+        (&Segment->PageTable,
+         MiSectionPageTableCompare,
+         MiSectionPageTableAllocate,
+         MiSectionPageTableFree,
+         NULL);
+    DPRINT("MiInitializeSectionPageTable(%p)\n", &Segment->PageTable);
+}
+
+NTSTATUS
+NTAPI
+MiSetPageEntrySectionSegment
+(PMM_SECTION_SEGMENT Segment,
+ PLARGE_INTEGER Offset,
+ ULONG Entry)
+{
+    ULONG PageIndex;
+    PSECTION_PAGE_TABLE PageTable;
+    PageTable = 
+        MiSectionPageTableGetOrAllocate(&Segment->PageTable, Offset);
+    if (!PageTable) return STATUS_NO_MEMORY;
+    PageIndex = 
+        (Offset->QuadPart - PageTable->FileOffset.QuadPart) / PAGE_SIZE;
+    PageTable->PageEntries[PageIndex] = Entry;
+    DPRINT
+        ("MiSetPageEntrySectionSegment(%p,%08x%08x,%x)\n",
+         &Segment->PageTable, Offset->u.HighPart, Offset->u.LowPart, Entry);
+    return STATUS_SUCCESS;
+}
+
+ULONG
+NTAPI
+MiGetPageEntrySectionSegment
+(PMM_SECTION_SEGMENT Segment,
+ PLARGE_INTEGER Offset)
+{
+    LARGE_INTEGER FileOffset;
+    ULONG PageIndex, Result;
+    PSECTION_PAGE_TABLE PageTable;
+
+    FileOffset.QuadPart = 
+        ROUND_DOWN(Offset->QuadPart, ENTRIES_PER_ELEMENT * PAGE_SIZE);
+    PageTable = MiSectionPageTableGet(&Segment->PageTable, &FileOffset);
+    if (!PageTable) return 0;
+    PageIndex = 
+        (Offset->QuadPart - PageTable->FileOffset.QuadPart) / PAGE_SIZE;
+    Result = PageTable->PageEntries[PageIndex];
+    DPRINT
+        ("MiGetPageEntrySectionSegment(%p,%08x%08x) => %x\n",
+         &Segment->PageTable, 
+         FileOffset.u.HighPart, 
+         FileOffset.u.LowPart,
+         Result);
+    return Result;
+}
+
+VOID
+NTAPI
+MiFreePageTablesSectionSegment(PMM_SECTION_SEGMENT Segment)
+{
+    PSECTION_PAGE_TABLE Element;
+    DPRINT("MiFreePageTablesSectionSegment(%p)\n", &Segment->PageTable);
+    while (RtlNumberGenericTableElements(&Segment->PageTable) &&
+           (Element = RtlGetElementGenericTable(&Segment->PageTable, 0)))
+    {
+        DPRINT
+            ("Delete table for %08x%08x\n", 
+             Element->FileOffset.u.HighPart, 
+             Element->FileOffset.u.LowPart);
+        RtlDeleteElementGenericTable(&Segment->PageTable, Element);
+    }
+}

Propchange: branches/arty-newcc/ntoskrnl/mm/section/sptab.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: branches/arty-newcc/ntoskrnl/ntoskrnl-generic.rbuild
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/ntoskrnl-generic.rbuild?rev=44106&r1=44105&r2=44106&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] Wed Nov 11 16:14:32 2009
@@ -457,6 +457,7 @@
 				<file>pagefile.c</file>
 				<file>pe.c</file>
 				<file>physical.c</file>
+				<file>sptab.c</file>
 			</directory>
 		</if>
 	</directory>




More information about the Ros-diffs mailing list