xref: /reactos/drivers/filesystems/udfs/udf_dbg.h (revision 34593d93)
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
DbgCompareMemory(PVOID d,PVOID s,ULONG l)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 
UDFTouch(IN PVOID addr)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 
UDFTouch(IN PVOID addr)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