Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

344 lines
7.6 KiB

/*
* debug.h - Debug macros and their retail translations.
*/
/* Macros
*********/
/* debug output macros */
/*
* Do not call SPEW_OUT directly. Instead, call TRACE_OUT, WARNING_OUT,
* ERROR_OUT, or FATAL_OUT.
*/
/*
* call like printf(), but with an extra pair of parentheses:
*
* ERROR_OUT(("'%s' too big by %d bytes.", pszName, nExtra));
*/
#ifdef DEBUG
#define SPEW_OUT(args) \
((void)(GpcszSpewFile = TEXT(__FILE__), GuSpewLine = __LINE__, SpewOut args, 0))
#define PLAIN_TRACE_OUT(args) \
(GdwSpewFlags = 0, GuSpewSev = SPEW_TRACE, SPEW_OUT(args))
#define TRACE_OUT(args) \
(GdwSpewFlags = SPEW_FL_SPEW_PREFIX, GuSpewSev = SPEW_TRACE, SPEW_OUT(args))
#define WARNING_OUT(args) \
(GdwSpewFlags = SPEW_FL_SPEW_PREFIX | SPEW_FL_SPEW_LOCATION, GuSpewSev = SPEW_WARNING, SPEW_OUT(args))
#define ERROR_OUT(args) \
(GdwSpewFlags = SPEW_FL_SPEW_PREFIX | SPEW_FL_SPEW_LOCATION, GuSpewSev = SPEW_ERROR, SPEW_OUT(args))
#define FATAL_OUT(args) \
(GdwSpewFlags = SPEW_FL_SPEW_PREFIX | SPEW_FL_SPEW_LOCATION, GuSpewSev = SPEW_FATAL, SPEW_OUT(args))
#else
#define PLAIN_TRACE_OUT(args)
#define TRACE_OUT(args)
#define WARNING_OUT(args)
#define ERROR_OUT(args)
#define FATAL_OUT(args)
#endif
/* parameter validation macros */
/*
* call as:
*
* bPTwinOK = IS_VALID_READ_PTR(ptwin, CTWIN);
*
* bHTwinOK = IS_VALID_HANDLE(htwin, TWIN);
*/
#ifdef DEBUG
#define IS_VALID_READ_PTR(ptr, type) \
((ptr == NULL) ? \
(ERROR_OUT((TEXT("invalid %s read pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \
TRUE)
#define IS_VALID_WRITE_PTR(ptr, type) \
((ptr == NULL) ? \
(ERROR_OUT((TEXT("invalid %s write pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \
TRUE)
#define IS_VALID_STRING_PTRA(ptr, type) \
((ptr == NULL) ? \
(ERROR_OUT((TEXT("invalid %s pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \
TRUE)
#define IS_VALID_STRING_PTRW(ptr, type) \
((ptr == NULL) ? \
(ERROR_OUT((TEXT("invalid %s pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \
TRUE)
#ifdef UNICODE
#define IS_VALID_STRING_PTR(ptr, type) IS_VALID_STRING_PTRW(ptr, type)
#else
#define IS_VALID_STRING_PTR(ptr, type) IS_VALID_STRING_PTRA(ptr, type)
#endif
#define IS_VALID_CODE_PTR(ptr, type) \
((ptr == NULL) ? \
(ERROR_OUT((TEXT("invalid %s code pointer - %#08lx"), (LPCTSTR)TEXT(#type), (ptr))), FALSE) : \
TRUE)
#define IS_VALID_READ_BUFFER_PTR(ptr, type, len) \
((ptr == NULL) ? \
(ERROR_OUT((TEXT("invalid %s read pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \
TRUE)
#define IS_VALID_WRITE_BUFFER_PTR(ptr, type, len) \
((ptr == NULL) ? \
(ERROR_OUT((TEXT("invalid %s write pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE) : \
TRUE)
#define FLAGS_ARE_VALID(dwFlags, dwAllFlags) \
(((dwFlags) & (~(dwAllFlags))) ? \
(ERROR_OUT((TEXT("invalid flags set - %#08lx"), ((dwFlags) & (~(dwAllFlags))))), FALSE) : \
TRUE)
#else
#define IS_VALID_READ_PTR(ptr, type) \
(ptr != NULL)
#define IS_VALID_WRITE_PTR(ptr, type) \
(ptr != NULL)
#define IS_VALID_STRING_PTR(ptr, type) \
(ptr != NULL)
#define IS_VALID_CODE_PTR(ptr, type) \
(ptr != NULL)
#define IS_VALID_READ_BUFFER_PTR(ptr, type, len) \
(ptr != NULL)
#define IS_VALID_WRITE_BUFFER_PTR(ptr, type, len) \
(ptr != NULL)
#define FLAGS_ARE_VALID(dwFlags, dwAllFlags) \
(((dwFlags) & (~(dwAllFlags))) ? FALSE : TRUE)
#endif
/* handle validation macros */
#define IS_VALID_HANDLE(hnd, type) \
(IsValidH##type(hnd))
/* structure validation macros */
#ifdef VSTF
#ifdef DEBUG
#define IS_VALID_STRUCT_PTR(ptr, type) \
(IsValidP##type(ptr) ? \
TRUE : \
(ERROR_OUT((TEXT("invalid %s pointer - %#08lx"), (LPCTSTR)TEXT("P")TEXT(#type), (ptr))), FALSE))
#else
#define IS_VALID_STRUCT_PTR(ptr, type) \
(IsValidP##type(ptr))
#endif
#else
#define IS_VALID_STRUCT_PTR(ptr, type) \
(ptr != NULL)
#endif
/* debug assertion macro */
/*
* ASSERT() may only be used as a statement, not as an expression.
*
* call as:
*
* ASSERT(pszRest);
*/
#ifdef DEBUG
#define ASSERT(exp) \
if (exp) \
; \
else \
ERROR_OUT((TEXT("assertion failed '%s'"), (LPCTSTR)TEXT(#exp)))
#else
#define ASSERT(exp)
#endif
/* debug evaluation macro */
/*
* EVAL() may be used as an expression.
*
* call as:
*
* if (EVAL(pszFoo))
* bResult = TRUE;
*/
#ifdef DEBUG
#define EVAL(exp) \
((exp) || (ERROR_OUT((TEXT("evaluation failed '%s'"), (LPCTSTR)TEXT(#exp))), 0))
#else
#define EVAL(exp) \
(exp)
#endif
/* debug break */
#ifndef DEBUG
#define DebugBreak()
#endif
/* debug exported function entry */
#ifdef DEBUG
#define DebugEntry(szFunctionName) \
(TRACE_OUT((TEXT(#szFunctionName) TEXT("() entered."))), StackEnter())
#else
#define DebugEntry(szFunctionName)
#endif
/* debug exported function exit */
#ifdef DEBUG
#define DebugExitVOID(szFunctionName) \
(StackLeave(), TRACE_OUT((TEXT("%s() exiting."), TEXT(#szFunctionName))))
#define DebugExit(szFunctionName, szResult) \
(StackLeave(), TRACE_OUT((TEXT("%s() exiting, returning %s."), TEXT(#szFunctionName), szResult)))
#define DebugExitINT(szFunctionName, n) \
DebugExit(szFunctionName, GetINTString(n))
#define DebugExitULONG(szFunctionName, ul) \
DebugExit(szFunctionName, GetULONGString(ul))
#define DebugExitBOOL(szFunctionName, bool) \
DebugExit(szFunctionName, GetBOOLString(bool))
#define DebugExitHRESULT(szFunctionName, hr) \
DebugExit(szFunctionName, GetHRESULTString(hr))
#define DebugExitCOMPARISONRESULT(szFunctionName, cr) \
DebugExit(szFunctionName, GetCOMPARISONRESULTString(cr))
#define DebugExitTWINRESULT(szFunctionName, tr) \
DebugExit(szFunctionName, GetTWINRESULTString(tr))
#define DebugExitRECRESULT(szFunctionName, rr) \
DebugExit(szFunctionName, GetRECRESULTString(rr))
#else
#define DebugExitVOID(szFunctionName)
#define DebugExit(szFunctionName, szResult)
#define DebugExitINT(szFunctionName, n)
#define DebugExitULONG(szFunctionName, ul)
#define DebugExitBOOL(szFunctionName, bool)
#define DebugExitHRESULT(szFunctionName, hr)
#define DebugExitCOMPARISONRESULT(szFunctionName, cr)
#define DebugExitTWINRESULT(szFunctionName, tr)
#define DebugExitRECRESULT(szFunctionName, rr)
#endif
/* Types
********/
/* GdwSpewFlags flags */
typedef enum _spewflags
{
SPEW_FL_SPEW_PREFIX = 0x0001,
SPEW_FL_SPEW_LOCATION = 0x0002,
ALL_SPEW_FLAGS = (SPEW_FL_SPEW_PREFIX |
SPEW_FL_SPEW_LOCATION)
}
SPEWFLAGS;
/* GuSpewSev values */
typedef enum _spewsev
{
SPEW_TRACE = 1,
SPEW_WARNING = 2,
SPEW_ERROR = 3,
SPEW_FATAL = 4
}
SPEWSEV;
/* Prototypes
*************/
/* debug.c */
#ifdef DEBUG
extern BOOL SetDebugModuleIniSwitches(void);
extern BOOL InitDebugModule(void);
extern void ExitDebugModule(void);
extern void StackEnter(void);
extern void StackLeave(void);
extern ULONG GetStackDepth(void);
extern void __cdecl SpewOut(LPCTSTR pcszFormat, ...);
#endif
/* Global Variables
*******************/
#ifdef DEBUG
/* debug.c */
extern DWORD GdwSpewFlags;
extern UINT GuSpewSev;
extern UINT GuSpewLine;
extern LPCTSTR GpcszSpewFile;
/* defined by client */
extern LPCTSTR GpcszSpewModule;
#endif