1 //////////////////////////////////////////////////////////////////// 2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine 3 // All rights reserved 4 // This file was released under the GPLv2 on June 2015. 5 //////////////////////////////////////////////////////////////////// 6 /* 7 Module name: 8 9 Udf_dbg.h 10 11 Abstract: 12 13 This file contains small set of debug macroses. 14 It is used by the UDF project. 15 16 */ 17 18 #ifndef _UDF_DEBUG_H_ 19 #define _UDF_DEBUG_H_ 20 21 //====================================== 22 23 //#define ALWAYS_CHECK_WAIT_TIMEOUT 24 //#define PRINT_ALWAYS 25 26 #ifdef UDF_DBG 27 28 //#define CHECK_ALLOC_FRAMES 29 30 //#define TRACK_SYS_ALLOCS 31 //#define TRACK_SYS_ALLOC_CALLERS 32 33 // Use internal deadlock detector 34 //#define USE_DLD 35 36 #endif //UDF_DBG 37 38 #define PROTECTED_MEM_RTL 39 40 //#define UDF_SIMULATE_WRITES 41 42 //#define USE_PERF_PRINT 43 44 #define USE_KD_PRINT 45 #define USE_MM_PRINT 46 #define USE_AD_PRINT 47 #define UDF_DUMP_EXTENT 48 //#define USE_TH_PRINT 49 //#define USE_TIME_PRINT 50 //#define CHECK_REF_COUNTS 51 52 //====================================== 53 54 #if defined UDF_DBG || defined PRINT_ALWAYS 55 56 ULONG 57 _cdecl 58 DbgPrint( 59 PCH Format, 60 ... 61 ); 62 63 64 #ifdef KdPrint 65 #undef KdPrint 66 #endif 67 68 #ifdef USE_KD_PRINT 69 #define KdPrint(_x_) DbgPrint _x_ 70 #else 71 #define KdPrint(a) {NOTHING;} 72 #endif //USE_KD_PRINT 73 74 #ifdef USE_MM_PRINT 75 #define MmPrint(_x_) DbgPrint _x_ 76 #else 77 #define MmPrint(_x_) {NOTHING;} 78 #endif //USE_MM_PRINT 79 80 #ifdef USE_TIME_PRINT 81 extern ULONG UdfTimeStamp; 82 #define TmPrint(_x_) {UdfTimeStamp++;KdPrint(("TM:%d: ",UdfTimeStamp));KdPrint(_x_);} 83 #else 84 #define TmPrint KdPrint 85 #endif //USE_MM_PRINT 86 87 #ifdef USE_PERF_PRINT 88 #define PerfPrint(_x_) DbgPrint _x_ 89 #else 90 #define PerfPrint(_x_) {NOTHING;} 91 #endif //USE_MM_PRINT 92 93 #ifdef USE_AD_PRINT 94 #define AdPrint(_x_) {DbgPrint("Thrd:%x:",PsGetCurrentThread());DbgPrint _x_;} 95 #else 96 #define AdPrint(_x_) {NOTHING;} 97 #endif 98 99 #ifdef USE_TH_PRINT 100 #define ThPrint(_x_) {DbgPrint("Thrd:%x:",PsGetCurrentThread());DbgPrint _x_;} 101 #else 102 #define ThPrint(_x_) {NOTHING;} 103 #endif 104 105 #ifdef UDF_DUMP_EXTENT 106 #define ExtPrint(_x_) KdPrint(_x_) 107 #else 108 #define ExtPrint(_x_) {NOTHING;} 109 #endif 110 111 #else // defined UDF_DBG || defined PRINT_ALWAYS 112 113 #define MmPrint(_x_) {NOTHING;} 114 #define TmPrint(_x_) {NOTHING;} 115 #define PerfPrint(_x_) {NOTHING;} 116 #define AdPrint(_x_) {NOTHING;} 117 #define ThPrint(_x_) {NOTHING;} 118 #define ExtPrint(_x_) {NOTHING;} 119 120 #endif // defined UDF_DBG || defined PRINT_ALWAYS 121 122 NTSTATUS 123 DbgWaitForSingleObject_( 124 IN PVOID Object, 125 IN PLARGE_INTEGER Timeout OPTIONAL 126 ); 127 128 #if defined ALWAYS_CHECK_WAIT_TIMEOUT 129 #define DbgWaitForSingleObject(o, to) DbgWaitForSingleObject_(o, to) 130 #else 131 #define DbgWaitForSingleObject(o, to) KeWaitForSingleObject(o, Executive, KernelMode, FALSE, to); 132 #endif 133 134 #ifdef UDF_DBG 135 136 #ifdef _X86_ 137 // This is an illegal use of INT3 138 #define UDFBreakPoint() { __asm int 3 } 139 #else // _X86_ 140 141 #define UDFBreakPoint() DbgBreakPoint() 142 #endif // _X86_ 143 144 #ifdef BRUTE 145 #define BrutePoint() UDFBreakPoint() 146 #else 147 #define BrutePoint() {} 148 #endif // BRUTE 149 150 #ifdef CHECK_REF_COUNTS 151 #define ASSERT_REF(_a_) ASSERT(_a_) 152 #else 153 #define ASSERT_REF(_a_) {NOTHING;} 154 #endif //CHECK_REF_COUNTS 155 156 #ifdef TRACK_SYS_ALLOCS 157 158 PVOID DebugAllocatePool(POOL_TYPE Type,ULONG size 159 #ifdef TRACK_SYS_ALLOC_CALLERS 160 , ULONG SrcId, ULONG SrcLine 161 #endif //TRACK_SYS_ALLOC_CALLERS 162 ); 163 VOID DebugFreePool(PVOID addr); 164 165 #ifdef TRACK_SYS_ALLOC_CALLERS 166 #define DbgAllocatePoolWithTag(a,b,c) DebugAllocatePool(a,b,UDF_BUG_CHECK_ID,__LINE__) 167 #define DbgAllocatePool(x,y) DebugAllocatePool(x,y,UDF_BUG_CHECK_ID,__LINE__) 168 #else //TRACK_SYS_ALLOC_CALLERS 169 #define DbgAllocatePoolWithTag(a,b,c) DebugAllocatePool(a,b) 170 #define DbgAllocatePool(x,y) DebugAllocatePool(x,y) 171 #endif //TRACK_SYS_ALLOC_CALLERS 172 #define DbgFreePool(x) DebugFreePool(x) 173 174 #else //TRACK_SYS_ALLOCS 175 176 #define DbgAllocatePoolWithTag(a,b,c) ExAllocatePoolWithTag(a,b,c) 177 #define DbgAllocatePool(x,y) ExAllocatePoolWithTag(x,y,'Fnwd') 178 #define DbgFreePool(x) ExFreePool(x) 179 180 #endif //TRACK_SYS_ALLOCS 181 182 183 #ifdef PROTECTED_MEM_RTL 184 185 #define DbgMoveMemory(d, s, l) \ 186 _SEH2_TRY { \ 187 RtlMoveMemory(d, s, l); \ 188 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { \ 189 BrutePoint(); \ 190 } _SEH2_END; 191 192 #define DbgCopyMemory(d, s, l) \ 193 _SEH2_TRY { \ 194 RtlCopyMemory(d, s, l); \ 195 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { \ 196 BrutePoint(); \ 197 } _SEH2_END; 198 199 __inline 200 ULONG 201 DbgCompareMemory(PVOID d, PVOID s, ULONG l) { 202 _SEH2_TRY { 203 return RtlCompareMemory(d, s, l); 204 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { 205 BrutePoint(); 206 } _SEH2_END; 207 return -1; 208 } 209 210 #else //PROTECTED_MEM_RTL 211 212 #define DbgMoveMemory(d, s, l) RtlMoveMemory(d, s, l) 213 #define DbgCopyMemory(d, s, l) RtlCopyMemory(d, s, l) 214 #define DbgCompareMemory(d, s, l) RtlCompareMemory(d, s, l) 215 216 #endif //PROTECTED_MEM_RTL 217 218 //#define KdPrint(_x_) 219 220 #ifdef VALIDATE_STRUCTURES 221 #define ValidateFileInfo(fi) \ 222 { /* validate FileInfo */ \ 223 if(!fi || (fi)->IntegrityTag) { \ 224 KdPrint(("UDF: ERROR! Using deallocated structure !!!\n"));\ 225 BrutePoint(); \ 226 } \ 227 if(fi && !fi->Dloc) { \ 228 KdPrint(("UDF: ERROR! FI without Dloc !!!\n"));\ 229 BrutePoint(); \ 230 } \ 231 } 232 233 #else 234 #define ValidateFileInfo(fi) {} 235 #endif 236 237 #if defined (_X86_) && defined (_MSC_VER) 238 239 __inline VOID UDFTouch(IN PVOID addr) 240 { 241 __asm { 242 mov eax,addr 243 mov al,[byte ptr eax] 244 } 245 } 246 247 #else // NO X86 optimization , use generic C/C++ 248 249 __inline VOID UDFTouch(IN PVOID addr) 250 { 251 UCHAR a = ((PUCHAR)addr)[0]; 252 a = a; 253 } 254 255 #endif // _X86_ 256 257 #else // UDF_DBG 258 259 #define DbgAllocatePool(x,y) ExAllocatePoolWithTag(x,y,'Fnwd') 260 #define DbgFreePool(x) ExFreePool(x) 261 #define DbgAllocatePoolWithTag(a,b,c) ExAllocatePoolWithTag(a,b,c) 262 263 #define DbgMoveMemory(d, s, l) RtlMoveMemory(d, s, l) 264 #define DbgCopyMemory(d, s, l) RtlCopyMemory(d, s, l) 265 #define DbgCompareMemory(d, s, l) RtlCompareMemory(d, s, l) 266 267 #define ASSERT_REF(_a_) {NOTHING;} 268 269 #define UDFBreakPoint() {} 270 #define BrutePoint() {} 271 #define ValidateFileInfo(fi) {} 272 273 #define UDFTouch(addr) {} 274 275 #endif // UDF_DBG 276 277 #if defined UDF_DBG || defined PRINT_ALWAYS 278 279 #define KdDump(a,b) \ 280 if((a)!=NULL) { \ 281 ULONG i; \ 282 for(i=0; i<(b); i++) { \ 283 ULONG c; \ 284 c = (ULONG)(*(((PUCHAR)(a))+i)); \ 285 KdPrint(("%2.2x ",c)); \ 286 if ((i & 0x0f) == 0x0f) KdPrint(("\n")); \ 287 } \ 288 KdPrint(("\n")); \ 289 } 290 291 #else 292 293 #define KdDump(a,b) {} 294 295 #endif // UDF_DBG 296 297 #define UserPrint KdPrint 298 299 #endif // _UDF_DEBUG_H_ 300