[NTOS:CC]
[reactos.git] / reactos / ntoskrnl / include / internal / cc.h
index 121240d..40bd6bd 100644 (file)
@@ -1,5 +1,46 @@
 #pragma once
 
+//
+// Define this if you want debugging support
+//
+#define _CC_DEBUG_                                      0x00
+
+//
+// These define the Debug Masks Supported
+//
+#define CC_API_DEBUG                                    0x01
+
+//
+// Debug/Tracing support
+//
+#if _CC_DEBUG_
+#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
+#define CCTRACE(x, ...)                                     \
+    {                                                       \
+        DbgPrintEx("%s [%.16s] - ",                         \
+                   __FUNCTION__,                            \
+                   PsGetCurrentProcess()->ImageFileName);   \
+        DbgPrintEx(__VA_ARGS__);                            \
+    }
+#else
+#define CCTRACE(x, ...)                                     \
+    if (x & CcRosTraceLevel)                                \
+    {                                                       \
+        DbgPrint("%s [%.16s] - ",                           \
+                 __FUNCTION__,                              \
+                 PsGetCurrentProcess()->ImageFileName);     \
+        DbgPrint(__VA_ARGS__);                              \
+    }
+#endif
+#else
+#define CCTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
+#endif
+
+//
+// Global Cc Data
+//
+extern ULONG CcRosTraceLevel;
+
 typedef struct _PF_SCENARIO_ID
 {
     WCHAR ScenName[30];
@@ -101,23 +142,22 @@ typedef struct _PFSN_PREFETCHER_GLOBALS
     LONG ActivePrefetches;
 } PFSN_PREFETCHER_GLOBALS, *PPFSN_PREFETCHER_GLOBALS;
 
-typedef struct _BCB
+typedef struct _ROS_SHARED_CACHE_MAP
 {
-    LIST_ENTRY BcbVacbListHead;
-    LIST_ENTRY BcbRemoveListEntry;
-    BOOLEAN RemoveOnClose;
+    LIST_ENTRY CacheMapVacbListHead;
     ULONG TimeStamp;
     PFILE_OBJECT FileObject;
-    LARGE_INTEGER AllocationSize;
+    LARGE_INTEGER SectionSize;
     LARGE_INTEGER FileSize;
+    BOOLEAN PinAccess;
     PCACHE_MANAGER_CALLBACKS Callbacks;
     PVOID LazyWriteContext;
-    KSPIN_LOCK BcbLock;
+    KSPIN_LOCK CacheMapLock;
     ULONG RefCount;
 #if DBG
-    BOOLEAN Trace; /* enable extra trace output for this BCB and it's VACBs */
+    BOOLEAN Trace; /* enable extra trace output for this cache map and it's VACBs */
 #endif
-} BCB, *PBCB;
+} ROS_SHARED_CACHE_MAP, *PROS_SHARED_CACHE_MAP;
 
 typedef struct _ROS_VACB
 {
@@ -132,30 +172,33 @@ typedef struct _ROS_VACB
     /* Page out in progress */
     BOOLEAN PageOut;
     ULONG MappedCount;
-    /* Entry in the list of VACBs for this BCB. */
-    LIST_ENTRY BcbVacbListEntry;
+    /* Entry in the list of VACBs for this shared cache map. */
+    LIST_ENTRY CacheMapVacbListEntry;
     /* Entry in the list of VACBs which are dirty. */
     LIST_ENTRY DirtyVacbListEntry;
     /* Entry in the list of VACBs. */
-    LIST_ENTRY VacbListEntry;
     LIST_ENTRY VacbLruListEntry;
     /* Offset in the file which this view maps. */
-    ULONG FileOffset;
+    LARGE_INTEGER FileOffset;
     /* Mutex */
     KMUTEX Mutex;
     /* Number of references. */
     ULONG ReferenceCount;
-    /* Pointer to the BCB for the file which this view maps data for. */
-    PBCB Bcb;
+    /* How many times was it pinned? */
+    volatile LONG PinCount;
+    /* Pointer to the shared cache map for the file which this view maps data for. */
+    PROS_SHARED_CACHE_MAP SharedCacheMap;
     /* Pointer to the next VACB in a chain. */
-    struct _ROS_VACB *NextInChain;
 } ROS_VACB, *PROS_VACB;
 
 typedef struct _INTERNAL_BCB
 {
+    /* Lock */
+    ERESOURCE Lock;
     PUBLIC_BCB PFCB;
     PROS_VACB Vacb;
     BOOLEAN Dirty;
+    BOOLEAN Pinned;
     CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
 } INTERNAL_BCB, *PINTERNAL_BCB;
 
