1 #pragma once 2 3 typedef struct _NOCC_BCB 4 { 5 /* Public part */ 6 PUBLIC_BCB Bcb; 7 8 struct _NOCC_CACHE_MAP *Map; 9 PSECTION SectionObject; 10 LARGE_INTEGER FileOffset; 11 ULONG Length; 12 PVOID BaseAddress; 13 BOOLEAN Dirty; 14 PVOID OwnerPointer; 15 16 /* Reference counts */ 17 ULONG RefCount; 18 19 LIST_ENTRY ThisFileList; 20 21 KEVENT ExclusiveWait; 22 ULONG ExclusiveWaiter; 23 BOOLEAN Exclusive; 24 } NOCC_BCB, *PNOCC_BCB; 25 26 typedef struct _NOCC_CACHE_MAP 27 { 28 LIST_ENTRY Entry; 29 LIST_ENTRY AssociatedBcb; 30 LIST_ENTRY PrivateCacheMaps; 31 ULONG NumberOfMaps; 32 ULONG RefCount; 33 CC_FILE_SIZES FileSizes; 34 CACHE_MANAGER_CALLBACKS Callbacks; 35 PVOID LazyContext; 36 PVOID LogHandle; 37 PFLUSH_TO_LSN FlushToLsn; 38 ULONG ReadAheadGranularity; 39 } NOCC_CACHE_MAP, *PNOCC_CACHE_MAP; 40 41 VOID 42 NTAPI 43 CcPfInitializePrefetcher(VOID); 44 45 VOID 46 NTAPI 47 CcMdlReadComplete2(IN PFILE_OBJECT FileObject, 48 IN PMDL MemoryDescriptorList); 49 50 VOID 51 NTAPI 52 CcMdlWriteComplete2(IN PFILE_OBJECT FileObject, 53 IN PLARGE_INTEGER FileOffset, 54 IN PMDL MdlChain); 55 56 VOID 57 NTAPI 58 CcInitView(VOID); 59 60 BOOLEAN 61 NTAPI 62 CcpUnpinData(PNOCC_BCB Bcb, 63 BOOLEAN ActuallyRelease); 64 65 VOID 66 NTAPI 67 CcShutdownSystem(VOID); 68 69 VOID 70 NTAPI 71 CcInitCacheZeroPage(VOID); 72 73 /* Called by section.c */ 74 BOOLEAN 75 NTAPI 76 CcFlushImageSection(PSECTION_OBJECT_POINTERS SectionObjectPointer, 77 MMFLUSH_TYPE FlushType); 78 79 VOID 80 NTAPI 81 _CcpFlushCache(IN PNOCC_CACHE_MAP Map, 82 IN OPTIONAL PLARGE_INTEGER FileOffset, 83 IN ULONG Length, 84 OUT OPTIONAL PIO_STATUS_BLOCK IoStatus, 85 BOOLEAN Delete, 86 const char *File, 87 int Line); 88 89 #define CcpFlushCache(M,F,L,I,D) _CcpFlushCache(M,F,L,I,D,__FILE__,__LINE__) 90 91 BOOLEAN 92 NTAPI 93 CcGetFileSizes(PFILE_OBJECT FileObject, 94 PCC_FILE_SIZES FileSizes); 95 96 ULONG 97 NTAPI 98 CcpCountCacheSections(PNOCC_CACHE_MAP Map); 99 100 BOOLEAN 101 NTAPI 102 CcpAcquireFileLock(PNOCC_CACHE_MAP Map); 103 104 VOID 105 NTAPI 106 CcpReleaseFileLock(PNOCC_CACHE_MAP Map); 107 108 /* 109 * Macro for generic cache manage bugchecking. Note that this macro assumes 110 * that the file name including extension is always longer than 4 characters. 111 */ 112 #define KEBUGCHECKCC \ 113 KEBUGCHECKEX(CACHE_MANAGER, \ 114 (*(ULONG*)(__FILE__ + sizeof(__FILE__) - 4) << 16) | \ 115 (__LINE__ & 0xFFFF), 0, 0, 0) 116 117 /* Private data */ 118 119 #define CACHE_SINGLE_FILE_MAX (16) 120 #define CACHE_OVERALL_SIZE (32 * 1024 * 1024) 121 #define CACHE_STRIPE VACB_MAPPING_GRANULARITY 122 #define CACHE_SHIFT 18 123 #define CACHE_NUM_SECTIONS (CACHE_OVERALL_SIZE / CACHE_STRIPE) 124 #define CACHE_ROUND_UP(x) (((x) + (CACHE_STRIPE-1)) & ~(CACHE_STRIPE-1)) 125 #define CACHE_ROUND_DOWN(x) ((x) & ~(CACHE_STRIPE-1)) 126 #define INVALID_CACHE ((ULONG)~0) 127 128 extern NOCC_BCB CcCacheSections[CACHE_NUM_SECTIONS]; 129 extern PRTL_BITMAP CcCacheBitmap; 130 extern FAST_MUTEX CcMutex; 131 extern KEVENT CcDeleteEvent; 132 extern ULONG CcCacheClockHand; 133 extern LIST_ENTRY CcPendingUnmap; 134 extern KEVENT CcpLazyWriteEvent; 135 136 #define CcpLock() _CcpLock(__FILE__,__LINE__) 137 #define CcpUnlock() _CcpUnlock(__FILE__,__LINE__) 138 139 extern VOID _CcpLock(const char *file, int line); 140 extern VOID _CcpUnlock(const char *file, int line); 141 142 extern VOID CcpReferenceCache(ULONG Sector); 143 extern VOID CcpDereferenceCache(ULONG Sector, BOOLEAN Immediate); 144 145 BOOLEAN 146 NTAPI 147 CcpMapData(IN PFILE_OBJECT FileObject, 148 IN PLARGE_INTEGER FileOffset, 149 IN ULONG Length, 150 IN ULONG Flags, 151 OUT PVOID *BcbResult, 152 OUT PVOID *Buffer); 153 154 BOOLEAN 155 NTAPI 156 CcpPinMappedData(IN PNOCC_CACHE_MAP Map, 157 IN PLARGE_INTEGER FileOffset, 158 IN ULONG Length, 159 IN ULONG Flags, 160 IN OUT PVOID *Bcb); 161