1 /*++ 2 3 Copyright (c) Microsoft Corporation 4 5 Module Name: 6 7 FxPool.h 8 9 Abstract: 10 11 This module contains private Pool package definitions 12 13 Author: 14 15 16 17 18 Environment: 19 20 Both kernel and user mode 21 22 Revision History: 23 24 25 Made it mode agnostic 26 27 New failure paths: 28 Initialization failures of paged/non-paged lock - 29 30 Upon failure we disable pool tracking, rest of the behavior 31 remains unchanged, and FxPoolInitialize not being bubbled up 32 doesn't become an issue. 33 34 --*/ 35 36 #ifndef _FXPOOL_H_ 37 #define _FXPOOL_H_ 38 39 // 40 // Common pool header for small allocations (less than PAGE_SIZE) 41 // 42 struct FX_POOL_HEADER { 43 44 PVOID Base; 45 46 PFX_DRIVER_GLOBALS FxDriverGlobals; 47 48 DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) ULONG AllocationStart[1]; 49 }; 50 51 typedef FX_POOL_HEADER* PFX_POOL_HEADER; 52 53 #define FX_POOL_HEADER_SIZE FIELD_OFFSET(FX_POOL_HEADER, AllocationStart) 54 55 56 // 57 // This structure described an indivdually tracked pool. 58 // 59 // The frameworks tracks pool on behalf of the frameworks (global), 60 // and per driver. 61 // 62 63 struct FX_POOL { 64 MxLockNoDynam NonPagedLock; 65 LIST_ENTRY NonPagedHead; 66 67 MxPagedLockNoDynam PagedLock; 68 LIST_ENTRY PagedHead; 69 70 // Current Pool Usage Information 71 SIZE_T NonPagedBytes; 72 SIZE_T PagedBytes; 73 74 ULONG NonPagedAllocations; 75 ULONG PagedAllocations; 76 77 // Peak Pool Usage Information 78 SIZE_T PeakNonPagedBytes; 79 SIZE_T PeakPagedBytes; 80 81 ULONG PeakNonPagedAllocations; 82 ULONG PeakPagedAllocations; 83 }; 84 85 typedef FX_POOL *PFX_POOL; 86 87 // 88 // This structure is allocated along with the pool item and 89 // is used to track it. 90 // 91 // Note: We would be messing up cache aligned if its greater 92 // than 16. 93 // 94 // Our struct is 7 DWORD's on an x86, and 11 DWORDS on 64 bit 95 // machines. 96 // 97 // This rounds up to 8 or 12 DWORDS. 98 // 99 // 100 struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) FX_POOL_TRACKER { 101 LIST_ENTRY Link; 102 PFX_POOL Pool; 103 ULONG Tag; 104 SIZE_T Size; 105 POOL_TYPE PoolType; 106 PVOID CallersAddress; 107 }; 108 109 typedef FX_POOL_TRACKER *PFX_POOL_TRACKER; 110 111 /*++ 112 113 Routine Description: 114 115 Initialize the FX_POOL tracking object 116 117 Arguments: 118 119 Pool - FX_POOL object for tracking allocations 120 121 Returns: 122 123 status 124 125 --*/ 126 _Must_inspect_result_ 127 NTSTATUS 128 FxPoolInitialize( 129 __in PFX_DRIVER_GLOBALS FxDriverGlobals, 130 __in PFX_POOL Pool 131 ); 132 133 /*++ 134 135 Routine Description: 136 137 Destory the FX_POOL tracking object 138 139 Arguments: 140 141 Pool - FX_POOL object for tracking allocations 142 143 --*/ 144 VOID 145 FxPoolDestroy( 146 __in PFX_DRIVER_GLOBALS FxDriverGlobals, 147 __in PFX_POOL Pool 148 ); 149 150 151 extern "C" 152 _Must_inspect_result_ 153 PWDF_DRIVER_GLOBALS 154 FxAllocateDriverGlobals( 155 VOID 156 ); 157 158 extern "C" 159 VOID 160 FxFreeDriverGlobals( 161 __in PWDF_DRIVER_GLOBALS DriverGlobals 162 ); 163 164 BOOLEAN 165 FxIsPagedPoolType( 166 __in POOL_TYPE Type 167 ); 168 169 /*++ 170 171 Routine Description: 172 173 Allocates system pool tracked in a FX_POOL tracking object. 174 175 Arguments: 176 177 Pool - FX_POOL object for tracking allocations 178 179 Type - POOL_TYPE from ntddk.h 180 181 Size - Size in bytes of the allocation 182 183 Tag - Caller specified additional tag value for debugging/tracing 184 185 PVOID - Caller's address, usefull for finding who allocated the memory 186 187 Returns: 188 189 NULL - Could not allocate pool 190 !NULL - Pointer to pool of minimum Size bytes 191 192 --*/ 193 PVOID 194 FxPoolAllocator( 195 __in PFX_DRIVER_GLOBALS FxDriverGlobals, 196 __in PFX_POOL Pool, 197 __in POOL_TYPE Type, 198 __in SIZE_T Size, 199 __in ULONG Tag, 200 __in PVOID CallersAddress 201 ); 202 203 /*++ 204 205 Routine Description: 206 207 Release tracked pool 208 209 Arguments: 210 211 Pool - FX_POOL object allocation is tracked in 212 213 ptr - Pointer to pool to release 214 215 Returns: 216 217 --*/ 218 void 219 FxPoolFree( 220 __in_xcount(ptr is at an offset from AllocationStart) PVOID ptr 221 ); 222 223 /*++ 224 225 Routine Description: 226 227 Dump the FX_POOL tracking object 228 229 Arguments: 230 231 Pool - FX_POOL object for tracking allocations 232 233 Returns: 234 235 STATUS_SUCCESS 236 237 --*/ 238 NTSTATUS 239 FxPoolDump( 240 __in PFX_DRIVER_GLOBALS FxDriverGlobals, 241 __in PFX_POOL Pool 242 ); 243 244 /*++ 245 246 Routine Description: 247 248 Initialize the pool support package at startup time. 249 250 This must be called before the first allocation. 251 252 Arguments: 253 254 Returns: 255 256 STATUS_SUCCESS 257 258 --*/ 259 _Must_inspect_result_ 260 NTSTATUS 261 FxPoolPackageInitialize( 262 __in PFX_DRIVER_GLOBALS FxDriverGlobals 263 ); 264 /*++ 265 266 Routine Description: 267 268 Destroy the pool support package at unload time 269 270 This must be after the last free 271 272 Arguments: 273 274 Returns: 275 276 status 277 278 --*/ 279 VOID 280 FxPoolPackageDestroy( 281 __in PFX_DRIVER_GLOBALS FxDriverGlobals 282 ); 283 284 285 286 #endif // _FXPOOL_H_ 287