|
|
/****************************************************************************/ // atrcapi.h
//
// Kernel mode trace header
//
// Copyright (C) 1997-2000 Microsoft Corporation
/****************************************************************************/ #ifndef _H_ATRCAPI
#define _H_ATRCAPI
#define TRC_BUFFER_SIZE 255
#ifdef DLL_DISP
/****************************************************************************/ // In RDPDD, TT_APIx are not defined - define them here
/****************************************************************************/ #define TT_API1 0x00000001 /* API level 1 */
#define TT_API2 0x00000002 /* API level 2 */
#define TT_API3 0x00000004 /* API level 3 */
#define TT_API4 0x00000008 /* API level 4 */
#define TT_ERROR 0xffffffff /* error condition */
/****************************************************************************/ // No profile tracing in RDPDD
/****************************************************************************/ #ifdef TRC_COMPILE_PRF
#undef TRC_COMPILE_PRF
#endif
#endif /* DLL_DISP */
/****************************************************************************/ /* Before including this file the TRC_FILE macro should be defined. This */ /* is much more efficient than relying on __FILE__ to give the correct */ /* filename since it includes unnecessary path info (and extension info). */ /* In addition each use of __FILE__ causes a new constant string to be */ /* placed in the data segment. */ /****************************************************************************/ #ifdef TRC_FILE
#define _file_name_ (char *)__filename
static const char __filename[] = TRC_FILE; #endif /* TRC_FILE */
/****************************************************************************/ /* Define the trace level. */ /* */ /* TRC_LEVEL_DBG : All tracing is enabled */ /* TRC_LEVEL_NRM : Debug level tracing is disabled */ /* TRC_LEVEL_ALT : Normal and debug level tracing is disabled */ /* TRC_LEVEL_ERR : Alert, normal and debug level tracing is */ /* disabled */ /* TRC_LEVEL_ASSERT : Error, alert, normal and debug level tracing */ /* is disabled */ /* TRC_LEVEL_DIS : All tracing is disabled. */ /****************************************************************************/ #define TRC_LEVEL_DBG 0
#define TRC_LEVEL_NRM 1
#define TRC_LEVEL_ALT 2
#define TRC_LEVEL_ERR 3
#define TRC_LEVEL_ASSERT 4
#define TRC_LEVEL_DIS 5
/****************************************************************************/ /* Tracing can be switched off at compile time to allow for 'debug' and */ /* 'retail' versions of the product. The following macros disable specific */ /* trace processing. */ /* */ /* TRC_ENABLE_DBG - Enable debug tracing */ /* TRC_ENABLE_NRM - Enable normal tracing */ /* TRC_ENABLE_ALT - Enable alert tracing */ /* TRC_ENABLE_ERR - Enable error tracing */ /* TRC_ENABLE_ASSERT - Enable assert tracing */ /* TRC_ENABLE_PRF - Enable function profile tracing */ /****************************************************************************/ #if (TRC_COMPILE_LEVEL == TRC_LEVEL_DBG)
#define TRC_ENABLE_DBG
#define TRC_ENABLE_NRM
#define TRC_ENABLE_ALT
#define TRC_ENABLE_ERR
#define TRC_ENABLE_ASSERT
#endif
#if (TRC_COMPILE_LEVEL == TRC_LEVEL_NRM)
#define TRC_ENABLE_NRM
#define TRC_ENABLE_ALT
#define TRC_ENABLE_ERR
#define TRC_ENABLE_ASSERT
#endif
#if (TRC_COMPILE_LEVEL == TRC_LEVEL_ALT)
#define TRC_ENABLE_ALT
#define TRC_ENABLE_ERR
#define TRC_ENABLE_ASSERT
#endif
#if (TRC_COMPILE_LEVEL == TRC_LEVEL_ERR)
#define TRC_ENABLE_ERR
#define TRC_ENABLE_ASSERT
#endif
#if (TRC_COMPILE_LEVEL == TRC_LEVEL_ASSERT)
#define TRC_ENABLE_ASSERT
#endif
#ifdef TRC_COMPILE_PRF
#define TRC_ENABLE_PRF
#endif
/****************************************************************************/ /* Prefix constants */ /* */ /* TRC_MAX_PREFIX : number of prefixes supported */ /* TRC_PREFIX_NAME_LEN : length of a prefix name */ /****************************************************************************/ #define TRC_MAX_PREFIX 20
#define TRC_PREFIX_NAME_LEN 8
/****************************************************************************/ /* Structure: TRC_PREFIX_DATA */ /* */ /* Description: Trace prefixes */ /****************************************************************************/ typedef struct tagTRC_PREFIX_DATA { char name[TRC_PREFIX_NAME_LEN]; UINT32 start; UINT32 end; } TRC_PREFIX_DATA, *PTRC_PREFIX_DATA;
/****************************************************************************/ // TRC_SHARED_DATA
//
// TS stack trace info for the DD shared memory.
/****************************************************************************/ typedef struct tagTRC_SHARED_DATA { BOOL init; UINT32 TraceClass; UINT32 TraceEnable; TRC_PREFIX_DATA prefix[TRC_MAX_PREFIX]; } TRC_SHARED_DATA, *PTRC_SHARED_DATA;
/****************************************************************************/ /* Various trace helper definitions */ /****************************************************************************/
#ifdef DLL_DISP
#define TB ddTraceString, sizeof(ddTraceString)
#else
#define TB pTRCWd->traceString, sizeof(pTRCWd->traceString)
#endif
#ifdef DLL_DISP
#define TraceBuffer ddTraceString
#else
#define TraceBuffer pTRCWd->traceString
#endif
#define TRC_FUNC_FMT "%-*.*s"
#define TRC_LINE_FMT "%04d"
#define TRC_FUNCNAME_LEN 12
#define TRC_SEP_DBG ' '
#define TRC_SEP_NRM ' '
#define TRC_SEP_ALT '+'
#define TRC_SEP_ERR '*'
#define TRC_SEP_ASSERT '!'
#define TRC_SEP_PROF ' '
#if (TRC_COMPILE_LEVEL < TRC_LEVEL_DIS)
#define TRC_FN(A) static const char __fnname[] = A; \
char *trc_fn = (char *)__fnname; \ char *trc_file = _file_name_; #else
#define TRC_FN(A)
#endif
/****************************************************************************/ /* Standard trace macros */ /****************************************************************************/ #ifdef TRC_ENABLE_DBG
#define TRC_DBG(string) TRCX(TT_API1, TRC_SEP_DBG, string)
#else
#define TRC_DBG(string)
#endif
#ifdef TRC_ENABLE_NRM
#define TRC_NRM(string) TRCX(TT_API2, TRC_SEP_NRM, string)
#else
#define TRC_NRM(string)
#endif
#ifdef TRC_ENABLE_ALT
#define TRC_ALT(string) TRCX(TT_API3, TRC_SEP_ALT, string)
#else
#define TRC_ALT(string)
#endif
#ifdef TRC_ENABLE_ERR
#define TRC_ERR(string) TRCX(TT_API4, TRC_SEP_ERR, string)
#else
#define TRC_ERR(string)
#endif
#ifdef TRC_ENABLE_ASSERT
#ifdef DLL_DISP
/****************************************************************************/ // TRC_ASSERT & TRC_ABORT for RDPDD
/****************************************************************************/ #define TRC_ASSERT(condition, string) \
{ \ if (!(condition)) \ { \ TRCX(TT_ERROR, TRC_SEP_ASSERT, string); \ EngDebugBreak(); \ } \ }
#define TRC_ABORT(string) \
{ \ TRCX(TT_ERROR, TRC_SEP_ASSERT, string); \ EngDebugBreak(); \ }
#else /* DLL_DISP */
/****************************************************************************/ // TRC_ASSERT & TRC_ABORT for RDPWD
/****************************************************************************/ #define TRC_ASSERT(condition, string) \
{ \ if (!(condition)) \ { \ TRCX(TT_ERROR, TRC_SEP_ASSERT, string); \ DbgBreakPoint(); \ } \ }
#define TRC_ABORT(string) \
{ \ TRCX(TT_ERROR, TRC_SEP_ASSERT, string); \ DbgBreakPoint(); \ } #endif /* DLL_DISP */
#else /* TRC_ENABLE_ASSERT */
/****************************************************************************/ // TRC_ASSERT & TRC_ABORT for retail builds (same for RDPWD & RDPDD)
/****************************************************************************/ #define TRC_ASSERT(condition, string)
#define TRC_ABORT(string)
#endif /* TRC_ENABLE_ASSERT */
#ifdef TRC_ENABLE_TST
#define TRC_TST TRC_DBG
#else
#define TRC_TST(x)
#endif /* TRC_ENABLE_TST */
#ifdef DLL_DISP
/****************************************************************************/ // TRCX for RDPDD
/****************************************************************************/ #define TRCX(type, separator, traceString) \
{ \ if (TRC_WillTrace(type, TC_DISPLAY, trc_file, __LINE__)) \ { \ _snprintf traceString; \ TRC_TraceLine(NULL, \ TC_DISPLAY, \ type, \ TraceBuffer, \ separator, \ (int)__LINE__, \ trc_fn, \ trc_file); \ } \ }
#else /* DLL_DISP */
/****************************************************************************/ // TRCX for RDPWD
/****************************************************************************/ #define TRCX(type, separator, traceString) \
{ \ if (TRC_WillTrace(pTRCWd, type, TC_WD, trc_file, __LINE__)) \ { \ _snprintf traceString; \ TRC_TraceLine(pTRCWd, \ TC_WD, \ type, \ TraceBuffer, \ separator, \ (int)__LINE__, \ trc_fn, \ trc_file); \ } \ } #endif /* DLL_DISP */
/****************************************************************************/ /* Function profile trace macros */ /****************************************************************************/
#define TRC_ENTRY TRC_PRF((TB, "Enter {"));
#define TRC_EXIT TRC_PRF((TB, "Exit }"));
#ifdef TRC_ENABLE_PRF
#define TRC_PRF(string) TRCP(string)
#else
#define TRC_PRF(string)
#endif
#define TRCP(traceString) \
{ \ if (TRC_WillTrace(pTRCWd, type, TC_WD, trc_file, __LINE__)) \ { \ _snprintf traceString; \ TRC_TraceLine(pTRCWd, \ TC_WD, \ TT_API1, \ TraceBuffer, \ TRC_SEP_PROF, \ (int)__LINE__, \ trc_fn, \ trc_file); \ } \ }
/****************************************************************************/ /* Data dump trace macros */ /****************************************************************************/
#ifdef DLL_DISP
/****************************************************************************/ // @@@MF No data tracing in RDPDD (yet?)
/****************************************************************************/ #define TRC_DATA_DBG(a, b, c)
#define TRC_DATA_NRM(a, b, c)
#define TRC_DATA_ALT(a, b, c)
#define TRC_DATA_ERR(a, b, c)
#else /* DLL_DISP */
/****************************************************************************/ // TRC_DATA macros for RDPWD
/****************************************************************************/
#ifdef TRC_ENABLE_DBG
#define TRC_DATA_DBG(string, buffer, length) \
TRCX_DATA(TT_OUT1, TRC_SEP_DBG, string, buffer, length) #else
#define TRC_DATA_DBG(string, buffer, length)
#endif
#ifdef TRC_ENABLE_NRM
#define TRC_DATA_NRM(string, buffer, length) \
TRCX_DATA(TT_OUT2, TRC_SEP_NRM, string, buffer, length) #else
#define TRC_DATA_NRM(string, buffer, length)
#endif
#ifdef TRC_ENABLE_ALT
#define TRC_DATA_ALT(string, buffer, length) \
TRCX_DATA(TT_OUT3, TRC_SEP_ALT, string, buffer, length) #else
#define TRC_DATA_ALT(string, buffer, length)
#endif
#ifdef TRC_ENABLE_ERR
#define TRC_DATA_ERR(string, buffer, length) \
TRCX_DATA(TT_OUT4, TRC_SEP_ERR, string, buffer, length) #else
#define TRC_DATA_ERR(string, buffer, length)
#endif
#ifdef TRC_ENABLE_NRM
#define TRC_DATA_NET(string, buffer, length) \
TRCX_DATA(TT_OUT2, TRC_SEP_NRM, string, buffer, length) #else
#define TRC_DATA_NET(string, buffer, length)
#endif
#define TRCX_DATA(type, separator, string, buffer, length) \
{ \ if (TRC_WillTrace(pTRCWd, type, TC_WD, trc_file, __LINE__)) \ { \ TRC_TraceLine(pTRCWd, \ TC_WD, \ type, \ string, \ separator, \ (int)__LINE__, \ trc_fn, \ trc_file); \ \ /*************************************************************/ \ /* Use direct function call here, since macro TRACESTACKBUF */ \ /* is #defined to _IcaStackTraceBuffer, which takes the */ \ /* wrong sort of first param. */ \ /*************************************************************/ \ IcaStackTraceBuffer(pTRCWd->pContext, \ TC_WD, \ type, \ buffer, \ length); \ } \ }
#endif /* DLL_DISP */
/****************************************************************************/ // TRC_TraceLine - function used by RDPDD and RDPWD
/****************************************************************************/ void TRC_TraceLine(PVOID, UINT32, UINT32, char *, char, unsigned, char *, char *);
/****************************************************************************/ // Functions used by RDPWD only
/****************************************************************************/ #ifndef DLL_DISP
void TRC_UpdateConfig(PVOID, PSD_IOCTL); void TRC_MaybeCopyConfig(PVOID, PTRC_SHARED_DATA); #endif
/****************************************************************************/ /* TRC_WillTrace */ /****************************************************************************/ #ifdef DLL_DISP
BOOL TRC_WillTrace(UINT32, UINT32, char *, UINT32); #else
BOOL TRC_WillTrace(PVOID, UINT32, UINT32, char *, UINT32); #endif
#endif /* _H_ATRCAPI */
|