- Make kernel build again after __STDC__ change in 42369
[reactos.git] / reactos / ntoskrnl / cc / copy.c
index e501682..723254a 100644 (file)
@@ -1,74 +1,65 @@
-/* $Id: copy.c,v 1.25 2004/06/19 08:53:35 vizzini Exp $
- *
+/*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/cc/copy.c
  * PURPOSE:         Implements cache managers copy interface
- * PROGRAMMER:      Hartmut Birr
- * UPDATE HISTORY:
- *                  Created 05.10.2001
+ *
+ * PROGRAMMERS:
  */
 
 /* INCLUDES ******************************************************************/
 
-#include <ddk/ntddk.h>
-#include <ddk/ntifs.h>
-#include <internal/mm.h>
-#include <internal/cc.h>
-#include <internal/pool.h>
-#include <internal/io.h>
-#include <ntos/minmax.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
-#include <internal/debug.h>
+#include <debug.h>
 
 /* GLOBALS *******************************************************************/
 
-#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
-
-#if defined(__GNUC__)
-static PHYSICAL_ADDRESS CcZeroPage = (PHYSICAL_ADDRESS)0LL;
-#else
-static PHYSICAL_ADDRESS CcZeroPage = { 0 };
-#endif
+static PFN_TYPE CcZeroPage = 0;
 
 #define MAX_ZERO_LENGTH        (256 * 1024)
-#define MAX_RW_LENGTH  (64 * 1024)
+#define MAX_RW_LENGTH  (256 * 1024)
 
 #if defined(__GNUC__)
-void * alloca(size_t size);
+/* void * alloca(size_t size); */
 #elif defined(_MSC_VER)
 void* _alloca(size_t size);
+#define alloca _alloca
 #else
 #error Unknown compiler for alloca intrinsic stack allocation "function"
 #endif
 
-ULONG EXPORTED CcFastMdlReadWait;
-ULONG EXPORTED CcFastReadNotPossible;
-ULONG EXPORTED CcFastReadWait;
+ULONG CcFastMdlReadWait;
+ULONG CcFastMdlReadNotPossible;
+ULONG CcFastReadNotPossible;
+ULONG CcFastReadWait;
+ULONG CcFastReadNoWait;
+ULONG CcFastReadResourceMiss;
 
 /* FUNCTIONS *****************************************************************/
 
-VOID 
+VOID
+NTAPI
 CcInitCacheZeroPage(VOID)
 {
    NTSTATUS Status;
 
-   Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &CcZeroPage);
+   Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &CcZeroPage);
    if (!NT_SUCCESS(Status))
    {
        DbgPrint("Can't allocate CcZeroPage.\n");
-       KEBUGCHECK(0);
+       KeBugCheck(CACHE_MANAGER);
    }
    Status = MiZeroPage(CcZeroPage);
    if (!NT_SUCCESS(Status))
    {
        DbgPrint("Can't zero out CcZeroPage.\n");
-       KEBUGCHECK(0);
+       KeBugCheck(CACHE_MANAGER);
    }
 }
 
 NTSTATUS
+NTAPI
 ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
                      PVOID Buffer)
 {
@@ -100,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);
@@ -122,7 +107,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
          PCACHE_SEGMENT current2;
          ULONG current_size;
          ULONG i;
-         ULONG offset;
+         PPFN_TYPE MdlPages;
 
          /*
           * Count the maximum number of bytes we could read starting
@@ -130,36 +115,29 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
           */
          current2 = current;
          current_size = 0;
-         while (current2 != NULL && !current2->Valid)
+         while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
            {
              current2 = current2->NextInChain;
              current_size += Bcb->CacheSegmentSize;
            }
-         
+
          /*
           * Create an MDL which contains all their pages.
           */
-         Mdl = MmCreateMdl(NULL, NULL, current_size);
-         if(Mdl == NULL) {
-               DPRINT("MmCreateMdl: Out of memory!");
-               return(STATUS_NO_MEMORY);
-         }
-
+          MmInitializeMdl(Mdl, NULL, current_size);
          Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ);
          current2 = current;
-         offset = 0;
-         while (current2 != NULL && !current2->Valid)
+         current_size = 0;
+         MdlPages = (PPFN_TYPE)(Mdl + 1);
+         while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
            {
-             for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE); i++)
+             PVOID address = current2->BaseAddress;
+             for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE); i++, address = RVA(address, PAGE_SIZE))
                {
-                 PVOID address;
-                 PHYSICAL_ADDRESS page;
-                 address = (char*)current2->BaseAddress + (i * PAGE_SIZE);
-                 page = MmGetPhysicalAddressForProcess(NULL, address);
-                 ((PULONG)(Mdl + 1))[offset] = page.QuadPart >> PAGE_SHIFT;
-                 offset++;
+                 *MdlPages++ = MmGetPfnForProcess(NULL, address);
                }
              current2 = current2->NextInChain;
