328 lines
6.8 KiB
C
328 lines
6.8 KiB
C
/*
|
|
* 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
|
|
|