forget update de.rc
[reactos.git] / reactos / ntoskrnl / cc / copy.c
index 60c4893..163beff 100644 (file)
@@ -16,8 +16,6 @@
 
 /* GLOBALS *******************************************************************/
 
-#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
-
 static PFN_TYPE CcZeroPage = 0;
 
 #define MAX_ZERO_LENGTH        (256 * 1024)
@@ -31,16 +29,17 @@ void* _alloca(size_t size);
 #error Unknown compiler for alloca intrinsic stack allocation "function"
 #endif
 
-ULONG EXPORTED CcFastMdlReadWait;
-ULONG EXPORTED CcFastReadNotPossible;
-ULONG EXPORTED CcFastReadWait;
+ULONG CcFastMdlReadWait;
+ULONG CcFastReadNotPossible;
+ULONG CcFastReadWait;
 ULONG CcFastReadNoWait;
 ULONG CcFastReadResourceMiss;
 
 
 /* FUNCTIONS *****************************************************************/
 
-VOID 
+VOID
+NTAPI
 CcInitCacheZeroPage(VOID)
 {
    NTSTATUS Status;
@@ -60,6 +59,7 @@ CcInitCacheZeroPage(VOID)
 }
 
 NTSTATUS
+NTAPI
 ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
                      PVOID Buffer)
 {
@@ -91,16 +91,10 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
        {
          TempLength = min(Bcb->CacheSegmentSize, Length);
          memcpy(Buffer, current->BaseAddress, TempLength);
-#if defined(__GNUC__)
-         Buffer += TempLength;
-#else
-         {
-           char* pTemp = Buffer;
-               pTemp += TempLength;
-               Buffer = pTemp;
-         }
-#endif
-         Length = Length - TempLength; 
+
+         Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
+
+         Length = Length - TempLength;
          previous = current;
          current = current->NextInChain;
          CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE);
@@ -126,7 +120,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
              current2 = current2->NextInChain;
              current_size += Bcb->CacheSegmentSize;
            }
-         
+
          /*
           * Create an MDL which contains all their pages.
           */
@@ -138,7 +132,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
          while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
            {
              PVOID address = current2->BaseAddress;
-             for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE); i++, address += PAGE_SIZE)
+             for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE); i++, address = RVA(address, PAGE_SIZE))
                {
                  *MdlPages++ = MmGetPfnForProcess(NULL, address);
                }
@@ -182,16 +176,10 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
              current = current->NextInChain;
              TempLength = min(Bcb->CacheSegmentSize, Length);
              memcpy(Buffer, previous->BaseAddress, TempLength);
-#if defined(__GNUC__)
-             Buffer += TempLength;
-#else
-                 {
-                       char* pTemp = Buffer;
-                       pTemp += TempLength;
-                       Buffer = pTemp;
-                 }
-#endif
-             Length = Length - TempLength; 
+
+             Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
+
+             Length = Length - TempLength;
              CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE);
              current_size += Bcb->CacheSegmentSize;
            }
@@ -200,7 +188,8 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
   return(STATUS_SUCCESS);
 }
 
-NTSTATUS 
+NTSTATUS
+NTAPI
 ReadCacheSegment(PCACHE_SEGMENT CacheSeg)
 {
   ULONG Size;
@@ -221,7 +210,7 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg)
   MmBuildMdlForNonPagedPool(Mdl);
   Mdl->MdlFlags |= MDL_IO_PAGE_READ;
   KeInitializeEvent(&Event, NotificationEvent, FALSE);
-  Status = IoPageRead(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, & Event, &IoStatus); 
+  Status = IoPageRead(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, & Event, &IoStatus);
   if (Status == STATUS_PENDING)
   {
      KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
@@ -235,13 +224,14 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg)
     }
   if (CacheSeg->Bcb->CacheSegmentSize > Size)
     {
-      memset ((char*)CacheSeg->BaseAddress + Size, 0, 
+      memset ((char*)CacheSeg->BaseAddress + Size, 0,
              CacheSeg->Bcb->CacheSegmentSize - Size);
     }
   return STATUS_SUCCESS;
 }
 
