windows-nt/Source/XPSP1/NT/shell/ext/url/debspew.h
2020-09-26 16:20:57 +08:00

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