+             current_size += Bcb->CacheSegmentSize;
            }
 
          /*
@@ -177,7 +155,10 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
             KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
             Status = Iosb.Status;
          }
-          MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);            
+          if (Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA)
+          {
+            MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);
+         }
          if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE)
            {
              while (current != NULL)
@@ -188,30 +169,27 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
                }
              return(Status);
            }
-         while (current != NULL && !current->Valid)
+         current_size = 0;
+         while (current != NULL && !current->Valid && current_size < MAX_RW_LENGTH)
            {
              previous = current;
              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;
            }
        }
     }
   return(STATUS_SUCCESS);
 }
 
-NTSTATUS 
+NTSTATUS
+NTAPI
 ReadCacheSegment(PCACHE_SEGMENT CacheSeg)
 {
   ULONG Size;
@@ -227,18 +205,12 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg)
     {
       Size = CacheSeg->Bcb->CacheSegmentSize;
     }
-
-  Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size);
-  if(Mdl == NULL) 
-    {
-      DPRINT("MmCreateMdl: Out of memory!");
-      return(STATUS_NO_MEMORY);
-    }  
-
+  Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size));
+  MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size);
   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);
@@ -252,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;
@@ -275,18 +248,23 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
     {
       Size = CacheSeg->Bcb->CacheSegmentSize;
     }
-
-  Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size);
-  if(Mdl == NULL) 
+    //
+    // Nonpaged pool PDEs in ReactOS must actually be synchronized between the
+    // MmGlobalPageDirectory and the real system PDE directory. What a mess...
+    //
     {
-      DPRINT("MmCreateMdl: Out of memory!");
-      return(STATUS_NO_MEMORY);
-    }  
-
+        int i = 0;
+        do
+        {
+            MmGetPfnForProcess(NULL, (PVOID)((ULONG_PTR)CacheSeg->BaseAddress + (i << PAGE_SHIFT)));
+        } while (++i < (Size >> PAGE_SHIFT));
+    }
+  Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size));
+  MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size);
   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);
@@ -301,12 +279,11 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
   return(STATUS_SUCCESS);
 }
 
-/* STUBS */
 
 /*
  * @unimplemented
  */