@@ -187,9 +230,9 @@ CcRosFlushVacb(PROS_VACB Vacb);
 NTSTATUS
 NTAPI
 CcRosGetVacb(
-    PBCB Bcb,
-    ULONG FileOffset,
-    PULONG BaseOffset,
+    PROS_SHARED_CACHE_MAP SharedCacheMap,
+    LONGLONG FileOffset,
+    PLONGLONG BaseOffset,
     PVOID *BaseAddress,
     PBOOLEAN UptoDate,
     PROS_VACB *Vacb
@@ -214,25 +257,16 @@ CcInitializeCacheManager(VOID);
 NTSTATUS
 NTAPI
 CcRosUnmapVacb(
-    PBCB Bcb,
-    ULONG FileOffset,
+    PROS_SHARED_CACHE_MAP SharedCacheMap,
+    LONGLONG FileOffset,
     BOOLEAN NowDirty
 );
 
 PROS_VACB
 NTAPI
 CcRosLookupVacb(
-    PBCB Bcb,
-    ULONG FileOffset
-);
-
-NTSTATUS
-NTAPI
-CcRosGetVacbChain(
-    PBCB Bcb,
-    ULONG FileOffset,
-    ULONG Length,
-    PROS_VACB *Vacb
+    PROS_SHARED_CACHE_MAP SharedCacheMap,
+    LONGLONG FileOffset
 );
 
 VOID
@@ -242,8 +276,8 @@ CcInitCacheZeroPage(VOID);
 NTSTATUS
 NTAPI
 CcRosMarkDirtyVacb(
-    PBCB Bcb,
-    ULONG FileOffset
+    PROS_SHARED_CACHE_MAP SharedCacheMap,
+    LONGLONG FileOffset
 );
 
 NTSTATUS
@@ -264,12 +298,12 @@ CcRosReferenceCache(PFILE_OBJECT FileObject);
 
 VOID
 NTAPI
-CcRosSetRemoveOnClose(PSECTION_OBJECT_POINTERS SectionObjectPointer);
+CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer);
 
 NTSTATUS
 NTAPI
 CcRosReleaseVacb(
-    BCB* Bcb,
+    PROS_SHARED_CACHE_MAP SharedCacheMap,
     PROS_VACB Vacb,
     BOOLEAN Valid,
     BOOLEAN Dirty,
@@ -279,8 +313,8 @@ CcRosReleaseVacb(
 NTSTATUS
 NTAPI
 CcRosRequestVacb(
-    BCB *Bcb,
-    ULONG FileOffset,
+    PROS_SHARED_CACHE_MAP SharedCacheMap,
+    LONGLONG FileOffset,
     PVOID* BaseAddress,
     PBOOLEAN UptoDate,
     PROS_VACB *Vacb
@@ -290,6 +324,8 @@ NTSTATUS
 NTAPI
 CcRosInitializeFileCache(
     PFILE_OBJECT FileObject,
+    PCC_FILE_SIZES FileSizes,
+    BOOLEAN PinAccess,
     PCACHE_MANAGER_CALLBACKS CallBacks,
     PVOID LazyWriterContext
 );
@@ -304,13 +340,36 @@ NTSTATUS
 NTAPI
 CcTryToInitializeFileCache(PFILE_OBJECT FileObject);
 
+FORCEINLINE
+NTSTATUS
+CcRosAcquireVacbLock(
+    _Inout_ PROS_VACB Vacb,
+    _In_ PLARGE_INTEGER Timeout)
+{
+    NTSTATUS Status;
+    Status = KeWaitForSingleObject(&Vacb->Mutex,
+                                   Executive,
+                                   KernelMode,
+                                   FALSE,
+                                   Timeout);
+    return Status;
+}
+
+FORCEINLINE
+VOID
+CcRosReleaseVacbLock(
+    _Inout_ PROS_VACB Vacb)
+{
+    KeReleaseMutex(&Vacb->Mutex, FALSE);
+}
+
 FORCEINLINE
 BOOLEAN
 DoRangesIntersect(
-    _In_ ULONG Offset1,
-    _In_ ULONG Length1,
-    _In_ ULONG Offset2,
-    _In_ ULONG Length2)
+    _In_ LONGLONG Offset1,
+    _In_ LONGLONG Length1,
+    _In_ LONGLONG Offset2,
+    _In_ LONGLONG Length2)
 {
     if (Offset1 + Length1 <= Offset2)
         return FALSE;
@@ -322,9 +381,9 @@ DoRangesIntersect(
 FORCEINLINE
 BOOLEAN
 IsPointInRange(
-    _In_ ULONG Offset1,
-    _In_ ULONG Length1,
-    _In_ ULONG Point)
+    _In_ LONGLONG Offset1,
+    _In_ LONGLONG Length1,
+    _In_ LONGLONG Point)
 {
     return DoRangesIntersect(Offset1, Length1, Point, 1);
 }