70 DbgPrint(
"(%s:%i) VACB %p ++RefCount=%lu, Dirty %u, PageOut %lu\n",
84 ASSERT(!(Refs == 0 && VacbDirty));
87 DbgPrint(
"(%s:%i) VACB %p --RefCount=%lu, Dirty %u, PageOut %lu\n",
88 file,
line, vacb, Refs, VacbDirty, VacbPageOut);
105 DbgPrint(
"(%s:%i) VACB %p ==RefCount=%lu, Dirty %u, PageOut %lu\n",
129 SharedCacheMap->Trace =
Trace;
133 DPRINT1(
"Enabling Tracing for CacheMap 0x%p:\n", SharedCacheMap);
142 current_entry = current_entry->
Flink;
144 DPRINT1(
" VACB 0x%p enabled, RefCount %lu, Dirty %u, PageOut %lu, BaseAddress %p, FileOffset %I64d\n",
153 DPRINT1(
"Disabling Tracing for CacheMap 0x%p:\n", SharedCacheMap);
306 DPRINT1(
"Failed to flush VACB to disk while deleting the cache entry. Status: 0x%08x\n",
Status);
316 DPRINT1(
"There are: %d references left\n", RefCount);
325 DPRINT1(
"No name for the file\n");
368 DPRINT(
"No Dirty pages\n");
388 current_entry = current_entry->
Flink;
392 SharedCacheMap =
current->SharedCacheMap;
431 SharedCacheMap->
Flags &= ~SHARED_CACHE_MAP_IN_LAZYWRITE;
451 SharedCacheMap->
Flags &= ~SHARED_CACHE_MAP_IN_LAZYWRITE;
459 DPRINT1(
"CC: Failed to flush VACB.\n");
467 (*Count) += PagesFreed;
490 DPRINT(
"CcRosFlushDirtyPages() finished\n");
541 DPRINT1(
"MmPageOutPhysicalAddress unexpectedly called\n");
566 current_entry = current_entry->
Flink;
586 (*NrFreed) += PagesFreed;
595 if ((
Target > 0) && !FlushedPages)
608 DPRINT(
"Flushed %lu dirty cache pages to disk\n", PagesFreed);
620 CacheMapVacbListEntry);
626 DPRINT(
"Evicted %lu cache pages\n", (*NrFreed));
638 DPRINT(
"CcRosReleaseVacb(SharedCacheMap 0x%p, Vacb 0x%p)\n", SharedCacheMap, Vacb);
653 if (Dirty && !Vacb->
Dirty)
691 DPRINT(
"CcRosLookupVacb(SharedCacheMap 0x%p, FileOffset %I64u)\n",
702 CacheMapVacbListEntry);
714 current_entry = current_entry->
Flink;
862 current_entry = current_entry->
Flink;
896 DPRINT(
"CcRosCreateVacb()\n");
907 current->SharedCacheMap = SharedCacheMap;
937 if (SharedCacheMap->Trace)
939 DPRINT1(
"CacheMap 0x%p: new VACB: 0x%p, file offset %I64d, BaseAddress %p\n",
959 CacheMapVacbListEntry);
967 if (SharedCacheMap->Trace)
969 DPRINT1(
"CacheMap 0x%p: deleting newly created VACB 0x%p ( found existing one 0x%p )\n",
991 current_entry = current_entry->
Flink;
1030 DPRINT1(
"Vacb read beyond the file size!\n");
1037 Vacb->FileOffset.QuadPart +
Offset,
1048 Vacb->FileOffset.QuadPart +
Offset,
1073 DPRINT(
"CcRosGetVacb()\n");
1125 DPRINT1(
"Bad FileOffset %I64x: should be multiple of %x\n",
1144 DPRINT(
"Freeing VACB 0x%p\n", Vacb);
1170 DPRINT1(
"Failed to unmap VACB from System address space! Status 0x%08X\n",
Status);
1198 if (!SectionObjectPointers)
1204 if (!SectionObjectPointers->SharedCacheMap)
1211 SharedCacheMap = SectionObjectPointers->SharedCacheMap;
1216 Status = RtlLongLongAdd(FlushStart,
Length, &FlushEnd);
1239 while (FlushStart < FlushEnd)
1335 SharedCacheMap =
FileObject->SectionObjectPointer->SharedCacheMap;
1345 if (PrivateMap !=
NULL)
1381 PVOID LazyWriterContext)
1395 SharedCacheMap =
FileObject->SectionObjectPointer->SharedCacheMap;
1396 if (SharedCacheMap ==
NULL)
1399 if (SharedCacheMap ==
NULL)
1406 SharedCacheMap->
NodeByteSize =
sizeof(*SharedCacheMap);
1430 FileObject->SectionObjectPointer->SharedCacheMap = SharedCacheMap;
1467 if (PrivateMap ==
NULL)
1529 SharedCacheMap->
Flags &= ~SHARED_CACHE_MAP_IN_CREATION;
1555 if (SectionObjectPointers && SectionObjectPointers->SharedCacheMap)
1557 SharedCacheMap = SectionObjectPointers->SharedCacheMap;
1570 DPRINT(
"CcInitView()\n");
1602#if DBG && defined(KDBG)
1613 KdbpPrint(
"Shared\t\tMapped\tDirty\tName\n");
1617 ListEntry = ListEntry->
Flink)
1620 ULONG Mapped = 0, Dirty = 0;
1633 Vacbs = Vacbs->
Flink)
1640 SharedCacheMap->
FileObject->FileName.Length != 0)
1651 Extra =
L" (FastFAT)";
1659 KdbpPrint(
"%p\t%d\t%d\t%wZ%S\n", SharedCacheMap, Mapped, Dirty,
FileName, Extra);
1683 KdbpPrint(
"CcTotalDirtyPages above the threshold, writes should be throttled\n");
1687 KdbpPrint(
"CcTotalDirtyPages within 64 (max charge) pages of the threshold, writes may be throttled\n");
1691 KdbpPrint(
"CcTotalDirtyPages below the threshold, writes should not be throttled\n");
NTSTATUS NTAPI MmUnmapViewInSystemSpace(IN PVOID MappedBase)
void FreeList(LOCATIONITEM *pItems)
static CC_FILE_SIZES FileSizes
#define InterlockedIncrement
#define InterlockedDecrement
void quit(int argc, const char *argv[])
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
_In_ PFCB _In_ LONGLONG FileOffset
#define NT_SUCCESS(StatCode)
#define RTL_CONSTANT_STRING(s)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
UNICODE_STRING * PUNICODE_STRING
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
struct _FSRTL_COMMON_FCB_HEADER * PFSRTL_COMMON_FCB_HEADER
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define KeInitializeSpinLock(sl)
#define ROUND_DOWN(n, align)
#define BooleanFlagOn(F, SF)
IN PFCB IN VBO OUT PLBO OUT PULONG OUT PBOOLEAN Allocated
struct _FileName FileName
#define FSRTL_CACHE_TOP_LEVEL_IRP
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
VOID FASTCALL KeInitializeGuardedMutex(OUT PKGUARDED_MUTEX GuardedMutex)
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
VOID FASTCALL KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, IN KIRQL OldIrql)
KIRQL FASTCALL KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
#define InterlockedCompareExchange
VOID KdbpPrint(_In_ PSTR Format, _In_ ...)
Prints the given string with printf-like formatting.
BOOLEAN ExpKdbgExtDefWrites(ULONG Argc, PCHAR Argv[])
BOOLEAN ExpKdbgExtFileCache(ULONG Argc, PCHAR Argv[])
#define KeLeaveCriticalRegion()
#define KeEnterCriticalRegion()
VOID CcScheduleLazyWriteScan(IN BOOLEAN NoDelay)
VOID NTAPI ExInitializeNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside, IN PALLOCATE_FUNCTION Allocate OPTIONAL, IN PFREE_FUNCTION Free OPTIONAL, IN ULONG Flags, IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth)
struct task_struct * current
#define ExFreePoolWithTag(_P, _T)
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize _Pre_valid_ PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T ViewSize
VOID NTAPI CcInitCacheZeroPage(VOID)
_In_ PMEMORY_AREA _In_ PVOID _In_ BOOLEAN Locked
#define SECTION_ALL_ACCESS
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG Offset
_In_ ULONG _In_ ULONG _In_ ULONG Length
VOID CcRosTraceCacheMap(PROS_SHARED_CACHE_MAP SharedCacheMap, BOOLEAN Trace)
static NTSTATUS CcRosDeleteFileCache(PFILE_OBJECT FileObject, PROS_SHARED_CACHE_MAP SharedCacheMap, PKIRQL OldIrql)
VOID CcRosMarkDirtyVacb(PROS_VACB Vacb)
NTSTATUS CcRosInitializeFileCache(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes, BOOLEAN PinAccess, PCACHE_MANAGER_CALLBACKS CallBacks, PVOID LazyWriterContext)
LIST_ENTRY CcCleanSharedCacheMapList
BOOLEAN CcRosUnmarkDirtyVacb(PROS_VACB Vacb, BOOLEAN LockViews)
static LIST_ENTRY VacbLruListHead
KSPIN_LOCK CcDeferredWriteSpinLock
NTSTATUS CcRosReleaseVacb(PROS_SHARED_CACHE_MAP SharedCacheMap, PROS_VACB Vacb, BOOLEAN Dirty, BOOLEAN Mapped)
NTSTATUS CcRosFlushVacb(_In_ PROS_VACB Vacb, _Out_opt_ PIO_STATUS_BLOCK Iosb)
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointers, IN PLARGE_INTEGER FileOffset OPTIONAL, IN ULONG Length, OUT PIO_STATUS_BLOCK IoStatus)
NTSTATUS CcRosRequestVacb(PROS_SHARED_CACHE_MAP SharedCacheMap, LONGLONG FileOffset, PROS_VACB *Vacb)
LIST_ENTRY CcDeferredWrites
NPAGED_LOOKASIDE_LIST iBcbLookasideList
BOOLEAN CcRosEnsureVacbResident(_In_ PROS_VACB Vacb, _In_ BOOLEAN Wait, _In_ BOOLEAN NoRead, _In_ ULONG Offset, _In_ ULONG Length)
PROS_VACB CcRosLookupVacb(PROS_SHARED_CACHE_MAP SharedCacheMap, LONGLONG FileOffset)
NTSTATUS CcRosReleaseFileCache(PFILE_OBJECT FileObject)
PFILE_OBJECT NTAPI CcGetFileObjectFromSectionPtrs(IN PSECTION_OBJECT_POINTERS SectionObjectPointers)
VOID NTAPI CcInitView(VOID)
VOID CcRosTrimCache(_In_ ULONG Target, _Out_ PULONG NrFreed)
LIST_ENTRY DirtyVacbListHead
static NPAGED_LOOKASIDE_LIST SharedCacheMapLookasideList
NTSTATUS CcRosInternalFreeVacb(PROS_VACB Vacb)
NTSTATUS CcRosGetVacb(PROS_SHARED_CACHE_MAP SharedCacheMap, LONGLONG FileOffset, PROS_VACB *Vacb)
static NPAGED_LOOKASIDE_LIST VacbLookasideList
BOOLEAN CcRosFreeOneUnusedVacb(VOID)
ULONG CcDirtyPageThreshold
NTSTATUS CcRosFlushDirtyPages(ULONG Target, PULONG Count, BOOLEAN Wait, BOOLEAN CalledFromLazy)
static NTSTATUS CcRosCreateVacb(PROS_SHARED_CACHE_MAP SharedCacheMap, LONGLONG FileOffset, PROS_VACB *Vacb)
NTSTATUS NTAPI FsRtlAcquireFileForCcFlushEx(IN PFILE_OBJECT FileObject)
VOID NTAPI FsRtlReleaseFileForCcFlush(IN PFILE_OBJECT FileObject)
#define CcRosVacbIncRefCount(vacb)
FORCEINLINE BOOLEAN IsPointInRange(_In_ LONGLONG Offset1, _In_ LONGLONG Length1, _In_ LONGLONG Point)
#define WRITEBEHIND_DISABLED
#define CcRosVacbGetRefCount(vacb)
#define NODE_TYPE_PRIVATE_MAP
#define SHARED_CACHE_MAP_IN_CREATION
#define CCTRACE(x, fmt,...)
#define SHARED_CACHE_MAP_IN_LAZYWRITE
FORCEINLINE ULONG CcRosVacbDecRefCount(PROS_VACB vacb)
#define NODE_TYPE_SHARED_MAP
MMPFNLIST MmModifiedPageListHead
_In_ PVOID _Out_opt_ BOOLEAN _Out_opt_ PPFN_NUMBER Page
BOOLEAN NTAPI MmIsDataSectionResident(_In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, _In_ LONGLONG Offset, _In_ ULONG Length)
NTSTATUS NTAPI MmFlushSegment(_In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, _In_opt_ PLARGE_INTEGER Offset, _In_ ULONG Length, _Out_opt_ PIO_STATUS_BLOCK Iosb)
PFN_NUMBER MmAvailablePages
NTSTATUS NTAPI MmMakeDataSectionResident(_In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, _In_ LONGLONG Offset, _In_ ULONG Length, _In_ PLARGE_INTEGER ValidDataLength)
NTSTATUS NTAPI MmMapViewInSystemSpaceEx(_In_ PVOID Section, _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, _Inout_ PSIZE_T ViewSize, _Inout_ PLARGE_INTEGER SectionOffset, _In_ ULONG_PTR Flags)
NTSTATUS NTAPI MmPageOutPhysicalAddress(PFN_NUMBER Page)
PIRP NTAPI IoGetTopLevelIrp(VOID)
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress(IN PVOID Address)
NTSTATUS NTAPI ObReferenceObjectByPointer(IN PVOID Object, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode)
#define RtlFillMemory(Dest, Length, Fill)
#define KeAcquireSpinLockAtDpcLevel(SpinLock)
#define KeReleaseSpinLockFromDpcLevel(SpinLock)
NTSTATUS NTAPI MmCreateSection(OUT PVOID *Section, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize, IN ULONG SectionPageProtection, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL, IN PFILE_OBJECT FileObject OPTIONAL)
#define STATUS_END_OF_FILE
PULONG MinorVersion OPTIONAL
PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite
PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite
LARGE_INTEGER ValidDataLength
LARGE_INTEGER AllocationSize
struct _LIST_ENTRY * Flink
KSPIN_LOCK ReadAheadSpinLock
LIST_ENTRY CacheMapVacbListHead
PRIVATE_CACHE_MAP PrivateCacheMap
LARGE_INTEGER ValidDataLength
PCACHE_MANAGER_CALLBACKS Callbacks
LIST_ENTRY SharedCacheMapLinks
LARGE_INTEGER SectionSize
KGUARDED_MUTEX FlushCacheLock
LIST_ENTRY CacheMapVacbListEntry
PROS_SHARED_CACHE_MAP SharedCacheMap
volatile ULONG ReferenceCount
LIST_ENTRY DirtyVacbListEntry
LIST_ENTRY VacbLruListEntry
#define TAG_PRIVATE_CACHE_MAP
#define TAG_SHARED_CACHE_MAP
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_MEDIA_WRITE_PROTECTED
#define STATUS_INVALID_PARAMETER
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_In_ WDFDPC _In_ BOOLEAN Wait
#define VACB_MAPPING_GRANULARITY
struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST NPAGED_LOOKASIDE_LIST
#define FO_TEMPORARY_FILE
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define ObDereferenceObject