#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;
+extern LIST_ENTRY DirtyVacbListHead;
+extern ULONG CcDirtyPageThreshold;
+extern ULONG CcTotalDirtyPages;
+extern LIST_ENTRY CcDeferredWrites;
+extern KSPIN_LOCK CcDeferredWriteSpinLock;
+
typedef struct _PF_SCENARIO_ID
{
WCHAR ScenName[30];
PFILE_OBJECT FileObject;
LARGE_INTEGER SectionSize;
LARGE_INTEGER FileSize;
+ BOOLEAN PinAccess;
PCACHE_MANAGER_CALLBACKS Callbacks;
PVOID LazyWriteContext;
KSPIN_LOCK CacheMapLock;
- ULONG RefCount;
+ ULONG OpenCount;
+ ULONG DirtyPageThreshold;
+ LIST_ENTRY SharedCacheMapLinks;
#if DBG
BOOLEAN Trace; /* enable extra trace output for this cache map and it's VACBs */
#endif
KMUTEX Mutex;
/* Number of references. */
ULONG ReferenceCount;
+ /* How many times was it pinned? */
+ _Guarded_by_(Mutex)
+ 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. */
} ROS_VACB, *PROS_VACB;
+typedef struct _ROS_DEFERRED_WRITE_CONTEXT
+{
+ LIST_ENTRY CcDeferredWritesEntry;
+ PFILE_OBJECT FileObject;
+ PCC_POST_DEFERRED_WRITE PostRoutine;
+ PVOID Context1;
+ PVOID Context2;
+ ULONG BytesToWrite;
+ BOOLEAN Retrying;
+} ROS_DEFERRED_WRITE_CONTEXT, *PROS_DEFERRED_WRITE_CONTEXT;
+
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;
NTAPI
CcRosGetVacb(
PROS_SHARED_CACHE_MAP SharedCacheMap,
- ULONG FileOffset,
- PULONGLONG BaseOffset,
+ LONGLONG FileOffset,
+ PLONGLONG BaseOffset,
PVOID *BaseAddress,
PBOOLEAN UptoDate,
PROS_VACB *Vacb
);
-VOID
+BOOLEAN
NTAPI
CcInitView(VOID);
+VOID
+NTAPI
+CcShutdownLazyWriter(VOID);
+
NTSTATUS
NTAPI
CcReadVirtualAddress(PROS_VACB Vacb);
NTAPI
CcRosUnmapVacb(
PROS_SHARED_CACHE_MAP SharedCacheMap,
- ULONG FileOffset,
+ LONGLONG FileOffset,
BOOLEAN NowDirty
);
NTAPI
CcRosLookupVacb(
PROS_SHARED_CACHE_MAP SharedCacheMap,
- ULONG FileOffset
+ LONGLONG FileOffset
);
VOID
NTSTATUS
NTAPI
-CcRosMarkDirtyVacb(
+CcRosMarkDirtyFile(
PROS_SHARED_CACHE_MAP SharedCacheMap,
- ULONG FileOffset
+ LONGLONG FileOffset
);
+VOID
+NTAPI
+CcRosMarkDirtyVacb(
+ PROS_VACB Vacb);
+
NTSTATUS
NTAPI
CcRosFlushDirtyPages(
ULONG Target,
PULONG Count,
- BOOLEAN Wait
+ BOOLEAN Wait,
+ BOOLEAN CalledFromLazy
);
VOID
NTAPI
CcRosRequestVacb(
PROS_SHARED_CACHE_MAP SharedCacheMap,
- ULONG FileOffset,
+ LONGLONG FileOffset,
PVOID* BaseAddress,
PBOOLEAN UptoDate,
PROS_VACB *Vacb
CcRosInitializeFileCache(
PFILE_OBJECT FileObject,
PCC_FILE_SIZES FileSizes,
+ BOOLEAN PinAccess,
PCACHE_MANAGER_CALLBACKS CallBacks,
PVOID LazyWriterContext
);
NTAPI
CcTryToInitializeFileCache(PFILE_OBJECT FileObject);
+VOID
+NTAPI
+CcShutdownSystem(VOID);
+
+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_ ULONGLONG Offset1,
- _In_ ULONG Length1,
- _In_ ULONGLONG Offset2,
- _In_ ULONG Length2)
+ _In_ LONGLONG Offset1,
+ _In_ LONGLONG Length1,
+ _In_ LONGLONG Offset2,
+ _In_ LONGLONG Length2)
{
if (Offset1 + Length1 <= Offset2)
return FALSE;
FORCEINLINE
BOOLEAN
IsPointInRange(
- _In_ ULONGLONG Offset1,
- _In_ ULONG Length1,
- _In_ ULONGLONG Point)
+ _In_ LONGLONG Offset1,
+ _In_ LONGLONG Length1,
+ _In_ LONGLONG Point)
{
return DoRangesIntersect(Offset1, Length1, Point, 1);
}