/*++ Copyright (c) 1989 Microsoft Corporation Module Name: rxtrace.h Abstract: This module defines the macros which provide debugging support ( tracing ). Author: Joe Linn [JoeLinn] 1-aug-1994 Revision History: --*/ #ifndef _RDBSSTRACE_INCLUDED_ #define _RDBSSTRACE_INCLUDED_ #if !DBG #undef RDBSSTRACE #endif // !DBG typedef struct _DEBUG_TRACE_CONTROLPOINT{ ULONG ControlPointNumber; PSZ Name; } DEBUG_TRACE_CONTROLPOINT, *PDEBUG_TRACE_CONTROLPOINT; typedef struct { LONG PrintLevel; ULONG BreakMask; PSZ Name; } RX_DEBUG_TRACE_CONTROL, *PRX_DEBUG_TRACE_CONTROL; #ifdef RDBSSTRACE //define so that &RX_DEBUG_TRACE_CONTROL is NULL typedef struct { RX_DEBUG_TRACE_CONTROL Junk; } rxrxrx_AlwaysHelper; #define RX_DEBUG_TRACE_ALWAYS (((rxrxrx_AlwaysHelper*)0)->Junk) // The following macros provide fine grained control for selectively enabling // and disabling tracing. #define RXDT_Extern(__x) extern DEBUG_TRACE_CONTROLPOINT RX_DEBUG_TRACE_##__x #define RXDT_DeclareCategory(__x) extern DEBUG_TRACE_CONTROLPOINT RX_DEBUG_TRACE_##__x #define RXDT_DefineCategory(__x) DEBUG_TRACE_CONTROLPOINT RX_DEBUG_TRACE_##__x = {0,#__x} RXDT_Extern(ERROR); RXDT_Extern(HOOKS); RXDT_Extern(CATCH_EXCEPTIONS); RXDT_Extern(UNWIND); RXDT_Extern(CLEANUP); RXDT_Extern(CLOSE); RXDT_Extern(CREATE); RXDT_Extern(DIRCTRL); RXDT_Extern(EA); RXDT_Extern(FILEINFO); RXDT_Extern(FSCTRL); RXDT_Extern(LOCKCTRL); RXDT_Extern(READ); RXDT_Extern(VOLINFO); RXDT_Extern(WRITE); RXDT_Extern(FLUSH); RXDT_Extern(DEVCTRL); RXDT_Extern(SHUTDOWN); RXDT_Extern(PREFIX); RXDT_Extern(DEVFCB); RXDT_Extern(ACCHKSUP); RXDT_Extern(ALLOCSUP); RXDT_Extern(DIRSUP); RXDT_Extern(FILOBSUP); RXDT_Extern(NAMESUP); RXDT_Extern(VERFYSUP); RXDT_Extern(CACHESUP); RXDT_Extern(SPLAYSUP); RXDT_Extern(DEVIOSUP); RXDT_Extern(FCBSTRUCTS); RXDT_Extern(STRUCSUP); RXDT_Extern(FSP_DISPATCHER); RXDT_Extern(FSP_DUMP); RXDT_Extern(RXCONTX); RXDT_Extern(DISPATCH); RXDT_Extern(NTFASTIO); RXDT_Extern(LOWIO); RXDT_Extern(MINIRDR); RXDT_Extern(DISCCODE); //for the browser interface stuff RXDT_Extern(BROWSER); RXDT_Extern(CONNECT); RXDT_Extern(NTTIMER); RXDT_Extern(SCAVTHRD); RXDT_Extern(SCAVENGER); RXDT_Extern(SHAREACCESS); RXDT_Extern(NAMECACHE); //connection engines categories RXDT_Extern(RXCEBINDING); RXDT_Extern(RXCEDBIMPLEMENTATION); RXDT_Extern(RXCEMANAGEMENT); RXDT_Extern(RXCEXMIT); RXDT_Extern(RXCEPOOL); RXDT_Extern(RXCETDI); #else //RDBSSTRACE #define RXDT_Extern(__x) #define RXDT_DeclareCategory(__x) #define RXDT_DefineCategory(__x) #endif //RDBSSTRACE #ifdef RDBSSTRACE extern BOOLEAN RxGlobalTraceSuppress, RxNextGlobalTraceSuppress; extern ULONG RxGlobalTraceIrpCount; VOID RxInitializeDebugTrace(void); #define RxDbgTraceDoit(___x) ___x #ifndef MINIRDR__NAME extern LONG RxDebugTraceIndent; #else #define RxDebugTraceIndent (*(*___MINIRDR_IMPORTS_NAME).pRxDebugTraceIndent) #endif #else #define RxInitializeDebugTrace() #define RxDbgTraceDoit(___x) #endif //RDBSSTRACE #if DBG #define RxDT_INDENT_EXCESS 16 //this is the offset for excess-n for the indent #define RxDT_INDENT_SHIFT 20 #define RxDT_INDENT_MASK 0x3f #define RxDT_LEVEL_MASK ((1<<RxDT_INDENT_SHIFT)-1) #define RxDT_SUPPRESS_PRINT 0x80000000 #define RxDT_OVERRIDE_RETURN 0x40000000 // The implementation details of the tracing feature. VOID RxDebugTraceActual ( IN ULONG NewMask, IN PCH Format, ... ); BOOLEAN RxDbgTraceActualNew ( IN ULONG NewMask, IN OUT PDEBUG_TRACE_CONTROLPOINT ControlPoint ); PRX_DEBUG_TRACE_CONTROL RxDbgTraceFindControlPointActual( IN OUT PDEBUG_TRACE_CONTROLPOINT ControlPoint ); VOID RxInitializeDebugTraceControlPoint( PSZ Name, PDEBUG_TRACE_CONTROLPOINT ControlPoint ); extern PCHAR RxIrpCodeToName[]; #endif //DBG #ifdef RDBSSTRACE BOOLEAN RxDbgTraceDisableGlobally(void); VOID RxDbgTraceEnableGlobally(BOOLEAN flag); VOID RxDebugTraceDebugCommand( PSZ name, ULONG level, ULONG pointcount ); VOID RxDebugTraceZeroAllPrintLevels( void ); extern ULONG rdbsstracemarker; #define RxDTMASK(INDENT,WRITELEVEL) \ ( (((INDENT)+RxDT_INDENT_EXCESS)<<RxDT_INDENT_SHIFT) + ((WRITELEVEL)&RxDT_LEVEL_MASK)) #define RxDTPrefixRx(___x) RX_##___x #define RxDbgTraceLV__norx_reverseaction(INDENT,CONTROLPOINT,LEVEL,Z) \ {BOOLEAN PrintIt = RxDbgTraceActualNew((RxDT_SUPPRESS_PRINT | RxDT_OVERRIDE_RETURN | RxDTMASK((INDENT),(LEVEL))),\ (CONTROLPOINT)); \ if (!PrintIt) Z; \ } #define RxDbgTraceLV__norx(INDENT,CONTROLPOINT,LEVEL,Z) \ {BOOLEAN PrintIt = RxDbgTraceActualNew( RxDTMASK((INDENT),(LEVEL)),(CONTROLPOINT)); \ if (PrintIt) DbgPrint Z; \ } #define RxDbgTraceLVUnIndent__norx(INDENT,CONTROLPOINT,LEVEL) \ {BOOLEAN PrintIt = RxDbgTraceActualNew((RxDT_SUPPRESS_PRINT | RxDTMASK((INDENT),(LEVEL))),(CONTROLPOINT)); \ } #define RxDbgTraceLV__(INDENT,CONTROLPOINT,LEVEL,Z) \ RxDbgTraceLV__norx(INDENT,(&RxDTPrefixRx##CONTROLPOINT),LEVEL,Z) #define RxDbgTraceLVUnIndent__(INDENT,CONTROLPOINT,LEVEL) \ RxDbgTraceLVUnIndent__norx(INDENT,(&RxDTPrefixRx##CONTROLPOINT),LEVEL) #define RxDbgTrace(INDENT,CONTROLPOINT,Z) \ RxDbgTraceLV__(INDENT,CONTROLPOINT,1,Z) \ #define RxDbgTraceLV(INDENT,CONTROLPOINT,LEVEL,Z) \ RxDbgTraceLV__(INDENT,CONTROLPOINT,LEVEL,Z) \ #define RxDbgTraceUnIndent(INDENT,CONTROLPOINT) \ RxDbgTraceLVUnIndent__(INDENT,CONTROLPOINT,1) // do not define this for nonrdbsstrace; so to catch references not ifdef'd #define RxDbgTraceFindControlPoint(CONTROLPOINT) (RxDbgTraceFindControlPointActual(&RxDTPrefixRx##CONTROLPOINT)) #define DebugBreakPoint(CONTROLPOINT,MASKBIT) { \ if (((MASKBIT) == 0) \ || (RxDbgTraceFindControlPoint(CONTROLPOINT)->BreakMask & (1<<((MASKBIT)-1)) )) { \ DbgBreakPoint(); \ } \ } #define DebugUnwind(X) { \ if (AbnormalTermination()) { \ RxDbgTrace(0, (DEBUG_TRACE_UNWIND), ( #X ", Abnormal termination.\n", 0)); \ } \ } #ifdef RX_PERFPORMANCE_TIMER extern LONG RxPerformanceTimerLevel; #define TimerStart(LEVEL) { \ LARGE_INTEGER TStart, TEnd; \ LARGE_INTEGER TElapsed; \ TStart = KeQueryPerformanceCounter( NULL ); \ #define TimerStop(LEVEL,s) \ TEnd = KeQueryPerformanceCounter( NULL ); \ TElapsed.QuadPart = TEnd.QuadPart - TStart.QuadPart; \ RxTotalTicks[RxLogOf(LEVEL)] += TElapsed.LowPart; \ if (FlagOn( RxPerformanceTimerLevel, (LEVEL))) { \ DbgPrint("Time of %s %ld\n", (s), TElapsed.LowPart ); \ } \ } #endif //RX_PERFPORMANCE_TIMER #else // RDBSSTRACE #define RxDbgTraceLV__norx_reverseaction(INDENT,CONTROLPOINT,LEVEL,Z) {NOTHING;} #define RxDbgTraceLV(INDENT,CONTROLPOINTNUM,LEVEL,Z) {NOTHING;} #define RxDbgTraceLVUnIndent(INDENT,CONTROLPOINTNUM,LEVEL) {NOTHING;} #define RxDbgTrace(INDENT,CONTROLPOINTNUM,Z) {NOTHING;} #define RxDbgTraceUnIndent(INDENT,CONTROLPOINTNUM) {NOTHING;} #define DebugBreakPoint(CONTROLPOINTNUM,MASKBIT) {NOTHING;} #define DebugUnwind(X) {NOTHING;} #define RxDbgTraceDisableGlobally() FALSE #define RxDbgTraceEnableGlobally(f) {NOTHING;} #ifdef RX_PERFPORMANCE_TIMER #define TimerStart(LEVEL) #define TimerStop(LEVEL,s) #endif #endif // RDBSSTRACE #endif // _RDBSSTRACE_INCLUDED_