Windows2003-3790/inetcore/urlmon/inc/inetdbg.h
2020-09-30 16:53:55 +02:00

776 lines
18 KiB
C

/*++
Module Name:
inetdbg.h
Abstract:
Manifests, macros, types and prototypes for Windows Internet client DLL
debugging functions
Author:
Venkatraman Kudallur (venkatk) 3-10-2000
( Ripped off from Wininet )
Revision History:
3-10-2000 venkatk
Created
--*/
#ifndef _INETDBG_H_
#define _INETDBG_H_ 1
#if defined(__cplusplus)
extern "C" {
#endif
//
// misc. debug manifests
//
#define DEBUG_WAIT_TIME (2 * 60 * 1000)
//
// Checked builds get INET_DEBUG set by default; retail builds get no debugging
// by default
//
#if DBG
#if !defined(INET_DEBUG)
#define INET_DEBUG 1
#endif // INET_DEBUG
#else
#if !defined(INET_DEBUG)
#define INET_DEBUG 0
#endif // INET_DEBUG
#endif // DBG
//
// types
//
//
// DEBUG_FUNCTION_RETURN_TYPE - Type of result (scalar) that a function returns
//
#ifdef ENABLE_DEBUG
typedef enum {
None,
Bool,
Int,
Dword,
Hresult,
String,
Handle,
Pointer
} DEBUG_FUNCTION_RETURN_TYPE;
#define INTERNET_DEBUG_CONTROL_DEFAULT (DBG_THREAD_INFO \
| DBG_CALL_DEPTH \
| DBG_ENTRY_TIME \
| DBG_PARAMETER_LIST \
| DBG_TO_FILE \
| DBG_INDENT_DUMP \
| DBG_SEPARATE_APIS \
| DBG_AT_ERROR_LEVEL \
| DBG_NO_ASSERT_BREAK \
| DBG_DUMP_LENGTH \
| DBG_NO_LINE_NUMBER \
| DBG_ASYNC_ID \
)
#define INTERNET_DEBUG_CATEGORY_DEFAULT DBG_ANY
#define INTERNET_DEBUG_ERROR_LEVEL_DEFAULT DBG_INFO
//
// options. These are the option values to use with InternetQueryOption()/
// InternetSetOption() to get/set the information described herein
//
#define INTERNET_OPTION_GET_DEBUG_INFO 1001
#define INTERNET_OPTION_SET_DEBUG_INFO 1002
#define INTERNET_OPTION_GET_HANDLE_COUNT 1003
#define INTERNET_OPTION_GET_TRIGGERS 1004
#define INTERNET_OPTION_SET_TRIGGERS 1005
#define INTERNET_OPTION_RESET_TRIGGERS 1006
#define INTERNET_FIRST_DEBUG_OPTION INTERNET_OPTION_GET_DEBUG_INFO
#define INTERNET_LAST_DEBUG_OPTION INTERNET_OPTION_RESET_TRIGGERS
//
// debug levels
//
#define DBG_INFO 0
#define DBG_WARNING 1
#define DBG_ERROR 2
#define DBG_FATAL 3
#define DBG_ALWAYS 99
//
// debug control flags - these flags control where the debug output goes (file,
// debugger, console) and how it is formatted
//
#define DBG_THREAD_INFO 0x00000001 // dump the thread id
#define DBG_CALL_DEPTH 0x00000002 // dump the call level
#define DBG_ENTRY_TIME 0x00000004 // dump the local time when the function is called
#define DBG_PARAMETER_LIST 0x00000008 // dump the parameter list
#define DBG_TO_DEBUGGER 0x00000010 // output via OutputDebugString()
#define DBG_TO_CONSOLE 0x00000020 // output via printf()
#define DBG_TO_FILE 0x00000040 // output via fprintf()
#define DBG_FLUSH_OUTPUT 0x00000080 // fflush() after every fprintf()
#define DBG_INDENT_DUMP 0x00000100 // indent dumped data to current level
#define DBG_SEPARATE_APIS 0x00000200 // empty line after leaving each API
#define DBG_AT_ERROR_LEVEL 0x00000400 // always output diagnostics >= InternetDebugErrorLevel
#define DBG_NO_ASSERT_BREAK 0x00000800 // don't call DebugBreak() in InternetAssert()
#define DBG_DUMP_LENGTH 0x00001000 // dump length information when dumping data
#define DBG_NO_LINE_NUMBER 0x00002000 // don't dump line number info
#define DBG_APPEND_FILE 0x00004000 // append to the log file (default is truncate)
#define DBG_LEVEL_INDICATOR 0x00008000 // dump error level indicator (E for Error, etc.)
#define DBG_DUMP_API_DATA 0x00010000 // dump data at API level (InternetReadFile(), etc.)
#define DBG_DELTA_TIME 0x00020000 // dump times as millisecond delta if DBG_ENTRY_TIME
#define DBG_CUMULATIVE_TIME 0x00040000 // dump delta time from start of trace if DBG_ENTRY_TIME
#define DBG_FIBER_INFO 0x00080000 // dump the fiber address if DBG_THREAD_INFO
#define DBG_THREAD_INFO_ADR 0x00100000 // dump INTERNET_THREAD_INFO address if DBG_THREAD_INFO
#define DBG_ARB_ADDR 0x00200000 // dump ARB address if DBG_THREAD_INFO
#define DBG_ASYNC_ID 0x00400000 // dump async ID
#define DBG_REQUEST_HANDLE 0x00800000 // dump request handle
#define DBG_TRIGGER_ON 0x10000000 // function is an enabling trigger
#define DBG_TRIGGER_OFF 0x20000000 // function is a disabling trigger
#define DBG_NO_DATA_DUMP 0x40000000 // turn off all data dumping
#define DBG_NO_DEBUG 0x80000000 // turn off all debugging
//
// debug category flags - these control what category of information is output
//
#define DBG_NOTHING 0x00000000 // internal
#define DBG_REGISTRY 0x00000001 //
#define DBG_TRANS 0x00000002 //
#define DBG_BINDING 0x00000004 //
#define DBG_STORAGE 0x00000008 //
#define DBG_TRANSDAT 0x00000010 //
#define DBG_API 0x00000020 //
#define DBG_DOWNLOAD 0x00000040 //
#define DBG_APP 0x00000080 //
#define DBG_MONIKER 0x00000100 //
#define DBG_TRANSMGR 0x00000200 //
#define DBG_CALLBACK 0x00000400 //
#define DBG_19 0x00000800 //
#define DBG_18 0x00001000 //
#define DBG_17 0x00002000 //
#define DBG_16 0x00004000 //
#define DBG_15 0x00008000 //
#define DBG_14 0x00010000 //
#define DBG_13 0x00020000 //
#define DBG_12 0x00040000 //
#define DBG_11 0x00080000 //
#define DBG_10 0x00100000 //
#define DBG_9 0x00200000 //
#define DBG_8 0x00400000 //
#define DBG_7 0x00800000 //
#define DBG_6 0x01000000 //
#define DBG_5 0x02000000 //
#define DBG_4 0x04000000 //
#define DBG_3 0x08000000 //
#define DBG_2 0x10000000 //
#define DBG_1 0x20000000 //
#define DBG_ANY 0xFFFFFFFF //
//
// _DEBUG_URLMON_FUNC_RECORD - for each thread, we maintain a LIFO stack of these,
// describing the functions we have visited
//
typedef struct _DEBUG_URLMON_FUNC_RECORD {
//
// Stack - a LIFO stack of debug records is maintained in the debug version
// of the INTERNET_THREAD_INFO
//
struct _DEBUG_URLMON_FUNC_RECORD* Stack;
//
// Category - the function's category flag(s)
//
DWORD Category;
//
// ReturnType - type of value returned by function
//
DEBUG_FUNCTION_RETURN_TYPE ReturnType;
//
// Function - name of the function
//
LPCSTR Function;
//
// LastTime - if we are dumping times as deltas, keeps the last tick count
//
DWORD LastTime;
} DEBUG_URLMON_FUNC_RECORD, *LPDEBUG_URLMON_FUNC_RECORD;
//
// data
//
extern DWORD InternetDebugErrorLevel;
extern DWORD InternetDebugControlFlags;
extern DWORD InternetDebugCategoryFlags;
extern DWORD InternetDebugBreakFlags;
//
// prototypes
//
//
// inetdbg.cxx
//
VOID
InternetDebugInitialize(
VOID
);
VOID
InternetDebugTerminate(
VOID
);
BOOL
InternetOpenDebugFile(
VOID
);
BOOL
InternetReopenDebugFile(
IN LPSTR Filename
);
VOID
InternetCloseDebugFile(
VOID
);
VOID
InternetFlushDebugFile(
VOID
);
VOID
InternetDebugSetControlFlags(
IN DWORD dwFlags
);
VOID
InternetDebugResetControlFlags(
IN DWORD dwFlags
);
VOID
InternetDebugEnter(
IN DWORD Category,
IN DEBUG_FUNCTION_RETURN_TYPE ReturnType,
IN LPCSTR Function,
IN LPCSTR ParameterList,
IN ...
);
VOID
InternetDebugLeave(
IN DWORD_PTR Variable,
IN LPCSTR Filename,
IN DWORD LineNumber
);
VOID
InternetDebugError(
IN DWORD Error
);
VOID
InternetDebugPrint(
IN LPSTR Format,
...
);
VOID
InternetDebugPrintValist(
IN LPSTR Format,
IN va_list valist
);
VOID
InternetDebugPrintf(
IN LPSTR Format,
IN ...
);
VOID
InternetDebugOut(
IN LPSTR Buffer,
IN BOOL Assert
);
VOID
InternetDebugDump(
IN LPSTR Text,
IN LPBYTE Address,
IN DWORD Size
);
DWORD
InternetDebugDumpFormat(
IN LPBYTE Address,
IN DWORD Size,
IN DWORD ElementSize,
OUT LPSTR Buffer
);
VOID
InternetAssert(
IN LPSTR Condition,
IN LPSTR Filename,
IN DWORD LineNumber
);
VOID
InternetGetDebugVariable(
IN LPSTR lpszVariableName,
OUT LPDWORD lpdwVariable
);
LPSTR
InternetMapError(
IN DWORD Error
);
int dprintf(char *, ...);
LPSTR
SourceFilename(
LPSTR Filespec
);
VOID
InitSymLib(
VOID
);
VOID
TermSymLib(
VOID
);
LPSTR
GetDebugSymbol(
DWORD Address,
LPDWORD Offset
);
VOID
x86SleazeCallStack(
OUT LPVOID * lplpvStack,
IN DWORD dwStackCount,
IN LPVOID * Ebp
);
VOID
x86SleazeCallersAddress(
LPVOID* pCaller,
LPVOID* pCallersCaller
);
#else //ENABLE_DEBUG
#define dprintf (VOID)
#endif //ENABLE_DEBUG
//
// macros
//
#ifdef ENABLE_DEBUG
//
// INET_DEBUG_START - initialize debugging support
//
#define INET_DEBUG_START() \
InternetDebugInitialize()
//
// INET_DEBUG_FINISH - terminate debugging support
//
#define INET_DEBUG_FINISH() \
InternetDebugTerminate()
//
// INET_ASSERT - The standard assert, redefined here because Win95 doesn't have
// RtlAssert
//
#if defined(DISABLE_ASSERTS)
#define INET_ASSERT(test) \
/* NOTHING */
#else // defined(DISABLE_ASSERTS)
#define INET_ASSERT(test) \
do if (!(test)) { \
InternetAssert(#test, __FILE__, __LINE__); \
} while (0)
#endif // defined(DISABLE_ASSERTS)
#else // end #ifdef ENABLE_DEBUG
#define INET_DEBUG_START() \
/* NOTHING */
#define INET_DEBUG_FINISH() \
/* NOTHING */
#define INET_ASSERT(test) \
do { } while(0) /* NOTHING */
#endif // end #ifndef ENABLE_DEBUG
//
// INET_DEBUG_ASSERT - assert only if INET_DEBUG is set
//
#if INET_DEBUG
#define INET_DEBUG_ASSERT(cond) INET_ASSERT(cond)
#else
#define INET_DEBUG_ASSERT(cond) /* NOTHING */
#endif
#if INET_DEBUG
//
// IF_DEBUG_CODE - always on if INET_DEBUG is set
//
#define IF_DEBUG_CODE() \
if (1)
//
// IF_DEBUG - only execute following code if the specific flag is set
//
#define IF_DEBUG(x) \
if (InternetDebugCategoryFlags & DBG_ ## x)
//
// IF_DEBUG_CONTROL - only execute if control flag is set
//
#define IF_DEBUG_CONTROL(x) \
if (InternetDebugControlFlags & DBG_ ## x)
//
// DEBUG_ENTER - creates an INTERNET_DEBUG_RECORD for this function
//
#if defined(RETAIL_LOGGING)
#define DEBUG_ENTER(ParameterList) \
/* NOTHING */
#define DEBUG_ENTER_API(ParameterList) \
InternetDebugEnter ParameterList
#else // defined(RETAIL_LOGGING)
#define DEBUG_ENTER_API DEBUG_ENTER
#define DEBUG_ENTER(ParameterList) \
InternetDebugEnter ParameterList
#endif // defined(RETAIL_LOGGING)
//
// DEBUG_LEAVE - destroys this function's INTERNET_DEBUG_RECORD
//
#if defined(RETAIL_LOGGING)
#define DEBUG_LEAVE(Variable) \
/* NOTHING */
#define DEBUG_LEAVE_API(Variable) \
InternetDebugLeave((DWORD_PTR)Variable, __FILE__, __LINE__)
#else // defined(RETAIL_LOGGING)
#define DEBUG_LEAVE_API DEBUG_LEAVE
#define DEBUG_LEAVE(Variable) \
InternetDebugLeave((DWORD_PTR)Variable, __FILE__, __LINE__)
#endif // defined(RETAIL_LOGGING)
//
// DEBUG_ERROR - displays an error and its symbolic name
//
#define DEBUG_ERROR(Category, Error) \
if (InternetDebugCategoryFlags & DBG_ ## Category) { \
InternetDebugError(Error); \
}
//
// DEBUG_PRINT - print debug info if we are at the correct level or we are
// requested to always dump information at, or above, InternetDebugErrorLevel
//
#if defined(RETAIL_LOGGING)
#define DEBUG_PRINT(Category, ErrorLevel, Args) \
/* NOTHING */
#define DEBUG_PRINT_API(Category, ErrorLevel, Args) \
if (((InternetDebugCategoryFlags & DBG_ ## Category) \
&& (DBG_ ## ErrorLevel >= InternetDebugErrorLevel)) \
|| ((InternetDebugControlFlags & DBG_AT_ERROR_LEVEL) \
&& (DBG_ ## ErrorLevel >= InternetDebugErrorLevel))) { \
InternetDebugPrint Args; \
}
#else // defined(RETAIL_LOGGING)
#define DEBUG_PRINT_API DEBUG_PRINT
#define DEBUG_PRINT(Category, ErrorLevel, Args) \
if (((InternetDebugCategoryFlags & DBG_ ## Category) \
&& (DBG_ ## ErrorLevel >= InternetDebugErrorLevel)) \
|| ((InternetDebugControlFlags & DBG_AT_ERROR_LEVEL) \
&& (DBG_ ## ErrorLevel >= InternetDebugErrorLevel))) { \
InternetDebugPrint Args; \
}
#endif // defined(RETAIL_LOGGING)
//
// DEBUG_PUT - prints formatted string to debug output stream
//
#if defined(RETAIL_LOGGING)
#define DEBUG_PUT(Args) \
/* NOTHING */
#else // defined(RETAIL_LOGGING)
#define DEBUG_PUT(Args) \
InternetDebugPrintf Args
#endif // defined(RETAIL_LOGGING)
//
// DEBUG_DUMP - dump data
//
#if defined(RETAIL_LOGGING)
#define DEBUG_DUMP(Category, Text, Address, Length) \
/* NOTHING */
#define DEBUG_DUMP_API(Category, Text, Address, Length) \
if (InternetDebugCategoryFlags & DBG_ ## Category) { \
InternetDebugDump(Text, (LPBYTE)Address, Length); \
}
#else // defined(RETAIL_LOGGING)
#define DEBUG_DUMP_API DEBUG_DUMP
#define DEBUG_DUMP(Category, Text, Address, Length) \
if (InternetDebugCategoryFlags & DBG_ ## Category) { \
InternetDebugDump(Text, (LPBYTE)Address, Length); \
}
#endif // defined(RETAIL_LOGGING)
//
// DEBUG_BREAK - break into debugger if break flag is set for this module
//
#define DEBUG_BREAK(Module) \
if (InternetDebugBreakFlags & DBG_ ## Module) { \
InternetDebugPrintf("Breakpoint. File %s Line %d\n", \
__FILE__, \
__LINE__ \
); \
DebugBreak(); \
}
//
// WAIT_FOR_SINGLE_OBJECT - perform WaitForSingleObject and check we didn't
// get a timeout
//
#define WAIT_FOR_SINGLE_OBJECT(Object, Error) \
Error = WaitForSingleObject((Object), DEBUG_WAIT_TIME); \
if (Error == WAIT_TIMEOUT) { \
InternetDebugPrintf("single object timeout\n"); \
DebugBreak(); \
}
//
// DEBUG_WAIT_TIMER - create DWORD variable for holding time
//
#define DEBUG_WAIT_TIMER(TimerVar) \
DWORD TimerVar
//
// DEBUG_START_WAIT_TIMER - get current tick count
//
#define DEBUG_START_WAIT_TIMER(TimerVar) \
TimerVar = GetTickCountWrap()
//
// DEBUG_CHECK_WAIT_TIMER - get the current number of ticks, subtract from the
// previous value recorded by DEBUG_START_WAIT_TIMER and break to debugger if
// outside the predefined range
//
#define DEBUG_CHECK_WAIT_TIMER(TimerVar, MilliSeconds) \
TimerVar = (GetTickCountWrap() - TimerVar); \
if (TimerVar > MilliSeconds) { \
InternetDebugPrintf("Wait time (%d mSecs) exceeds acceptable value (%d mSecs)\n", \
TimerVar, \
MilliSeconds \
); \
DebugBreak(); \
}
#define DEBUG_DATA(Type, Name, InitialValue) \
Type Name = InitialValue
#define DEBUG_DATA_EXTERN(Type, Name) \
extern Type Name
#define DEBUG_LABEL(label) \
label:
#define DEBUG_GOTO(label) \
goto label
#define DEBUG_ONLY(x) \
x
#if defined(i386)
#define GET_CALLERS_ADDRESS(p, pp) x86SleazeCallersAddress(p, pp)
#define GET_CALL_STACK(p) x86SleazeCallStack((LPVOID *)&p, ARRAY_ELEMENTS(p), 0)
#else // defined(i386)
#define GET_CALLERS_ADDRESS(p, pp)
#define GET_CALL_STACK(p)
#endif // defined(i386)
#else // end #if INET_DEBUG
#define IF_DEBUG_CODE() \
if (0)
#define IF_DEBUG(x) \
if (0)
#define IF_DEBUG_CONTROL(x) \
if (0)
#define DEBUG_ENTER(ParameterList) \
/* NOTHING */
#define DEBUG_ENTER_API(ParameterList) \
/* NOTHING */
#define DEBUG_LEAVE(Variable) \
/* NOTHING */
#define DEBUG_LEAVE_API(Variable) \
/* NOTHING */
#define DEBUG_ERROR(Category, Error) \
/* NOTHING */
#define DEBUG_PRINT(Category, ErrorLevel, Args) \
/* NOTHING */
#define DEBUG_PRINT_API(Category, ErrorLevel, Args) \
/* NOTHING */
#define DEBUG_PUT(Args) \
/* NOTHING */
#define DEBUG_DUMP(Category, Text, Address, Length) \
/* NOTHING */
#define DEBUG_DUMP_API(Category, Text, Address, Length) \
/* NOTHING */
#define DEBUG_BREAK(module) \
/* NOTHING */
#define WAIT_FOR_SINGLE_OBJECT(Object, Error) \
Error = WaitForSingleObject((Object), INFINITE)
#define DEBUG_WAIT_TIMER(TimerVar) \
/* NOTHING */
#define DEBUG_START_WAIT_TIMER(TimerVar) \
/* NOTHING */
#define DEBUG_CHECK_WAIT_TIMER(TimerVar, MilliSeconds) \
/* NOTHING */
#define DEBUG_DATA(Type, Name, InitialValue) \
/* NOTHING */
#define DEBUG_DATA_EXTERN(Type, Name) \
/* NOTHING */
#define DEBUG_LABEL(label) \
/* NOTHING */
#define DEBUG_GOTO(label) \
/* NOTHING */
#define DEBUG_ONLY(x) \
/* NOTHING */
#endif // INET_DEBUG
#if defined(__cplusplus)
}
#endif
#endif //ifndef _INETDBG_H_