Source code of Windows XP (NT5)
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.

381 lines
10 KiB

  1. /*++
  2. Copyright (c) 1998-1999 Microsoft Corporation
  3. All rights reserved.
  4. Module Name:
  5. dbgmsg.hxx
  6. Abstract:
  7. Debug Library
  8. Author:
  9. Steve Kiraly (SteveKi) 5-Dec-1995
  10. Revision History:
  11. --*/
  12. #ifndef _DBGMSG_HXX_
  13. #define _DBGMSG_HXX_
  14. enum EDebugType
  15. {
  16. //
  17. // Currently supported debug output device types.
  18. //
  19. kDbgNull = 0x00000001, // Log messages to null device (nothing)
  20. kDbgDebugger = 0x00000002, // Log messgaes to debugger
  21. kDbgFile = 0x00000004, // Log messages to file
  22. kDbgConsole = 0x00000008, // Log messages to text console only for gui apps
  23. kDbgBackTrace = 0x00000010, // Log stack back traces at each message call
  24. kDbgMemory = 0x00000020, // Log messages to memory block
  25. kDbgSerialTerminal = 0x00000040, // Log messages to serial terminal
  26. };
  27. enum EDebugLevel
  28. {
  29. //
  30. // Private internal defined flags. (do not use in your code)
  31. //
  32. kDbgPrivateMask = 0x0000000F, // Private flag mask
  33. kDbgAnsi = 0x00000000, // Output device will accept ansi characters
  34. kDbgUnicode = 0x00000001, // Output device will accept unicode characters
  35. kDbgAlways = 0x00000002, // Always display ignore levels used for assert messages
  36. kDbgNoPrefix = 0x00000004, // Do not display the prefix string
  37. kDbgNoFileInfo = 0x00000008, // Do not display the file information
  38. //
  39. // Display output customization flags.
  40. //
  41. kDbgDisplayMask = 0x00000FF0, // User defined flag mask
  42. kDbgFileInfo = 0x00000010, // Show file name and line number
  43. kDbgFileInfoLong = 0x00000020, // Show file name in long format, full path
  44. kDbgTimeStamp = 0x00000040, // Show time stamp
  45. kDbgTimeStampLong = 0x00000080, // Show time stamp long format hh:mm:ss tt
  46. kDbgThreadId = 0x00000100, // Show thread id
  47. //
  48. // User defined levels.
  49. //
  50. kDbgUserLevelMask = 0xFFFFF000, // User defined level mask
  51. kDbgNone = 0x00001000, // No message
  52. kDbgTrace = 0x00002000, // Trace messages
  53. kDbgWarning = 0x00004000, // Warning messages
  54. kDbgError = 0x00008000, // Error messages
  55. kDbgFatal = 0x00010000, // Fatal messages
  56. kDbgPerformance = 0x00020000, // Show performance counter results
  57. kDbgCsrCacheManager = 0x00040000, // Debug CSR cache manager
  58. kDbgCsrMonitor = 0x00080000, // Debug CSR port monitor
  59. kDbgCsrCore = 0x00100000, // Debug CSR port monitor
  60. kDbgCsrConnect = 0x00200000, // Debug CSR connection manager
  61. };
  62. enum EDebugCompileType
  63. {
  64. #ifdef UNICODE
  65. kDbgCompileType = kDbgUnicode,
  66. #else
  67. kDbgCompileType = kDbgAnsi,
  68. #endif
  69. };
  70. /********************************************************************
  71. Debug message macros.
  72. ********************************************************************/
  73. #if DBG
  74. #define DBG_NULL kDbgNull
  75. #define DBG_CONSOLE kDbgConsole
  76. #define DBG_DEBUGGER kDbgDebugger
  77. #define DBG_FILE kDbgFile
  78. #define DBG_BACKTRACE kDbgBackTrace
  79. #define DBG_DEFAULT kDbgDebugger
  80. #define DBG_FILEINFO kDbgFileInfo
  81. #define DBG_FILEINFO_LONG kDbgFileInfoLong
  82. #define DBG_TIMESTAMP kDbgTimeStamp
  83. #define DBG_TIMESTAMP_LONG kDbgTimeStampLong
  84. #define DBG_THREADID kDbgThreadId
  85. #define DBG_NONE kDbgNone
  86. #define DBG_INFO kDbgInfo
  87. #define DBG_TRACE kDbgTrace
  88. #define DBG_WARN kDbgWarning
  89. #define DBG_ERROR kDbgError
  90. #define DBG_FATAL kDbgFatal
  91. #define DBG_PERF kDbgPerformance
  92. #define DBG_CACHE kDbgCsrCacheManager
  93. #define DBG_MONITOR kDbgCsrMonitor
  94. #define DBG_CORE kDbgCsrCore
  95. #define DBG_CONNECT kDbgCsrConnect
  96. #ifndef DBG_MODULE_PREFIX
  97. #define DBG_MODULE_PREFIX NULL
  98. #endif
  99. #define DBG_STR( str ) \
  100. ((str) ? (str) : _T("(NULL)"))
  101. #define DBG_RAW(Message) \
  102. OutputDebugString(Message _T("\r\n"))
  103. #define DBG_COMMENT(Comment) \
  104. Comment
  105. #define DBG_BREAK() \
  106. DebugBreak()
  107. #define DBG_OPEN(Prefix, uDevice, Level, Break) \
  108. TDebugMsg_Register((Prefix), (uDevice), (Level), (Break))
  109. #define DBG_CLOSE() \
  110. TDebugMsg_Release()
  111. #define DBG_ENABLE() \
  112. TDebugMsg_Enable()
  113. #define DBG_DISABLE() \
  114. TDebugMsg_Disable()
  115. #define DBG_ATTACH(uDevice, pszConfiguration) \
  116. TDebugMsg_Attach(NULL, (uDevice), (pszConfiguration))
  117. #define DBG_HANDLE_(hDevice) \
  118. HANDLE hDevice = NULL
  119. #define DBG_ATTACH_(hDevice, uDevice, pszConfiguration) \
  120. TDebugMsg_Attach(&(hDevice), (uDevice), (pszConfiguration))
  121. #define DBG_DETACH_(hDevice) \
  122. TDebugMsg_Detach(&(hDevice))
  123. #define DBG_SET_FIELD_FORMAT(Level, Format) \
  124. TDebugMsg_SetMessageFieldFormat((Level), (Format))
  125. #ifdef __cplusplus
  126. //
  127. // For C++ files function overloading is used to call either the ansi or unicode versions.
  128. //
  129. #define DBG_MSG(uLevel, Msg) \
  130. TDebugMsg_Msg((uLevel), _T(__FILE__), __LINE__, DBG_MODULE_PREFIX, TDebugMsg_Fmt Msg)
  131. #else // not __cplusplus
  132. //
  133. // For C files the compiled character type determines which function to call.
  134. //
  135. #define DBG_MSGW(uLevel, Msg) \
  136. TDebugMsg_MsgW((uLevel), _T(__FILE__), __LINE__, DBG_MODULE_PREFIX, TDebugMsg_FmtW Msg)
  137. #define DBG_MSGA(uLevel, Msg) \
  138. TDebugMsg_MsgA((uLevel), _T(__FILE__), __LINE__, DBG_MODULE_PREFIX, TDebugMsg_FmtA Msg)
  139. #ifdef UNICODE
  140. #define DBG_MSG DBG_MSGW
  141. #else
  142. #define DBG_MSG DBG_MSGA
  143. #endif // unicode
  144. #endif // __cplusplus
  145. //
  146. // Debug assert normal assert.
  147. //
  148. #define DBG_ASSERT(Exp) \
  149. do { if (!(Exp)) \
  150. {\
  151. DBG_MSG(kDbgAlways|kDbgFileInfo, (_T("Assert %s\n"), _T(#Exp)));\
  152. DBG_BREAK(); \
  153. } } while (0)
  154. //
  155. // Assert with addtional message.
  156. //
  157. #define DBG_ASSERT_MSG(Exp, Msg) \
  158. do { if (!(Exp)) \
  159. {\
  160. DBG_MSG(kDbgAlways|kDbgFileInfo, (_T("Assert %s"), _T(#Exp))); \
  161. DBG_MSG(kDbgAlways|kDbgNoPrefix, Msg); \
  162. DBG_BREAK(); \
  163. } } while (0)
  164. #else // not DBG
  165. #define DBG_FILEINFO 0
  166. #define DBG_FILEINFO_LONG 0
  167. #define DBG_TIMESTAMP 0
  168. #define DBG_TIMESTAMP_LONG 0
  169. #define DBG_TRHEADID 0
  170. #define DBG_NONE 0
  171. #define DBG_INFO 0
  172. #define DBG_TRACE 0
  173. #define DBG_WARN 0
  174. #define DBG_ERROR 0
  175. #define DBG_FATAL 0
  176. #define DBG_PERF 0
  177. #define DBG_CACHE 0
  178. #define DBG_MONITOR 0
  179. #define DBG_CORE 0
  180. #define DBG_CONNECT 0
  181. #define DBG_RAW(Message) // Empty
  182. #define DBG_COMMENT(Comment) // Empty
  183. #define DBG_BREAK() // Empty
  184. #define DBG_OPEN(Prefix, uDevice, Level, Break) // Empty
  185. #define DBG_CLOSE() // Empty
  186. #define DBG_MSG(uLevel, Message) // Empty
  187. #define DBG_MSGA(uLevel, Message) // Empty
  188. #define DBG_MSGW(uLevel, Message) // Empty
  189. #define DBG_ASSERT(Exp) // Empty
  190. #define DBG_ASSERT_MSG(Exp, Message) // Empty
  191. #define DBG_ATTACH(uDevice, pszConfiguration) // Empty
  192. #define DBG_HANDLE_(Handle) // Empty
  193. #define DBG_ATTACH_(hDevice, uDevice, pszConfiguration) // Empty
  194. #define DBG_DETACH_(Handle) // Empty
  195. #define DBG_ENABLE() // Empty
  196. #define DBG_DISABLE() // Empty
  197. #define DBG_SET_FIELD_FORMAT(Level, Format) // Empty
  198. #endif
  199. /********************************************************************
  200. Debug message functions exported by this library.
  201. ********************************************************************/
  202. #ifdef __cplusplus
  203. extern "C" {
  204. #endif
  205. BOOL
  206. TDebugMsg_Register(
  207. IN LPCTSTR pszPrefix,
  208. IN UINT uDevice,
  209. IN INT eLevel,
  210. IN INT eBreak
  211. );
  212. VOID
  213. TDebugMsg_Release(
  214. VOID
  215. );
  216. VOID
  217. TDebugMsg_Enable(
  218. VOID
  219. );
  220. VOID
  221. TDebugMsg_Disable(
  222. VOID
  223. );
  224. BOOL
  225. TDebugMsg_Attach(
  226. IN HANDLE *phDevice,
  227. IN UINT uDevice,
  228. IN LPCTSTR pszConfiguration
  229. );
  230. VOID
  231. TDebugMsg_Detach(
  232. IN HANDLE *phDevice
  233. );
  234. VOID
  235. TDebugMsg_MsgA(
  236. IN UINT eLevel,
  237. IN LPCTSTR pszFile,
  238. IN UINT uLine,
  239. IN LPCTSTR pszModulePrefix,
  240. IN LPSTR pszMessage
  241. );
  242. VOID
  243. TDebugMsg_MsgW(
  244. IN UINT eLevel,
  245. IN LPCTSTR pszFile,
  246. IN UINT uLine,
  247. IN LPCTSTR pszModulePrefix,
  248. IN LPWSTR pszMessage
  249. );
  250. LPSTR
  251. WINAPIV
  252. TDebugMsg_FmtA(
  253. IN LPCSTR pszFmt,
  254. IN ...
  255. );
  256. LPWSTR
  257. WINAPIV
  258. TDebugMsg_FmtW(
  259. IN LPCWSTR pszFmt,
  260. IN ...
  261. );
  262. VOID
  263. TDebugMsg_SetMessageFieldFormat(
  264. IN UINT eLevel,
  265. IN LPTSTR pszFormat
  266. );
  267. #ifdef __cplusplus
  268. }
  269. #endif
  270. #ifdef __cplusplus
  271. VOID
  272. TDebugMsg_Msg(
  273. IN UINT eLevel,
  274. IN LPCTSTR pszFile,
  275. IN UINT uLine,
  276. IN LPCTSTR pszModulePrefix,
  277. IN LPSTR pszMessage
  278. );
  279. VOID
  280. TDebugMsg_Msg(
  281. IN UINT eLevel,
  282. IN LPCTSTR pszFile,
  283. IN UINT uLine,
  284. IN LPCTSTR pszModulePrefix,
  285. IN LPWSTR pszMessage
  286. );
  287. LPSTR
  288. WINAPIV
  289. TDebugMsg_Fmt(
  290. IN LPCSTR pszFmt,
  291. IN ...
  292. );
  293. LPWSTR
  294. WINAPIV
  295. TDebugMsg_Fmt(
  296. IN LPCWSTR pszFmt,
  297. IN ...
  298. );
  299. #endif // __cplusplus
  300. #endif // DBGMSG_HXX