-NTSTATUS 
+NTSTATUS
+NTAPI
 WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
 {
   ULONG Size;
@@ -263,7 +253,7 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
   MmBuildMdlForNonPagedPool(Mdl);
   Mdl->MdlFlags |= MDL_IO_PAGE_READ;
   KeInitializeEvent(&Event, NotificationEvent, FALSE);
-  Status = IoPageWrite(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &Event, &IoStatus);
+  Status = IoSynchronousPageWrite(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &Event, &IoStatus);
   if (Status == STATUS_PENDING)
   {
      KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
@@ -316,15 +306,15 @@ CcCopyRead (IN PFILE_OBJECT FileObject,
   KIRQL oldirql;
   PLIST_ENTRY current_entry;
   PCACHE_SEGMENT current;
-  
-  DPRINT("CcCopyRead(FileObject %x, FileOffset %x, "
-        "Length %d, Wait %d, Buffer %x, IoStatus %x)\n",
-        FileObject, (ULONG)FileOffset->QuadPart, Length, Wait,
+
+  DPRINT("CcCopyRead(FileObject 0x%p, FileOffset %I64x, "
+        "Length %d, Wait %d, Buffer 0x%p, IoStatus 0x%p)\n",
+        FileObject, FileOffset->QuadPart, Length, Wait,
         Buffer, IoStatus);
 
   Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
   ReadOffset = (ULONG)FileOffset->QuadPart;
-  
+
   DPRINT("AllocationSize %d, FileSize %d\n",
          (ULONG)Bcb->AllocationSize.QuadPart,
          (ULONG)Bcb->FileSize.QuadPart);
@@ -339,7 +329,7 @@ CcCopyRead (IN PFILE_OBJECT FileObject,
       current_entry = Bcb->BcbSegmentListHead.Flink;
       while (current_entry != &Bcb->BcbSegmentListHead)
        {
-         current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, 
+         current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT,
                                      BcbSegmentListEntry);
          if (!current->Valid && current->FileOffset < ReadOffset + Length
              && current->FileOffset + Bcb->CacheSegmentSize > ReadOffset)
@@ -359,7 +349,7 @@ CcCopyRead (IN PFILE_OBJECT FileObject,
     {
       TempLength = min (Length, Bcb->CacheSegmentSize - TempLength);
       Status = CcRosRequestCacheSegment(Bcb,
-                                       ROUND_DOWN(ReadOffset, 
+                                       ROUND_DOWN(ReadOffset,
                                                   Bcb->CacheSegmentSize),
                                        &BaseAddress, &Valid, &CacheSeg);
       if (!NT_SUCCESS(Status))
@@ -380,14 +370,14 @@ CcCopyRead (IN PFILE_OBJECT FileObject,
              return FALSE;
            }
        }
-      memcpy (Buffer, (char*)BaseAddress + ReadOffset % Bcb->CacheSegmentSize, 
+      memcpy (Buffer, (char*)BaseAddress + ReadOffset % Bcb->CacheSegmentSize,
              TempLength);
       CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
       ReadLength += TempLength;
       Length -= TempLength;
       ReadOffset += TempLength;
       Buffer = (PVOID)((char*)Buffer + TempLength);
-    }  
+    }
   while (Length > 0)
     {
       TempLength = min(max(Bcb->CacheSegmentSize, MAX_RW_LENGTH), Length);
@@ -395,15 +385,8 @@ CcCopyRead (IN PFILE_OBJECT FileObject,
       ReadLength += TempLength;
       Length -= TempLength;
       ReadOffset += TempLength;
-#if defined(__GNUC__)
-      Buffer += TempLength;
-#else
-         {
-               char* pTemp = Buffer;
-               pTemp += TempLength;
-               Buffer = pTemp;
-         }
-#endif
+
+      Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
     }
   IoStatus->Status = STATUS_SUCCESS;
   IoStatus->Information = ReadLength;
@@ -431,9 +414,9 @@ CcCopyWrite (IN PFILE_OBJECT FileObject,
    PVOID BaseAddress;
    BOOLEAN Valid;
 
-   DPRINT("CcCopyWrite(FileObject %x, FileOffset %x, "
-         "Length %d, Wait %d, Buffer %x)\n",
-          FileObject, (ULONG)FileOffset->QuadPart, Length, Wait, Buffer);
+   DPRINT("CcCopyWrite(FileObject 0x%p, FileOffset %I64x, "
+         "Length %d, Wait %d, Buffer 0x%p)\n",
+          FileObject, FileOffset->QuadPart, Length, Wait, Buffer);
 
    Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
    WriteOffset = (ULONG)FileOffset->QuadPart;
@@ -445,14 +428,14 @@ CcCopyWrite (IN PFILE_OBJECT FileObject,
        current_entry = Bcb->BcbSegmentListHead.Flink;
        while (current_entry != &Bcb->BcbSegmentListHead)
         {
-          CacheSeg = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, 
+          CacheSeg = CONTAINING_RECORD(current_entry, CACHE_SEGMENT,
                                        BcbSegmentListEntry);
           if (!CacheSeg->Valid)
             {
-              if ((WriteOffset >= CacheSeg->FileOffset && 
+              if ((WriteOffset >= CacheSeg->FileOffset &&
                    WriteOffset < CacheSeg->FileOffset + Bcb->CacheSegmentSize)
-                  || (WriteOffset + Length > CacheSeg->FileOffset && 
-                      WriteOffset + Length <= CacheSeg->FileOffset + 
+                  || (WriteOffset + Length > CacheSeg->FileOffset &&
+                      WriteOffset + Length <= CacheSeg->FileOffset +
                       Bcb->CacheSegmentSize))
                 {
                   KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
@@ -484,23 +467,16 @@ CcCopyWrite (IN PFILE_OBJECT FileObject,
               return(FALSE);
             }
         }
-       memcpy ((char*)BaseAddress + WriteOffset % Bcb->CacheSegmentSize, 
+       memcpy ((char*)BaseAddress + WriteOffset % Bcb->CacheSegmentSize,
               Buffer, TempLength);
        CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, TRUE, FALSE);
-       
+
        Length -= TempLength;
        WriteOffset += TempLength;
-#if defined(__GNUC__)
-       Buffer += TempLength;
-#else
-         {
-               char* pTemp = Buffer;
-               pTemp += TempLength;
-               Buffer = pTemp;
-         }
-#endif
+
+       Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
      }
-   
+
    while (Length > 0)
      {
        TempLength = min (Bcb->CacheSegmentSize, Length);
@@ -522,15 +498,8 @@ CcCopyWrite (IN PFILE_OBJECT FileObject,
        CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, TRUE, FALSE);
        Length -= TempLength;
        WriteOffset += TempLength;
-#if defined(__GNUC__)
-       Buffer += TempLength;
-#else
-         {
-               char* pTemp = Buffer;
-               pTemp += TempLength;
-               Buffer = pTemp;
-         }
-#endif
+
+       Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
      }
    return(TRUE);
 }
@@ -612,11 +581,11 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
   ULONG i;
   IO_STATUS_BLOCK Iosb;
   KEVENT Event;
-  
-  DPRINT("CcZeroData(FileObject %x, StartOffset %I64x, EndOffset %I64x, "
-        "Wait %d)\n", FileObject, StartOffset->QuadPart, EndOffset->QuadPart, 
+
+  DPRINT("CcZeroData(FileObject 0x%p, StartOffset %I64x, EndOffset %I64x, "
+        "Wait %d)\n", FileObject, StartOffset->QuadPart, EndOffset->QuadPart,
         Wait);
-  
+
   Length = EndOffset->u.LowPart - StartOffset->u.LowPart;
   WriteOffset.QuadPart = StartOffset->QuadPart;
 
@@ -625,7 +594,7 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
       /* File is not cached */
 
       Mdl = alloca(MmSizeOfMdl(NULL, MAX_ZERO_LENGTH));
+
       while (Length > 0)
        {
          if (Length + WriteOffset.u.LowPart % PAGE_SIZE > MAX_ZERO_LENGTH)
@@ -643,13 +612,13 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
              ((PPFN_TYPE)(Mdl + 1))[i] = CcZeroPage;
            }
           KeInitializeEvent(&Event, NotificationEvent, FALSE);
-         Status = IoPageWrite(FileObject, Mdl, &WriteOffset, &Event, &Iosb);
+         Status = IoSynchronousPageWrite(FileObject, Mdl, &WriteOffset, &Event, &Iosb);
           if (Status == STATUS_PENDING)
          {
              KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
              Status = Iosb.Status;
          }
-          MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);            
+          MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);
          if (!NT_SUCCESS(Status))
            {
              return(FALSE);
@@ -675,14 +644,14 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
          current_entry = Bcb->BcbSegmentListHead.Flink;
          while (current_entry != &Bcb->BcbSegmentListHead)
            {
-             CacheSeg = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, 
+             CacheSeg = CONTAINING_RECORD(current_entry, CACHE_SEGMENT,
                                           BcbSegmentListEntry);
              if (!CacheSeg->Valid)
                {
-                 if ((WriteOffset.u.LowPart >= CacheSeg->FileOffset && 
+                 if ((WriteOffset.u.LowPart >= CacheSeg->FileOffset &&
                       WriteOffset.u.LowPart < CacheSeg->FileOffset + Bcb->CacheSegmentSize)
-                     || (WriteOffset.u.LowPart + Length > CacheSeg->FileOffset && 
-                         WriteOffset.u.LowPart + Length <= 
+                     || (WriteOffset.u.LowPart + Length > CacheSeg->FileOffset &&
+                         WriteOffset.u.LowPart + Length <=
                          CacheSeg->FileOffset + Bcb->CacheSegmentSize))
                    {
                      KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
@@ -726,7 +695,7 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
                      Status = ReadCacheSegment(current);
                      if (!NT_SUCCESS(Status))
                        {
-                         DPRINT1("ReadCacheSegment failed, status %x\n", 
+                         DPRINT1("ReadCacheSegment failed, status %x\n",
                                  Status);
                        }
                    }
@@ -743,7 +712,7 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
              Length -= TempLength;
 
              current = current->NextInChain;
-           } 
+           }
 
           current = CacheSeg;
          while (current != NULL)