Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

260 lines
7.3 KiB

  1. #ifndef __DEBUG_H__
  2. #define __DEBUG_H__
  3. #include "common.h"
  4. //
  5. // always build this stuff.
  6. //
  7. #define CASE_OF(constant) case constant: return # constant
  8. #define CASE_OF_MUTATE(val, name) case val: return # name
  9. #define CASE_IID(riid, iid) if(IsEqualIID(riid, iid)) return # iid
  10. LPSTR MapDispidToString(DISPID dispid);
  11. LPSTR MapErrorToString(int error);
  12. LPSTR MapHResultToString(HRESULT hr);
  13. LPSTR MapIIDToString(REFIID riid);
  14. LPSTR MapVariantTypeToString(VARIANT* pvar);
  15. LPSTR MapPointerTypeToString(POINTER pointer);
  16. LPSTR MapDataTypeToString(TYPE type);
  17. LPSTR MapWinHttpAccessType(DWORD type);
  18. LPSTR MapWinHttpIOMode(DWORD mode);
  19. LPSTR MapWinHttpHandleType(HINTERNET hInternet);
  20. LPSTR MapMemsetFlagToString(MEMSETFLAG mf);
  21. LPSTR MapCallbackFlagToString(DWORD flag);
  22. int DebugDataDumpFormat(LPSTR buffer, LPBYTE data, DWORD len);
  23. #ifdef _DEBUG
  24. //
  25. // manifests
  26. //
  27. #if defined(__DBG_TO_CONSOLE__)
  28. #define OUTPUT_FLAGS DBG_TO_DEBUGGER
  29. #else
  30. #define OUTPUT_FLAGS DBG_TO_FILE
  31. #endif
  32. #if defined(__FULL_DEBUG__)
  33. #define DEBUG_DEFAULT_FLAGS ( \
  34. DBG_DLL \
  35. | DBG_INITIALIZE \
  36. | DBG_WHTTPTST \
  37. | DBG_WHTERROR \
  38. | DBG_WHTURLCMP \
  39. | DBG_REGISTRY \
  40. | DBG_MEM \
  41. | DBG_REFCOUNT \
  42. | DBG_FACTORY \
  43. | DBG_UTILS \
  44. | DBG_DISPATCH \
  45. | DBG_HELPER \
  46. | DBG_THREAD_INFO \
  47. | DBG_CALL_INFO \
  48. | DBG_CALL_DEPTH \
  49. | DBG_TIMESTAMP \
  50. | DBG_NEST_CALLS \
  51. | OUTPUT_FLAGS)
  52. #else
  53. #define DEBUG_DEFAULT_FLAGS ( \
  54. DBG_WHTTPTST \
  55. | DBG_TYPE \
  56. | DBG_HELPER \
  57. | DBG_WHTURLCMP \
  58. | DBG_THREAD_INFO \
  59. | DBG_CALL_INFO \
  60. | DBG_CALL_DEPTH \
  61. | DBG_TIMESTAMP \
  62. | DBG_NEST_CALLS \
  63. | OUTPUT_FLAGS)
  64. #endif
  65. // category flags
  66. #define DBG_DLL 0x00000001
  67. #define DBG_WHTTPTST 0x00000002
  68. #define DBG_REGISTRY 0x00000004
  69. #define DBG_MEM 0x00000008
  70. #define DBG_REFCOUNT 0x00000010
  71. #define DBG_FACTORY 0x00000020
  72. #define DBG_UTILS 0x00000040
  73. #define DBG_DISPATCH 0x00000080
  74. #define DBG_HELPER 0x00000100
  75. #define DBG_TYPE 0x00000200
  76. #define DBG_WHTERROR 0x00000400
  77. #define DBG_INITIALIZE 0x00000800
  78. #define DBG_WHTURLCMP 0x00001000
  79. // control flags
  80. #define DBG_THROWDBGALERT 0x00800000
  81. #define DBG_THREAD_INFO 0x01000000
  82. #define DBG_CALL_DEPTH 0x02000000 // remove
  83. #define DBG_TIMESTAMP 0x04000000
  84. #define DBG_NEST_CALLS 0x08000000
  85. #define DBG_TO_FILE 0x10000000
  86. #define DBG_TO_DEBUGGER 0x20000000
  87. #define DBG_CALL_INFO 0x40000000
  88. #define DBG_NO_DEBUG 0x80000000
  89. //
  90. // types
  91. //
  92. typedef struct _memusage
  93. {
  94. CRITICAL_SECTION lock;
  95. DWORD total;
  96. MEMORYSTATUS status;
  97. }
  98. MEMUSAGE, *PMEMUSAGE;
  99. typedef enum _rettype
  100. {
  101. rt_void,
  102. rt_bool,
  103. rt_dword,
  104. rt_hresult,
  105. rt_string
  106. }
  107. RETTYPE, *LPRETTYPE;
  108. typedef struct _callinfo
  109. {
  110. struct _callinfo* next;
  111. struct _callinfo* last;
  112. DWORD category;
  113. LPCSTR fname;
  114. RETTYPE rettype;
  115. }
  116. CALLINFO, *LPCALLINFO;
  117. typedef struct _threadinfo
  118. {
  119. DWORD threadid;
  120. DWORD threadcat;
  121. DWORD depth;
  122. LPCALLINFO stack;
  123. }
  124. THREADINFO, *LPTHREADINFO;
  125. //
  126. // prototypes
  127. //
  128. void DebugInitialize(void);
  129. void DebugTerminate(void);
  130. void DebugMemInitialize(void);
  131. void DebugMemTerminate(void);
  132. void DebugMemAlloc(void* pv);
  133. void DebugMemFree(void* pv);
  134. void DebugEnter(int category, RETTYPE rt, LPCSTR function, const char* format, ...);
  135. void DebugLeave(int retval);
  136. void DebugTrace(const char* format, ...);
  137. void DebugAssert(LPSTR condition, LPSTR file, int line);
  138. void DebugDataDump(LPSTR title, LPBYTE data, DWORD len);
  139. void DebugThrowDbgAlert(void);
  140. void AcquireDebugFileLock(void);
  141. void ReleaseDebugFileLock(void);
  142. LPTHREADINFO GetThreadInfo(void);
  143. LPCALLINFO SetCallInfo(LPTHREADINFO pti, DWORD category, RETTYPE rt, LPCSTR function);
  144. LPCALLINFO GetCallInfo(LPTHREADINFO pti);
  145. void DeleteCallInfo(LPCALLINFO pci);
  146. LPSTR FormatCallReturnString(LPCALLINFO pci, int retval);
  147. LPSTR MapCategoryToString(int category);
  148. LPSTR MapDllReasonToString(int reason);
  149. void _debugout(LPTHREADINFO pti, BOOL fRaw, BOOL fTrace, const char* format, ...);
  150. char* _gettimestamp(void);
  151. char* _getwhitespace(int spaces);
  152. BOOL _opendebugfile(void);
  153. void _closedebugfile(void);
  154. //
  155. // macros
  156. //
  157. #define DEBUG_INITIALIZE() DebugInitialize()
  158. #define DEBUG_TERMINATE() DebugTerminate()
  159. #define DEBUG_ENTER(parameters) \
  160. DebugEnter parameters
  161. #define DEBUG_LEAVE(retval) \
  162. DebugLeave(retval)
  163. #define DEBUG_ALLOC(block) \
  164. DebugMemAlloc(block)
  165. #define DEBUG_FREE(block) \
  166. DebugMemFree(block)
  167. extern DWORD g_dwDebugFlags;
  168. #define DEBUG_TRACE(category, parameters) \
  169. if( DBG_##category & g_dwDebugFlags ) \
  170. DebugTrace parameters
  171. #define DEBUG_DATA_DUMP(category, parameters) \
  172. if(DBG_##category & g_dwDebugFlags ) \
  173. DebugDataDump parameters
  174. #define DEBUG_ADDREF(objname, refcount) \
  175. if( DBG_REFCOUNT & g_dwDebugFlags ) \
  176. DebugTrace("%s [%#x] addref: %d", objname, this, refcount)
  177. #define DEBUG_RELEASE(objname, refcount) \
  178. if( DBG_REFCOUNT & g_dwDebugFlags ) \
  179. DebugTrace("%s [%#x] release: %d", objname, this, refcount)
  180. #define DEBUG_FINALRELEASE(objname) \
  181. if( DBG_REFCOUNT & g_dwDebugFlags ) \
  182. DebugTrace("%s [%#x] final release!", objname, this)
  183. #define DEBUG_DUMPWSOCKSTATS(wsd) \
  184. if( DBG_APP & g_dwDebugFlags ) \
  185. DebugTrace(\
  186. "%s (v%d.%d in use) is %s",\
  187. wsd.szDescription,\
  188. (wsd.wVersion & 0x00FF),\
  189. ((wsd.wVersion & 0xFF00) >> 8),\
  190. wsd.szSystemStatus)
  191. #define DEBUG_ASSERT(condition) \
  192. if( !(condition) ) \
  193. DebugAssert(#condition, __FILE__, __LINE__)
  194. #else
  195. // we will get rebuked for the bogus
  196. // arglists in the debug macros
  197. #pragma warning( disable : 4002 )
  198. #pragma warning( disable : 4003 )
  199. #define DEBUG_ASSERT(x, y, z)
  200. #define DEBUG_INITIALIZE()
  201. #define DEBUG_TERMINATE()
  202. #define DEBUG_ALLOC(x)
  203. #define DEBUG_FREE(x)
  204. #define DEBUG_ENTER(x)
  205. #define DEBUG_LEAVE(x)
  206. #define DEBUG_TRACE(x)
  207. #define DEBUG_ADDREF(x)
  208. #define DEBUG_RELEASE(x)
  209. #define DEBUG_FINALRELEASE(x)
  210. #define DEBUG_DUMPWSOCKSTATS(x)
  211. #define DEBUG_DATA_DUMP(X)
  212. #endif /* _DEBUG */
  213. #endif /* __DEBUG_H__ */