|
|
/*
* debspew.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)(g_pcszSpewFile = __FILE__, \ g_uSpewLine = __LINE__, \ SpewOut args, \ g_pcszSpewFile = NULL, \ g_uSpewLine = 0, \ g_uSpewSev = 0, \ g_dwSpewFlags = 0, \ 0))
#define PLAIN_TRACE_OUT(args) \
(g_dwSpewFlags = 0, \ g_uSpewSev = SPEW_TRACE, \ SPEW_OUT(args))
#define TRACE_OUT(args) \
(g_dwSpewFlags = SPEW_FL_SPEW_PREFIX, \ g_uSpewSev = SPEW_TRACE, \ SPEW_OUT(args))
#define WARNING_OUT(args) \
(g_dwSpewFlags = SPEW_FL_SPEW_PREFIX | SPEW_FL_SPEW_LOCATION, \ g_uSpewSev = SPEW_WARNING, \ SPEW_OUT(args))
#define ERROR_OUT(args) \
(g_dwSpewFlags = SPEW_FL_SPEW_PREFIX | SPEW_FL_SPEW_LOCATION, \ g_uSpewSev = SPEW_ERROR, \ SPEW_OUT(args))
#define FATAL_OUT(args) \
(g_dwSpewFlags = SPEW_FL_SPEW_PREFIX | SPEW_FL_SPEW_LOCATION, \ g_uSpewSev = 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) \
(IsBadReadPtr((ptr), sizeof(type)) ? \ (ERROR_OUT(("invalid %s read pointer - %#08lx", (PCSTR)"P"#type, (ptr))), FALSE) : \ TRUE)
#define IS_VALID_WRITE_PTR(ptr, type) \
(IsBadWritePtr((PVOID)(ptr), sizeof(type)) ? \ (ERROR_OUT(("invalid %s write pointer - %#08lx", (PCSTR)"P"#type, (ptr))), FALSE) : \ TRUE)
#define IS_VALID_STRING_PTR(ptr, type) \
(IsBadStringPtr((ptr), (UINT)-1) ? \ (ERROR_OUT(("invalid %s pointer - %#08lx", (PCSTR)"P"#type, (ptr))), FALSE) : \ TRUE)
#define IS_VALID_CODE_PTR(ptr, type) \
(IsBadCodePtr((FARPROC)(ptr)) ? \ (ERROR_OUT(("invalid %s code pointer - %#08lx", (PCSTR)#type, (ptr))), FALSE) : \ TRUE)
#define IS_VALID_READ_BUFFER_PTR(ptr, type, len) \
(IsBadReadPtr((ptr), len) ? \ (ERROR_OUT(("invalid %s read pointer - %#08lx", (PCSTR)"P"#type, (ptr))), FALSE) : \ TRUE)
#define IS_VALID_WRITE_BUFFER_PTR(ptr, type, len) \
(IsBadWritePtr((ptr), len) ? \ (ERROR_OUT(("invalid %s write pointer - %#08lx", (PCSTR)"P"#type, (ptr))), FALSE) : \ TRUE)
#define FLAGS_ARE_VALID(dwFlags, dwAllFlags) \
(((dwFlags) & (~(dwAllFlags))) ? \ (ERROR_OUT(("invalid flags set - %#08lx", ((dwFlags) & (~(dwAllFlags))))), FALSE) : \ TRUE)
#else
#define IS_VALID_READ_PTR(ptr, type) \
(! IsBadReadPtr((ptr), sizeof(type)))
#define IS_VALID_WRITE_PTR(ptr, type) \
(! IsBadWritePtr((PVOID)(ptr), sizeof(type)))
#define IS_VALID_STRING_PTR(ptr, type) \
(! IsBadStringPtr((ptr), (UINT)-1))
#define IS_VALID_CODE_PTR(ptr, type) \
(! IsBadCodePtr((FARPROC)(ptr)))
#define IS_VALID_READ_BUFFER_PTR(ptr, type, len) \
(! IsBadReadPtr((ptr), len))
#define IS_VALID_WRITE_BUFFER_PTR(ptr, type, len) \
(! IsBadWritePtr((ptr), len))
#define FLAGS_ARE_VALID(dwFlags, dwAllFlags) \
(((dwFlags) & (~(dwAllFlags))) ? FALSE : TRUE)
#endif
/* handle validation macros */
#ifdef DEBUG
#define IS_VALID_HANDLE(hnd, type) \
(IsValidH##type(hnd) ? \ TRUE : \ (ERROR_OUT(("invalid H" #type " - %#08lx", (hnd))), FALSE))
#else
#define IS_VALID_HANDLE(hnd, type) \
(IsValidH##type(hnd))
#endif
/* structure validation macros */
#ifdef VSTF
#ifdef DEBUG
#define IS_VALID_STRUCT_PTR(ptr, type) \
(IsValidP##type(ptr) ? \ TRUE : \ (ERROR_OUT(("invalid %s pointer - %#08lx", (PCSTR)"P"#type, (ptr))), FALSE))
#else
#define IS_VALID_STRUCT_PTR(ptr, type) \
(IsValidP##type(ptr))
#endif
#else
#define IS_VALID_STRUCT_PTR(ptr, type) \
(! IsBadReadPtr((ptr), sizeof(type)))
#endif
/* OLE interface validation macro */
#define IS_VALID_INTERFACE_PTR(ptr, iface) \
IS_VALID_STRUCT_PTR(ptr, C##iface)
/* debug break */
#ifdef DEBUG
#define DebugBreak() \
__try \ { \ DebugBreak(); \ } __except (EXCEPTION_CONTINUE_EXECUTION) {}
#else
#define DebugBreak()
#endif
/* debug exported function entry */
#ifdef DEBUG
#define DebugEntry(szFunctionName) \
(TRACE_OUT((#szFunctionName "() entered.")), \ StackEnter())
#else
#define DebugEntry(szFunctionName)
#endif
/* debug exported function exit */
#ifdef DEBUG
#define DebugExit(szFunctionName, szResult) \
(StackLeave(), \ TRACE_OUT(("%s() exiting, returning %s.", #szFunctionName, szResult)))
#define DebugExitBOOL(szFunctionName, bool) \
DebugExit(szFunctionName, GetBOOLString(bool))
#define DebugExitCOMPARISONRESULT(szFunctionName, cr) \
DebugExit(szFunctionName, GetCOMPARISONRESULTString(cr))
#define DebugExitDWORD(szFunctionName, dw) \
DebugExitULONG(szFunctionName, dw)
#define DebugExitHRESULT(szFunctionName, hr) \
DebugExit(szFunctionName, GetHRESULTString(hr))
#define DebugExitINT(szFunctionName, n) \
DebugExit(szFunctionName, GetINTString(n))
#define DebugExitULONG(szFunctionName, ul) \
DebugExit(szFunctionName, GetULONGString(ul))
#define DebugExitVOID(szFunctionName) \
(StackLeave(), \ TRACE_OUT(("%s() exiting.", #szFunctionName)))
#else
#define DebugExit(szFunctionName, szResult)
#define DebugExitBOOL(szFunctionName, bool)
#define DebugExitCOMPARISONRESULT(szFunctionName, cr)
#define DebugExitDWORD(szFunctionName, dw)
#define DebugExitHRESULT(szFunctionName, hr)
#define DebugExitINT(szFunctionName, n)
#define DebugExitULONG(szFunctionName, ul)
#define DebugExitVOID(szFunctionName)
#endif
/* Types
********/
/* g_dwSpewFlags 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;
/* g_uSpewSev values */
typedef enum _spewsev { SPEW_TRACE,
SPEW_WARNING,
SPEW_ERROR,
SPEW_FATAL } SPEWSEV;
/* Prototypes
*************/
/* debspew.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 SpewOut(PCSTR pcszFormat, ...);
#endif
/* Global Variables
*******************/
#ifdef DEBUG
/* debspew.c */
extern DWORD g_dwSpewFlags; extern UINT g_uSpewSev; extern UINT g_uSpewLine; extern PCSTR g_pcszSpewFile;
/* defined by client */
extern PCSTR g_pcszSpewModule;
#endif
|