295 lines
7.7 KiB
C
295 lines
7.7 KiB
C
|
/*++
|
|||
|
|
|||
|
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_
|
|||
|
|
|||
|
|