- Make kernel build again after __STDC__ change in 42369
[reactos.git] / reactos / ntoskrnl / cc / copy.c
index 07b1cae..723254a 100644 (file)
@@ -1,18 +1,17 @@
-/* $Id$
- *
+/*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/cc/copy.c
  * PURPOSE:         Implements cache managers copy interface
  *
- * PROGRAMMERS:     Hartmut Birr
+ * PROGRAMMERS:
  */
 
 /* INCLUDES ******************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <internal/debug.h>
+#include <debug.h>
 
 /* GLOBALS *******************************************************************/
 
@@ -25,20 +24,22 @@ static PFN_TYPE CcZeroPage = 0;
 /* 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
+NTAPI
 CcInitCacheZeroPage(VOID)
 {
    NTSTATUS Status;
@@ -47,17 +48,18 @@ CcInitCacheZeroPage(VOID)
    if (!NT_SUCCESS(Status))
    {
        DbgPrint("Can't allocate CcZeroPage.\n");
-       KEBUGCHECKCC;
+       KeBugCheck(CACHE_MANAGER);
    }
    Status = MiZeroPage(CcZeroPage);
    if (!NT_SUCCESS(Status))
    {
        DbgPrint("Can't zero out CcZeroPage.\n");
-       KEBUGCHECKCC;
+       KeBugCheck(CACHE_MANAGER);
    }
 }
 
 NTSTATUS
+NTAPI
 ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
                      PVOID Buffer)
 {
@@ -89,15 +91,9 @@ 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
+
+         Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
+
          Length = Length - TempLength;
          previous = current;
          current = current->NextInChain;
@@ -180,15 +176,9 @@ 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
+
+             Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
+
              Length = Length - TempLength;
              CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE);
              current_size += Bcb->CacheSegmentSize;
@@ -199,6 +189,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
 }
 
 NTSTATUS
+NTAPI
 ReadCacheSegment(PCACHE_SEGMENT CacheSeg)
 {
   ULONG Size;
@@ -240,6 +231,7 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg)
 }
 
 NTSTATUS
+NTAPI
 WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
 {
   ULONG Size;
@@ -256,6 +248,17 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
     {
       Size = CacheSeg->Bcb->CacheSegmentSize;
     }
+    //
+    // Nonpaged pool PDEs in ReactOS must actually be synchronized between the
+    // MmGlobalPageDirectory and the real system PDE directory. What a mess...
+    //
+    {
+        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);
@@ -280,7 +283,7 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
 /*
  * @unimplemented
  */
-BOOLEAN STDCALL
+BOOLEAN NTAPI
 CcCanIWrite (
                        IN      PFILE_OBJECT    FileObject,
                        IN      ULONG                   BytesToWrite,
@@ -295,7 +298,7 @@ CcCanIWrite (
 /*
  * @implemented
  */
-BOOLEAN STDCALL
+BOOLEAN NTAPI
 CcCopyRead (IN PFILE_OBJECT FileObject,
            IN PLARGE_INTEGER FileOffset,
            IN ULONG Length,
@@ -315,9 +318,9 @@ CcCopyRead (IN PFILE_OBJECT FileObject,
   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;
@@ -389,19 +392,20 @@ CcCopyRead (IN PFILE_OBJECT FileObject,
   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;
@@ -412,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,
@@ -429,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;
@@ -488,15 +492,8 @@ CcCopyWrite (IN PFILE_OBJECT FileObject,
 
        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)
@@ -520,15 +517,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);
 }
@@ -537,7 +527,7 @@ CcCopyWrite (IN PFILE_OBJECT FileObject,
  * @unimplemented
  */
 VOID
-STDCALL
+NTAPI
 CcDeferWrite (
        IN      PFILE_OBJECT            FileObject,
        IN      PCC_POST_DEFERRED_WRITE PostRoutine,
@@ -554,7 +544,7 @@ CcDeferWrite (
  * @unimplemented
  */
 VOID
-STDCALL
+NTAPI
 CcFastCopyRead (
     IN  PFILE_OBJECT FileObject,
     IN  ULONG FileOffset,
@@ -570,7 +560,7 @@ CcFastCopyRead (
  * @unimplemented
  */
 VOID
-STDCALL
+NTAPI
 CcFastCopyWrite(
     IN  PFILE_OBJECT FileObject,
     IN  ULONG FileOffset,
@@ -584,7 +574,7 @@ CcFastCopyWrite(
  * @unimplemented
  */
 NTSTATUS
-STDCALL
+NTAPI
 CcWaitForCurrentLazyWriterActivity (
     VOID
     )
@@ -596,7 +586,7 @@ CcWaitForCurrentLazyWriterActivity (
 /*
  * @implemented
  */
-BOOLEAN STDCALL
+BOOLEAN NTAPI
 CcZeroData (IN PFILE_OBJECT     FileObject,
            IN PLARGE_INTEGER   StartOffset,
            IN PLARGE_INTEGER   EndOffset,
@@ -611,7 +601,7 @@ CcZeroData (IN PFILE_OBJECT     FileObject,
   IO_STATUS_BLOCK Iosb;
   KEVENT Event;
 
-  DPRINT("CcZeroData(FileObject %x, StartOffset %I64x, EndOffset %I64x, "
+  DPRINT("CcZeroData(FileObject 0x%p, StartOffset %I64x, EndOffset %I64x, "
         "Wait %d)\n", FileObject, StartOffset->QuadPart, EndOffset->QuadPart,
         Wait);