|
|
/*++=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Copyright (c) 2000 Microsoft Corporation
Module Name:
debug.h
Abstract:
Debug logging routines for W3spoof project. Author:
Paul M Midgen (pmidge) 15-May-2000
Revision History:
15-May-2000 pmidge Created
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--*/
#ifndef __DEBUG_H__
#define __DEBUG_H__
#include "common.h"
//
// always build this stuff.
//
#define CASE_OF(constant) case constant: return # constant
#define CASE_OF_MUTATE(val, name) case val: return # name
#define CASE_IID(riid, iid) if(IsEqualIID(riid, iid)) return # iid
LPSTR MapDispidToString(DISPID dispid); LPSTR MapScriptDispidToString(SCRIPTDISPID sd); LPSTR MapIOTYPEToString(IOTYPE iot); LPSTR MapErrorToString(int error); LPSTR MapTPOToString(DWORD option); LPSTR MapHResultToString(HRESULT hr); LPSTR MapStateToString(STATE st); LPSTR MapStateToString(SERVERSTATE st); LPSTR MapStateToString(SCRIPTSTATE st); LPSTR MapIIDToString(REFIID riid); LPSTR MapInvokeFlagsToString(WORD flags); LPSTR MapVariantTypeToString(VARIANT* pvar);
int DebugDataDumpFormat(LPSTR buffer, LPBYTE data, DWORD len);
#ifdef _DEBUG
//
// manifests
//
#if defined(__DBG_TO_CONSOLE__)
#define OUTPUT_FLAGS DBG_TO_DEBUGGER
#else
#define OUTPUT_FLAGS DBG_TO_FILE
#endif
#if defined(__FULL_DEBUG__)
#define DEBUG_DEFAULT_FLAGS ( \
DBG_MEM \ | DBG_REFCOUNT \ | DBG_W3SOBJ \ | DBG_FACTORY \ | DBG_W3SUI \ | DBG_APP \ | DBG_RUNTIME \ | DBG_WORKER \ | DBG_SESSION \ | DBG_SOCKET \ | DBG_REQUEST \ | DBG_RESPONSE \ | DBG_URL \ | DBG_ENTITY \ | DBG_HEADERS \ | DBG_UTILS \ | DBG_THREAD_INFO \ | DBG_CALL_INFO \ | DBG_CALL_DEPTH \ | DBG_TIMESTAMP \ | DBG_NEST_CALLS \ | OUTPUT_FLAGS) #elif defined(__RELEASE_DEBUG__)
#define DEBUG_DEFAULT_FLAGS ( \
DBG_RUNTIME \ | DBG_SESSION \ | DBG_SOCKET \ | DBG_REQUEST \ | DBG_RESPONSE \ | DBG_URL \ | DBG_ENTITY \ | DBG_HEADERS \ | DBG_UTILS \ | DBG_THREAD_INFO \ | DBG_CALL_INFO \ | DBG_CALL_DEPTH \ | DBG_TIMESTAMP \ | DBG_NEST_CALLS \ | OUTPUT_FLAGS) #else
#define DEBUG_DEFAULT_FLAGS ( \
DBG_MEM \ | DBG_W3SOBJ \ | DBG_RUNTIME \ | DBG_WORKER \ | DBG_SESSION \ | DBG_SOCKET \ | DBG_REQUEST \ | DBG_RESPONSE \ | DBG_URL \ | DBG_ENTITY \ | DBG_HEADERS \ | DBG_UTILS \ | DBG_THREAD_INFO \ | DBG_CALL_INFO \ | DBG_CALL_DEPTH \ | DBG_TIMESTAMP \ | DBG_NEST_CALLS \ | OUTPUT_FLAGS) #endif
// category flags
#define DBG_APP 0x00000001
#define DBG_WORKER 0x00000002
#define DBG_REGISTRY 0x00000004
#define DBG_MEM 0x00000008
#define DBG_W3SOBJ 0x00000010
#define DBG_REFCOUNT 0x00000020
#define DBG_FACTORY 0x00000040
#define DBG_W3SUI 0x00000080
#define DBG_SESSION 0x00000100
#define DBG_UTILS 0x00000200
#define DBG_SOCKET 0x00000400
#define DBG_REQUEST 0x00000800
#define DBG_RUNTIME 0x00001000
#define DBG_URL 0x00002000
#define DBG_ENTITY 0x00004000
#define DBG_HEADERS 0x00008000
#define DBG_RESPONSE 0x00010000
#define DBG_DISPATCH 0x00020000
// control flags
#define DBG_THROWDBGALERT 0x00800000
#define DBG_THREAD_INFO 0x01000000
#define DBG_CALL_DEPTH 0x02000000 // remove
#define DBG_TIMESTAMP 0x04000000
#define DBG_NEST_CALLS 0x08000000
#define DBG_TO_FILE 0x10000000
#define DBG_TO_DEBUGGER 0x20000000
#define DBG_CALL_INFO 0x40000000
#define DBG_NO_DEBUG 0x80000000
//
// types
//
typedef struct _memusage { CRITICAL_SECTION lock; DWORD total; MEMORYSTATUS status; } MEMUSAGE, *PMEMUSAGE;
typedef enum _rettype { rt_void, rt_bool, rt_dword, rt_hresult, rt_string } RETTYPE, *LPRETTYPE;
typedef struct _callinfo { struct _callinfo* next; struct _callinfo* last; DWORD category; LPCSTR fname; RETTYPE rettype; } CALLINFO, *LPCALLINFO;
typedef struct _threadinfo { DWORD threadid; DWORD threadcat; DWORD depth; LPCALLINFO stack; } THREADINFO, *LPTHREADINFO;
//
// prototypes
//
void DebugInitialize(void); void DebugTerminate(void);
void DebugMemInitialize(void); void DebugMemTerminate(void); void DebugMemAlloc(void* pv); void DebugMemFree(void* pv);
void DebugEnter(int category, RETTYPE rt, LPCSTR function, const char* format, ...); void DebugLeave(int retval); void DebugTrace(const char* format, ...); void DebugAssert(LPSTR condition, LPSTR file, int line);
void DebugDataDump(LPSTR title, LPBYTE data, DWORD len);
void DebugThrowDbgAlert(void);
void AcquireDebugFileLock(void); void ReleaseDebugFileLock(void);
LPTHREADINFO GetThreadInfo(void);
LPCALLINFO SetCallInfo(LPTHREADINFO pti, DWORD category, RETTYPE rt, LPCSTR function); LPCALLINFO GetCallInfo(LPTHREADINFO pti); void DeleteCallInfo(LPCALLINFO pci);
LPSTR FormatCallReturnString(LPCALLINFO pci, int retval); LPSTR MapCategoryToString(int category); LPSTR MapCompKeyToString(int key);
void _debugout(LPTHREADINFO pti, BOOL fRaw, BOOL fTrace, const char* format, ...); char* _gettimestamp(void); char* _getwhitespace(int spaces); BOOL _opendebugfile(void); void _closedebugfile(void);
//
// macros
//
#define DEBUG_INITIALIZE() DebugInitialize()
#define DEBUG_TERMINATE() DebugTerminate()
#define DEBUG_ENTER(parameters) \
DebugEnter parameters
#define DEBUG_LEAVE(retval) \
DebugLeave(retval)
#define DEBUG_ALLOC(block) \
DebugMemAlloc(block)
#define DEBUG_FREE(block) \
DebugMemFree(block)
extern DWORD g_dwDebugFlags;
#define DEBUG_TRACE(category, parameters) \
if( DBG_##category & g_dwDebugFlags ) \ DebugTrace parameters
#define DEBUG_DATA_DUMP(category, parameters) \
if(DBG_##category & g_dwDebugFlags ) \ DebugDataDump parameters
#define DEBUG_ADDREF(objname, refcount) \
if( DBG_REFCOUNT & g_dwDebugFlags ) \ DebugTrace("%s [%#x] addref: %d", objname, this, refcount)
#define DEBUG_RELEASE(objname, refcount) \
if( DBG_REFCOUNT & g_dwDebugFlags ) \ DebugTrace("%s [%#x] release: %d", objname, this, refcount)
#define DEBUG_FINALRELEASE(objname) \
if( DBG_REFCOUNT & g_dwDebugFlags ) \ DebugTrace("%s [%#x] final release!", objname, this)
#define DEBUG_DUMPWSOCKSTATS(wsd) \
if( DBG_APP & g_dwDebugFlags ) \ DebugTrace(\ "%s (v%d.%d in use) is %s",\ wsd.szDescription,\ (wsd.wVersion & 0x00FF),\ ((wsd.wVersion & 0xFF00) >> 8),\ wsd.szSystemStatus)
#define DEBUG_ASSERT(condition) \
if( !(condition) ) \ DebugAssert(#condition, __FILE__, __LINE__)
#else
// we will get rebuked for the bogus
// arglists in the debug macros
#pragma warning( disable : 4002 )
#pragma warning( disable : 4003 )
#define DEBUG_ASSERT(x, y, z)
#define DEBUG_INITIALIZE()
#define DEBUG_TERMINATE()
#define DEBUG_ALLOC(x)
#define DEBUG_FREE(x)
#define DEBUG_ENTER(x)
#define DEBUG_LEAVE(x)
#define DEBUG_TRACE(x)
#define DEBUG_ADDREF(x)
#define DEBUG_RELEASE(x)
#define DEBUG_FINALRELEASE(x)
#define DEBUG_DUMPWSOCKSTATS(x)
#define DEBUG_DATA_DUMP(X)
#endif /* _DEBUG */
#endif /* __DEBUG_H__ */
|