-BOOLEAN STDCALL
+BOOLEAN NTAPI
 CcCanIWrite (
                        IN      PFILE_OBJECT    FileObject,
                        IN      ULONG                   BytesToWrite,
@@ -317,447 +294,11 @@ CcCanIWrite (
        return FALSE;
 }
 
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcDeferWrite (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PCC_POST_DEFERRED_WRITE PostRoutine,
-       IN      PVOID                   Context1,
-       IN      PVOID                   Context2,
-       IN      ULONG                   BytesToWrite,
-       IN      BOOLEAN                 Retrying
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-BOOLEAN
-STDCALL
-CcFastCopyRead (
-       IN      PFILE_OBJECT            FileObject,
-       IN      ULONG                   FileOffset,
-       IN      ULONG                   Length,
-       IN      ULONG                   PageCount,
-       OUT     PVOID                   Buffer,
-       OUT     PIO_STATUS_BLOCK        IoStatus
-       )
-{
-       UNIMPLEMENTED;
-       return FALSE;
-}
-/*
- * @unimplemented
- */
-BOOLEAN
-STDCALL
-CcFastCopyWrite (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PLARGE_INTEGER          FileOffset,
-       IN      ULONG                   Length,
-       IN      PVOID                   Buffer
-       )
-{
-       UNIMPLEMENTED;
-       return FALSE;
-}
-/*
- * @unimplemented
- */
-LARGE_INTEGER
-STDCALL
-CcGetDirtyPages (
-       IN      PVOID                   LogHandle,
-       IN      PDIRTY_PAGE_ROUTINE     DirtyPageRoutine,
-       IN      PVOID                   Context1,
-       IN      PVOID                   Context2
-       )
-{
-       UNIMPLEMENTED;
-
-       LARGE_INTEGER i; 
-       i.QuadPart = 0;
-       return i;
-}
-/*
- * @unimplemented
- */
-PFILE_OBJECT
-STDCALL
-CcGetFileObjectFromBcb (
-       IN      PVOID   Bcb
-       )
-{
-       UNIMPLEMENTED;
-       return 0;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcInitializeCacheMap (
-       IN      PFILE_OBJECT                    FileObject,
-       IN      PCC_FILE_SIZES                  FileSizes,
-       IN      BOOLEAN                         PinAccess,
-       IN      PCACHE_MANAGER_CALLBACKS        CallBacks,
-       IN      PVOID                           LazyWriterContext
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-BOOLEAN
-STDCALL
-CcIsThereDirtyData (
-       IN      PVPB    Vpb
-       )
-{
-       UNIMPLEMENTED;
-       return FALSE;
-}
-
-
-/*
- * @unimplemented
- */
-LARGE_INTEGER
-STDCALL
-CcGetLsnForFileObject (
-       IN      PFILE_OBJECT    FileObject,
-       OUT     PLARGE_INTEGER  OldestLsn OPTIONAL
-       )
-{
-       UNIMPLEMENTED;
-
-       LARGE_INTEGER i; 
-       i.QuadPart = 0;
-       return i;
-}
-
-/*
- * @unimplemented
- */
-LARGE_INTEGER
-STDCALL
-CcGetFlushedValidData (
-    IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
-    IN BOOLEAN BcbListHeld
-    )
-{
-       UNIMPLEMENTED;
-
-       LARGE_INTEGER i; 
-       i.QuadPart = 0;
-       return i;
-}
-
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcMdlRead (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PLARGE_INTEGER          FileOffset,
-       IN      ULONG                   Length,
-       OUT     PMDL                    * MdlChain,
-       OUT     PIO_STATUS_BLOCK        IoStatus
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcMdlWriteComplete (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PLARGE_INTEGER          FileOffset,
-       IN      PMDL                    MdlChain
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcMdlWriteAbort (
-    IN PFILE_OBJECT FileObject,
-    IN PMDL MdlChain
-    )
-{
-       UNIMPLEMENTED;
-}
-
-
-/*
- * @unimplemented
- */
-BOOLEAN
-STDCALL
-CcPinMappedData (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PLARGE_INTEGER          FileOffset,
-       IN      ULONG                   Length,
-       IN      BOOLEAN                 Wait,
-       OUT     PVOID                   * Bcb
-       )
-{
-       UNIMPLEMENTED;
-       return FALSE;
-}
-
-/*
- * @unimplemented
- */
-BOOLEAN
-STDCALL
-CcPinRead (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PLARGE_INTEGER          FileOffset,
-       IN      ULONG                   Length,
-       IN      BOOLEAN                 Wait,
-       OUT     PVOID                   * Bcb,
-       OUT     PVOID                   * Buffer
-       )
-{
-       UNIMPLEMENTED;
-       return FALSE;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcPrepareMdlWrite (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PLARGE_INTEGER          FileOffset,
-       IN      ULONG                   Length,
-       OUT     PMDL                    * MdlChain,
-       OUT     PIO_STATUS_BLOCK        IoStatus
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-BOOLEAN
-STDCALL
-CcPreparePinWrite (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PLARGE_INTEGER          FileOffset,
-       IN      ULONG                   Length,
-       IN      BOOLEAN                 Zero,
-       IN      BOOLEAN                 Wait,
-       OUT     PVOID                   * Bcb,
-       OUT     PVOID                   * Buffer
-       )
-{
-       UNIMPLEMENTED;
-       return FALSE;
-}
-
-/*
- * @unimplemented
- */
-BOOLEAN
-STDCALL
-CcPurgeCacheSection (
-       IN      PSECTION_OBJECT_POINTERS        SectionObjectPointer,
-       IN      PLARGE_INTEGER                  FileOffset OPTIONAL,
-       IN      ULONG                           Length,
-       IN      BOOLEAN                         UninitializeCacheMaps
-       )
-{
-       UNIMPLEMENTED;
-       return FALSE;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcRepinBcb (
-       IN      PVOID   Bcb
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcRemapBcb (
-    IN PVOID Bcb
-    )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcScheduleReadAhead (
-       IN      PFILE_OBJECT            FileObject,
-       IN      PLARGE_INTEGER          FileOffset,
-       IN      ULONG                   Length
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcSetAdditionalCacheAttributes (
-       IN      PFILE_OBJECT    FileObject,
-       IN      BOOLEAN         DisableReadAhead,
-       IN      BOOLEAN         DisableWriteBehind
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcSetBcbOwnerPointer (
-       IN      PVOID   Bcb,
-       IN      PVOID   Owner
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcSetDirtyPageThreshold (
-       IN      PFILE_OBJECT    FileObject,
-       IN      ULONG           DirtyPageThreshold
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcSetLogHandleForFile (
-       IN      PFILE_OBJECT    FileObject,
-       IN      PVOID           LogHandle,
-       IN      PFLUSH_TO_LSN   FlushToLsnRoutine
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcSetReadAheadGranularity (
-       IN      PFILE_OBJECT    FileObject,
-       IN      ULONG           Granularity
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-BOOLEAN
-STDCALL
-CcUninitializeCacheMap (
-       IN      PFILE_OBJECT                    FileObject,
-       IN      PLARGE_INTEGER                  TruncateSize OPTIONAL,
-       IN      PCACHE_UNINITIALIZE_EVENT       UninitializeCompleteEvent OPTIONAL
-       )
-{
-       UNIMPLEMENTED;
-       return FALSE;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcUnpinDataForThread (
-       IN      PVOID                   Bcb,
-       IN      ERESOURCE_THREAD        ResourceThreadId
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcUnpinRepinnedBcb (
-       IN      PVOID                   Bcb,
-       IN      BOOLEAN                 WriteThrough,
-       IN      PIO_STATUS_BLOCK        IoStatus
-       )
-{
-       UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-STDCALL
-CcWaitForCurrentLazyWriterActivity (
-    VOID
-    )
-{
-       UNIMPLEMENTED;
-       return STATUS_NOT_IMPLEMENTED;
-}
-
-/* STUBS END!!! */
 
 /*
  * @implemented
  */
-BOOLEAN STDCALL
+BOOLEAN NTAPI
 CcCopyRead (IN PFILE_OBJECT FileObject,
            IN PLARGE_INTEGER FileOffset,
            IN ULONG Length,
@@ -776,15 +317,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);
@@ -799,7 +340,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)
@@ -819,7 +360,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))
@@ -840,30 +381,31 @@ 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);
-      ReadCacheSegmentChain(Bcb, ReadOffset, TempLength, Buffer);
+      Status = ReadCacheSegmentChain(Bcb, ReadOffset, TempLength, Buffer);
+      if (!NT_SUCCESS(Status))
+        {
+          IoStatus->Information = 0;
+          IoStatus->Status = Status;
+          DPRINT1("ReadCacheSegmentChain failed, Status %x\n", Status);
+          return FALSE;
+        }
+
       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;
@@ -874,7 +416,7 @@ CcCopyRead (IN PFILE_OBJECT FileObject,
 /*
  * @implemented
  */
-BOOLEAN STDCALL
+BOOLEAN NTAPI
 CcCopyWrite (IN PFILE_OBJECT FileObject,
             IN PLARGE_INTEGER FileOffset,
             IN ULONG Length,
@@ -891,9 +433,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;
@@ -905,14 +447,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);
@@ -944,23 +486,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);
@@ -982,23 +517,76 @@ 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);
 }
 
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+CcDeferWrite (
+       IN      PFILE_OBJECT            FileObject,
+       IN      PCC_POST_DEFERRED_WRITE PostRoutine,
+       IN      PVOID                   Context1,
+       IN      PVOID                   Context2,
+       IN      ULONG                   BytesToWrite,
+       IN      BOOLEAN                 Retrying
+       )
+{
+       UNIMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+CcFastCopyRead (
+    IN  PFILE_OBJECT FileObject,
+    IN  ULONG FileOffset,
+    IN  ULONG Length,
+    IN  ULONG PageCount,
+    OUT PVOID Buffer,
+    OUT PIO_STATUS_BLOCK IoStatus
+       )
+{
+       UNIMPLEMENTED;
+}
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+CcFastCopyWrite(
+    IN  PFILE_OBJECT FileObject,
+    IN  ULONG FileOffset,
+    IN  ULONG Length,
+    IN  PVOID Buffer)
+{
+       UNIMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+CcWaitForCurrentLazyWriterActivity (
+    VOID
+    )
+{
+       UNIMPLEMENTED;
+       return STATUS_NOT_IMPLEMENTED;
+}
+
 /*
  * @implemented
  */
-BOOLEAN STDCALL
+BOOLEAN NTAPI
 CcZeroData (IN PFILE_OBJECT     FileObject,
            IN PLARGE_INTEGER   StartOffset,
            IN PLARGE_INTEGER   EndOffset,
@@ -1012,11 +600,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;
 
@@ -1025,7 +613,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)
@@ -1040,16 +628,16 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
          Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ);
          for (i = 0; i < ((Mdl->Size - sizeof(MDL)) / sizeof(ULONG)); i++)
            {
-             ((PULONG)(Mdl + 1))[i] = CcZeroPage.QuadPart >> PAGE_SHIFT;
+             ((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);
@@ -1075,14 +663,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);
@@ -1126,7 +714,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);
                        }
                    }
@@ -1143,7 +731,7 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
              Length -= TempLength;
 
              current = current->NextInChain;
-           } 
+           }
 
           current = CacheSeg;
          while (current != NULL)
@@ -1156,4 +744,3 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
     }
   return(TRUE);
 }
-