branch update for HEAD-2003050101
[reactos.git] / ntoskrnl / mm / section.c
index 3c7dddb..7fa11fe 100644 (file)
@@ -269,7 +269,7 @@ MmUnsharePageEntrySectionSegment(PSECTION_OBJECT Section,
   if (SHARE_COUNT_FROM_SSE(Entry) == 0)
     {
       PFILE_OBJECT FileObject;
-      PREACTOS_COMMON_FCB_HEADER Fcb;
+      PBCB Bcb;
       SWAPENTRY SavedSwapEntry;
       PHYSICAL_ADDRESS Page;
       
@@ -277,13 +277,13 @@ MmUnsharePageEntrySectionSegment(PSECTION_OBJECT Section,
       FileObject = Section->FileObject;
       if (FileObject != NULL)
        {
-         Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext;
+         Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
       
          if (FileObject->Flags & FO_DIRECT_CACHE_PAGING_READ &&
              (Offset % PAGE_SIZE) == 0)
            {
              NTSTATUS Status;
-             Status = CcRosUnmapCacheSegment(Fcb->Bcb, Offset, Dirty);
+             Status = CcRosUnmapCacheSegment(Bcb, Offset, Dirty);
              if (!NT_SUCCESS(Status))
                {
                  KeBugCheck(0);
@@ -324,12 +324,12 @@ MiReadPage(PMEMORY_AREA MemoryArea,
   PCACHE_SEGMENT CacheSeg;
   PFILE_OBJECT FileObject;
   NTSTATUS Status;
-  PREACTOS_COMMON_FCB_HEADER Fcb;
+  PBCB Bcb;
 
   FileObject = MemoryArea->Data.SectionData.Section->FileObject;
-  Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext;
+  Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
   
-  assert(Fcb->Bcb);
+  assert(Bcb);
 
   /*
    * If the file system is letting us go directly to the cache and the
@@ -346,12 +346,12 @@ MiReadPage(PMEMORY_AREA MemoryArea,
        * filesystems do because it is safe for us to use an offset with a
        * alignment less than the file system block size.
        */
-      Status = CcRosGetCacheSegment(Fcb->Bcb,
-                                Offset->u.LowPart,
-                                &BaseOffset,
-                                &BaseAddress,
-                                &UptoDate,
-                                &CacheSeg);
+      Status = CcRosGetCacheSegment(Bcb,
+                                   Offset->u.LowPart,
+                                   &BaseOffset,
+                                   &BaseAddress,
+                                   &UptoDate,
+                                   &CacheSeg);
       if (!NT_SUCCESS(Status))
        {
          return(Status);
@@ -365,7 +365,7 @@ MiReadPage(PMEMORY_AREA MemoryArea,
           Status = ReadCacheSegment(CacheSeg);
          if (!NT_SUCCESS(Status))
          {
-             CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, FALSE, FALSE, FALSE);
+             CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
              return Status;
          }
        }
@@ -377,7 +377,7 @@ MiReadPage(PMEMORY_AREA MemoryArea,
       (*Page) = Addr;
       MmReferencePage((*Page));
 
-      CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, TRUE, FALSE, TRUE);
+      CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, TRUE);
     }
   else
     {
@@ -393,12 +393,12 @@ MiReadPage(PMEMORY_AREA MemoryArea,
          return(Status);
        }
 
-      Status = CcRosGetCacheSegment(Fcb->Bcb,
-                                Offset->u.LowPart,
-                                &BaseOffset,
-                                &BaseAddress,
-                                &UptoDate,
-                                &CacheSeg);
+      Status = CcRosGetCacheSegment(Bcb,
+                                   Offset->u.LowPart,
+                                   &BaseOffset,
+                                   &BaseAddress,
+                                   &UptoDate,
+                                   &CacheSeg);
       if (!NT_SUCCESS(Status))
        {
          return(Status);
@@ -412,7 +412,7 @@ MiReadPage(PMEMORY_AREA MemoryArea,
           Status = ReadCacheSegment(CacheSeg);
          if (!NT_SUCCESS(Status))
          {
-             CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, FALSE, FALSE, FALSE);
+             CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
              return Status;
          }
        }
@@ -425,13 +425,13 @@ MiReadPage(PMEMORY_AREA MemoryArea,
       else
       {
         memcpy(PageAddr, BaseAddress + Offset->u.LowPart - BaseOffset, OffsetInPage);
-         CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, TRUE, FALSE, FALSE);
-         Status = CcRosGetCacheSegment(Fcb->Bcb,
-                                Offset->u.LowPart + OffsetInPage,
-                                &BaseOffset,
-                                &BaseAddress,
-                                &UptoDate,
-                                &CacheSeg);
+         CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
+         Status = CcRosGetCacheSegment(Bcb,
+                                      Offset->u.LowPart + OffsetInPage,
+                                      &BaseOffset,
+                                      &BaseAddress,
+                                      &UptoDate,
+                                      &CacheSeg);
          if (!NT_SUCCESS(Status))
           {
             ExUnmapPage(PageAddr);
@@ -446,14 +446,14 @@ MiReadPage(PMEMORY_AREA MemoryArea,
              Status = ReadCacheSegment(CacheSeg);
             if (!NT_SUCCESS(Status))
               {
-                CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, FALSE, FALSE, FALSE);
+                CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
                 ExUnmapPage(PageAddr);
                 return Status;
               }
           }
         memcpy(PageAddr + OffsetInPage, BaseAddress, PAGE_SIZE - OffsetInPage);
       }
-      CcRosReleaseCacheSegment(Fcb->Bcb, CacheSeg, TRUE, FALSE, FALSE);
+      CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
       ExUnmapPage(PageAddr);
     }
   return(STATUS_SUCCESS);
@@ -1571,7 +1571,7 @@ MmWritePageSectionView(PMADDRESS_SPACE AddressSpace,
   BOOLEAN Private;
   NTSTATUS Status;
   PFILE_OBJECT FileObject;
-  PREACTOS_COMMON_FCB_HEADER Fcb = NULL;
+  PBCB Bcb = NULL;
   BOOLEAN DirectMapped;
 
   Address = (PVOID)PAGE_ROUND_DOWN(Address);
@@ -1583,7 +1583,7 @@ MmWritePageSectionView(PMADDRESS_SPACE AddressSpace,
   DirectMapped = FALSE;
   if (FileObject != NULL)
     {
-      Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext;
+      Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
   
       /*
        * If the file system is letting us go directly to the cache and the
@@ -1654,7 +1654,7 @@ MmWritePageSectionView(PMADDRESS_SPACE AddressSpace,
   if (DirectMapped && !Private)
     {
       assert(SwapEntry == 0);
-      CcRosMarkDirtyCacheSegment(Fcb->Bcb, Offset.u.LowPart);
+      CcRosMarkDirtyCacheSegment(Bcb, Offset.u.LowPart);
       PageOp->Status = STATUS_SUCCESS;
       KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);
       MmReleasePageOp(PageOp);
@@ -1838,12 +1838,12 @@ MmpDeleteSection(PVOID ObjectBody)
       
       for (i = 0; i < Section->NrSegments; i++)
        {
-         InterlockedDecrement(&Section->Segments[i].ReferenceCount);
+         InterlockedDecrement((LONG *)&Section->Segments[i].ReferenceCount);
        }
     }
   else
     {
-      InterlockedDecrement(&Section->Segments->ReferenceCount);
+      InterlockedDecrement((LONG *)&Section->Segments->ReferenceCount);
     }
   if (Section->FileObject != NULL)
     {
@@ -2684,7 +2684,7 @@ MmCreateImageSection(PHANDLE SectionHandle,
        */
       for (i = 0; i < NrSegments; i++)
        {
-         InterlockedIncrement(&SectionSegments[i].ReferenceCount);
+         InterlockedIncrement((LONG *)&SectionSegments[i].ReferenceCount);
        }
 
     }
@@ -2940,7 +2940,7 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address,
   PMEMORY_AREA MArea;
   ULONG Entry;
   PFILE_OBJECT FileObject;
-  PREACTOS_COMMON_FCB_HEADER Fcb;
+  PBCB Bcb;
   ULONG Offset;
   SWAPENTRY SavedSwapEntry;
   PMM_PAGEOP PageOp;
@@ -2978,8 +2978,8 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address,
       if (PhysAddr.QuadPart == PAGE_FROM_SSE(Entry) && Dirty)
        {
          FileObject = MemoryArea->Data.SectionData.Section->FileObject;
-         Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext;
-         CcRosMarkDirtyCacheSegment(Fcb->Bcb, Offset);
+         Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
+         CcRosMarkDirtyCacheSegment(Bcb, Offset);
          assert(SwapEntry == 0);
        }
     }
@@ -3232,6 +3232,7 @@ NtExtendSection(IN        HANDLE  SectionHandle,
                IN      ULONG   NewMaximumSize)
 {
    UNIMPLEMENTED;
+   return(STATUS_NOT_IMPLEMENTED);
 }
 
 
@@ -3373,7 +3374,6 @@ MmMapViewOfSection(IN PVOID SectionObject,
    Section = (PSECTION_OBJECT)SectionObject;
    AddressSpace = &Process->AddressSpace;
 
-   MmLockAddressSpace(AddressSpace);
    MmLockSection(SectionObject);
    
    if (Section->AllocationAttributes & SEC_IMAGE)
@@ -3382,6 +3382,8 @@ MmMapViewOfSection(IN PVOID SectionObject,
        PVOID ImageBase;
        ULONG ImageSize;           
        
+       MmLockAddressSpace(AddressSpace);
+
        ImageBase = *BaseAddress;
        if (ImageBase == NULL)
         {
@@ -3448,10 +3450,38 @@ MmMapViewOfSection(IN PVOID SectionObject,
                 }
             }
         }
+
        *BaseAddress = ImageBase;
+
+       MmUnlockAddressSpace(AddressSpace);
+
+       /*
+        * Zero-fill the end of initialized data segments which are not completely
+        * present in the file
+        */
+       for (i = 0; i < Section->NrSegments; i++)
+        {
+          if (IMAGE_SECTION_INITIALIZED_DATA ==
+               (Section->Segments[i].Characteristics &
+               (IMAGE_SECTION_NOLOAD | IMAGE_SECTION_INITIALIZED_DATA)) &&
+              Section->Segments[i].RawLength < Section->Segments[i].Length)
+            {
+              /* PsGetCurrentProcess() might not return our process at this moment,
+               * let's make sure our address space is being used anyway */
+              KeAttachProcess(Process);
+
+              RtlZeroMemory((PVOID) (ImageBase + (ULONG_PTR) Section->Segments[i].VirtualAddress) +
+                            Section->Segments[i].RawLength,
+                            Section->Segments[i].Length - Section->Segments[i].RawLength);
+
+              KeDetachProcess();
+            }
+        }
      }
    else
      {
+       MmLockAddressSpace(AddressSpace);
+
        if (SectionOffset == NULL)
         {
           ViewOffset = 0;
@@ -3487,16 +3517,16 @@ MmMapViewOfSection(IN PVOID SectionObject,
                                   Protect,
                                   ViewOffset);
        MmUnlockSectionSegment(Section->Segments);
+       MmUnlockAddressSpace(AddressSpace);
        if (!NT_SUCCESS(Status))
         {
           MmUnlockSection(Section);
-          MmUnlockAddressSpace(AddressSpace);
           return(Status);
         }
+
      }
 
    MmUnlockSection(Section);
-   MmUnlockAddressSpace(AddressSpace);
 
    return(STATUS_SUCCESS);
 }