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.

775 lines
18 KiB

  1. /*++
  2. Module Name:
  3. inetdbg.h
  4. Abstract:
  5. Manifests, macros, types and prototypes for Windows Internet client DLL
  6. debugging functions
  7. Author:
  8. Venkatraman Kudallur (venkatk) 3-10-2000
  9. ( Ripped off from Wininet )
  10. Revision History:
  11. 3-10-2000 venkatk
  12. Created
  13. --*/
  14. #ifndef _INETDBG_H_
  15. #define _INETDBG_H_ 1
  16. #if defined(__cplusplus)
  17. extern "C" {
  18. #endif
  19. //
  20. // misc. debug manifests
  21. //
  22. #define DEBUG_WAIT_TIME (2 * 60 * 1000)
  23. //
  24. // Checked builds get INET_DEBUG set by default; retail builds get no debugging
  25. // by default
  26. //
  27. #if DBG
  28. #if !defined(INET_DEBUG)
  29. #define INET_DEBUG 1
  30. #endif // INET_DEBUG
  31. #else
  32. #if !defined(INET_DEBUG)
  33. #define INET_DEBUG 0
  34. #endif // INET_DEBUG
  35. #endif // DBG
  36. //
  37. // types
  38. //
  39. //
  40. // DEBUG_FUNCTION_RETURN_TYPE - Type of result (scalar) that a function returns
  41. //
  42. #ifdef ENABLE_DEBUG
  43. typedef enum {
  44. None,
  45. Bool,
  46. Int,
  47. Dword,
  48. Hresult,
  49. String,
  50. Handle,
  51. Pointer
  52. } DEBUG_FUNCTION_RETURN_TYPE;
  53. #define INTERNET_DEBUG_CONTROL_DEFAULT (DBG_THREAD_INFO \
  54. | DBG_CALL_DEPTH \
  55. | DBG_ENTRY_TIME \
  56. | DBG_PARAMETER_LIST \
  57. | DBG_TO_FILE \
  58. | DBG_INDENT_DUMP \
  59. | DBG_SEPARATE_APIS \
  60. | DBG_AT_ERROR_LEVEL \
  61. | DBG_NO_ASSERT_BREAK \
  62. | DBG_DUMP_LENGTH \
  63. | DBG_NO_LINE_NUMBER \
  64. | DBG_ASYNC_ID \
  65. )
  66. #define INTERNET_DEBUG_CATEGORY_DEFAULT DBG_ANY
  67. #define INTERNET_DEBUG_ERROR_LEVEL_DEFAULT DBG_INFO
  68. //
  69. // options. These are the option values to use with InternetQueryOption()/
  70. // InternetSetOption() to get/set the information described herein
  71. //
  72. #define INTERNET_OPTION_GET_DEBUG_INFO 1001
  73. #define INTERNET_OPTION_SET_DEBUG_INFO 1002
  74. #define INTERNET_OPTION_GET_HANDLE_COUNT 1003
  75. #define INTERNET_OPTION_GET_TRIGGERS 1004
  76. #define INTERNET_OPTION_SET_TRIGGERS 1005
  77. #define INTERNET_OPTION_RESET_TRIGGERS 1006
  78. #define INTERNET_FIRST_DEBUG_OPTION INTERNET_OPTION_GET_DEBUG_INFO
  79. #define INTERNET_LAST_DEBUG_OPTION INTERNET_OPTION_RESET_TRIGGERS
  80. //
  81. // debug levels
  82. //
  83. #define DBG_INFO 0
  84. #define DBG_WARNING 1
  85. #define DBG_ERROR 2
  86. #define DBG_FATAL 3
  87. #define DBG_ALWAYS 99
  88. //
  89. // debug control flags - these flags control where the debug output goes (file,
  90. // debugger, console) and how it is formatted
  91. //
  92. #define DBG_THREAD_INFO 0x00000001 // dump the thread id
  93. #define DBG_CALL_DEPTH 0x00000002 // dump the call level
  94. #define DBG_ENTRY_TIME 0x00000004 // dump the local time when the function is called
  95. #define DBG_PARAMETER_LIST 0x00000008 // dump the parameter list
  96. #define DBG_TO_DEBUGGER 0x00000010 // output via OutputDebugString()
  97. #define DBG_TO_CONSOLE 0x00000020 // output via printf()
  98. #define DBG_TO_FILE 0x00000040 // output via fprintf()
  99. #define DBG_FLUSH_OUTPUT 0x00000080 // fflush() after every fprintf()
  100. #define DBG_INDENT_DUMP 0x00000100 // indent dumped data to current level
  101. #define DBG_SEPARATE_APIS 0x00000200 // empty line after leaving each API
  102. #define DBG_AT_ERROR_LEVEL 0x00000400 // always output diagnostics >= InternetDebugErrorLevel
  103. #define DBG_NO_ASSERT_BREAK 0x00000800 // don't call DebugBreak() in InternetAssert()
  104. #define DBG_DUMP_LENGTH 0x00001000 // dump length information when dumping data
  105. #define DBG_NO_LINE_NUMBER 0x00002000 // don't dump line number info
  106. #define DBG_APPEND_FILE 0x00004000 // append to the log file (default is truncate)
  107. #define DBG_LEVEL_INDICATOR 0x00008000 // dump error level indicator (E for Error, etc.)
  108. #define DBG_DUMP_API_DATA 0x00010000 // dump data at API level (InternetReadFile(), etc.)
  109. #define DBG_DELTA_TIME 0x00020000 // dump times as millisecond delta if DBG_ENTRY_TIME
  110. #define DBG_CUMULATIVE_TIME 0x00040000 // dump delta time from start of trace if DBG_ENTRY_TIME
  111. #define DBG_FIBER_INFO 0x00080000 // dump the fiber address if DBG_THREAD_INFO
  112. #define DBG_THREAD_INFO_ADR 0x00100000 // dump INTERNET_THREAD_INFO address if DBG_THREAD_INFO
  113. #define DBG_ARB_ADDR 0x00200000 // dump ARB address if DBG_THREAD_INFO
  114. #define DBG_ASYNC_ID 0x00400000 // dump async ID
  115. #define DBG_REQUEST_HANDLE 0x00800000 // dump request handle
  116. #define DBG_TRIGGER_ON 0x10000000 // function is an enabling trigger
  117. #define DBG_TRIGGER_OFF 0x20000000 // function is a disabling trigger
  118. #define DBG_NO_DATA_DUMP 0x40000000 // turn off all data dumping
  119. #define DBG_NO_DEBUG 0x80000000 // turn off all debugging
  120. //
  121. // debug category flags - these control what category of information is output
  122. //
  123. #define DBG_NOTHING 0x00000000 // internal
  124. #define DBG_REGISTRY 0x00000001 //
  125. #define DBG_TRANS 0x00000002 //
  126. #define DBG_BINDING 0x00000004 //
  127. #define DBG_STORAGE 0x00000008 //
  128. #define DBG_TRANSDAT 0x00000010 //
  129. #define DBG_API 0x00000020 //
  130. #define DBG_DOWNLOAD 0x00000040 //
  131. #define DBG_APP 0x00000080 //
  132. #define DBG_MONIKER 0x00000100 //
  133. #define DBG_TRANSMGR 0x00000200 //
  134. #define DBG_CALLBACK 0x00000400 //
  135. #define DBG_19 0x00000800 //
  136. #define DBG_18 0x00001000 //
  137. #define DBG_17 0x00002000 //
  138. #define DBG_16 0x00004000 //
  139. #define DBG_15 0x00008000 //
  140. #define DBG_14 0x00010000 //
  141. #define DBG_13 0x00020000 //
  142. #define DBG_12 0x00040000 //
  143. #define DBG_11 0x00080000 //
  144. #define DBG_10 0x00100000 //
  145. #define DBG_9 0x00200000 //
  146. #define DBG_8 0x00400000 //
  147. #define DBG_7 0x00800000 //
  148. #define DBG_6 0x01000000 //
  149. #define DBG_5 0x02000000 //
  150. #define DBG_4 0x04000000 //
  151. #define DBG_3 0x08000000 //
  152. #define DBG_2 0x10000000 //
  153. #define DBG_1 0x20000000 //
  154. #define DBG_ANY 0xFFFFFFFF //
  155. //
  156. // _DEBUG_URLMON_FUNC_RECORD - for each thread, we maintain a LIFO stack of these,
  157. // describing the functions we have visited
  158. //
  159. typedef struct _DEBUG_URLMON_FUNC_RECORD {
  160. //
  161. // Stack - a LIFO stack of debug records is maintained in the debug version
  162. // of the INTERNET_THREAD_INFO
  163. //
  164. struct _DEBUG_URLMON_FUNC_RECORD* Stack;
  165. //
  166. // Category - the function's category flag(s)
  167. //
  168. DWORD Category;
  169. //
  170. // ReturnType - type of value returned by function
  171. //
  172. DEBUG_FUNCTION_RETURN_TYPE ReturnType;
  173. //
  174. // Function - name of the function
  175. //
  176. LPCSTR Function;
  177. //
  178. // LastTime - if we are dumping times as deltas, keeps the last tick count
  179. //
  180. DWORD LastTime;
  181. } DEBUG_URLMON_FUNC_RECORD, *LPDEBUG_URLMON_FUNC_RECORD;
  182. //
  183. // data
  184. //
  185. extern DWORD InternetDebugErrorLevel;
  186. extern DWORD InternetDebugControlFlags;
  187. extern DWORD InternetDebugCategoryFlags;
  188. extern DWORD InternetDebugBreakFlags;
  189. //
  190. // prototypes
  191. //
  192. //
  193. // inetdbg.cxx
  194. //
  195. VOID
  196. InternetDebugInitialize(
  197. VOID
  198. );
  199. VOID
  200. InternetDebugTerminate(
  201. VOID
  202. );
  203. BOOL
  204. InternetOpenDebugFile(
  205. VOID
  206. );
  207. BOOL
  208. InternetReopenDebugFile(
  209. IN LPSTR Filename
  210. );
  211. VOID
  212. InternetCloseDebugFile(
  213. VOID
  214. );
  215. VOID
  216. InternetFlushDebugFile(
  217. VOID
  218. );
  219. VOID
  220. InternetDebugSetControlFlags(
  221. IN DWORD dwFlags
  222. );
  223. VOID
  224. InternetDebugResetControlFlags(
  225. IN DWORD dwFlags
  226. );
  227. VOID
  228. InternetDebugEnter(
  229. IN DWORD Category,
  230. IN DEBUG_FUNCTION_RETURN_TYPE ReturnType,
  231. IN LPCSTR Function,
  232. IN LPCSTR ParameterList,
  233. IN ...
  234. );
  235. VOID
  236. InternetDebugLeave(
  237. IN DWORD_PTR Variable,
  238. IN LPCSTR Filename,
  239. IN DWORD LineNumber
  240. );
  241. VOID
  242. InternetDebugError(
  243. IN DWORD Error
  244. );
  245. VOID
  246. InternetDebugPrint(
  247. IN LPSTR Format,
  248. ...
  249. );
  250. VOID
  251. InternetDebugPrintValist(
  252. IN LPSTR Format,
  253. IN va_list valist
  254. );
  255. VOID
  256. InternetDebugPrintf(
  257. IN LPSTR Format,
  258. IN ...
  259. );
  260. VOID
  261. InternetDebugOut(
  262. IN LPSTR Buffer,
  263. IN BOOL Assert
  264. );
  265. VOID
  266. InternetDebugDump(
  267. IN LPSTR Text,
  268. IN LPBYTE Address,
  269. IN DWORD Size
  270. );
  271. DWORD
  272. InternetDebugDumpFormat(
  273. IN LPBYTE Address,
  274. IN DWORD Size,
  275. IN DWORD ElementSize,
  276. OUT LPSTR Buffer
  277. );
  278. VOID
  279. InternetAssert(
  280. IN LPSTR Condition,
  281. IN LPSTR Filename,
  282. IN DWORD LineNumber
  283. );
  284. VOID
  285. InternetGetDebugVariable(
  286. IN LPSTR lpszVariableName,
  287. OUT LPDWORD lpdwVariable
  288. );
  289. LPSTR
  290. InternetMapError(
  291. IN DWORD Error
  292. );
  293. int dprintf(char *, ...);
  294. LPSTR
  295. SourceFilename(
  296. LPSTR Filespec
  297. );
  298. VOID
  299. InitSymLib(
  300. VOID
  301. );
  302. VOID
  303. TermSymLib(
  304. VOID
  305. );
  306. LPSTR
  307. GetDebugSymbol(
  308. DWORD Address,
  309. LPDWORD Offset
  310. );
  311. VOID
  312. x86SleazeCallStack(
  313. OUT LPVOID * lplpvStack,
  314. IN DWORD dwStackCount,
  315. IN LPVOID * Ebp
  316. );
  317. VOID
  318. x86SleazeCallersAddress(
  319. LPVOID* pCaller,
  320. LPVOID* pCallersCaller
  321. );
  322. #else //ENABLE_DEBUG
  323. #define dprintf (VOID)
  324. #endif //ENABLE_DEBUG
  325. //
  326. // macros
  327. //
  328. #ifdef ENABLE_DEBUG
  329. //
  330. // INET_DEBUG_START - initialize debugging support
  331. //
  332. #define INET_DEBUG_START() \
  333. InternetDebugInitialize()
  334. //
  335. // INET_DEBUG_FINISH - terminate debugging support
  336. //
  337. #define INET_DEBUG_FINISH() \
  338. InternetDebugTerminate()
  339. //
  340. // INET_ASSERT - The standard assert, redefined here because Win95 doesn't have
  341. // RtlAssert
  342. //
  343. #if defined(DISABLE_ASSERTS)
  344. #define INET_ASSERT(test) \
  345. /* NOTHING */
  346. #else // defined(DISABLE_ASSERTS)
  347. #define INET_ASSERT(test) \
  348. do if (!(test)) { \
  349. InternetAssert(#test, __FILE__, __LINE__); \
  350. } while (0)
  351. #endif // defined(DISABLE_ASSERTS)
  352. #else // end #ifdef ENABLE_DEBUG
  353. #define INET_DEBUG_START() \
  354. /* NOTHING */
  355. #define INET_DEBUG_FINISH() \
  356. /* NOTHING */
  357. #define INET_ASSERT(test) \
  358. do { } while(0) /* NOTHING */
  359. #endif // end #ifndef ENABLE_DEBUG
  360. //
  361. // INET_DEBUG_ASSERT - assert only if INET_DEBUG is set
  362. //
  363. #if INET_DEBUG
  364. #define INET_DEBUG_ASSERT(cond) INET_ASSERT(cond)
  365. #else
  366. #define INET_DEBUG_ASSERT(cond) /* NOTHING */
  367. #endif
  368. #if INET_DEBUG
  369. //
  370. // IF_DEBUG_CODE - always on if INET_DEBUG is set
  371. //
  372. #define IF_DEBUG_CODE() \
  373. if (1)
  374. //
  375. // IF_DEBUG - only execute following code if the specific flag is set
  376. //
  377. #define IF_DEBUG(x) \
  378. if (InternetDebugCategoryFlags & DBG_ ## x)
  379. //
  380. // IF_DEBUG_CONTROL - only execute if control flag is set
  381. //
  382. #define IF_DEBUG_CONTROL(x) \
  383. if (InternetDebugControlFlags & DBG_ ## x)
  384. //
  385. // DEBUG_ENTER - creates an INTERNET_DEBUG_RECORD for this function
  386. //
  387. #if defined(RETAIL_LOGGING)
  388. #define DEBUG_ENTER(ParameterList) \
  389. /* NOTHING */
  390. #define DEBUG_ENTER_API(ParameterList) \
  391. InternetDebugEnter ParameterList
  392. #else // defined(RETAIL_LOGGING)
  393. #define DEBUG_ENTER_API DEBUG_ENTER
  394. #define DEBUG_ENTER(ParameterList) \
  395. InternetDebugEnter ParameterList
  396. #endif // defined(RETAIL_LOGGING)
  397. //
  398. // DEBUG_LEAVE - destroys this function's INTERNET_DEBUG_RECORD
  399. //
  400. #if defined(RETAIL_LOGGING)
  401. #define DEBUG_LEAVE(Variable) \
  402. /* NOTHING */
  403. #define DEBUG_LEAVE_API(Variable) \
  404. InternetDebugLeave((DWORD_PTR)Variable, __FILE__, __LINE__)
  405. #else // defined(RETAIL_LOGGING)
  406. #define DEBUG_LEAVE_API DEBUG_LEAVE
  407. #define DEBUG_LEAVE(Variable) \
  408. InternetDebugLeave((DWORD_PTR)Variable, __FILE__, __LINE__)
  409. #endif // defined(RETAIL_LOGGING)
  410. //
  411. // DEBUG_ERROR - displays an error and its symbolic name
  412. //
  413. #define DEBUG_ERROR(Category, Error) \
  414. if (InternetDebugCategoryFlags & DBG_ ## Category) { \
  415. InternetDebugError(Error); \
  416. }
  417. //
  418. // DEBUG_PRINT - print debug info if we are at the correct level or we are
  419. // requested to always dump information at, or above, InternetDebugErrorLevel
  420. //
  421. #if defined(RETAIL_LOGGING)
  422. #define DEBUG_PRINT(Category, ErrorLevel, Args) \
  423. /* NOTHING */
  424. #define DEBUG_PRINT_API(Category, ErrorLevel, Args) \
  425. if (((InternetDebugCategoryFlags & DBG_ ## Category) \
  426. && (DBG_ ## ErrorLevel >= InternetDebugErrorLevel)) \
  427. || ((InternetDebugControlFlags & DBG_AT_ERROR_LEVEL) \
  428. && (DBG_ ## ErrorLevel >= InternetDebugErrorLevel))) { \
  429. InternetDebugPrint Args; \
  430. }
  431. #else // defined(RETAIL_LOGGING)
  432. #define DEBUG_PRINT_API DEBUG_PRINT
  433. #define DEBUG_PRINT(Category, ErrorLevel, Args) \
  434. if (((InternetDebugCategoryFlags & DBG_ ## Category) \
  435. && (DBG_ ## ErrorLevel >= InternetDebugErrorLevel)) \
  436. || ((InternetDebugControlFlags & DBG_AT_ERROR_LEVEL) \
  437. && (DBG_ ## ErrorLevel >= InternetDebugErrorLevel))) { \
  438. InternetDebugPrint Args; \
  439. }
  440. #endif // defined(RETAIL_LOGGING)
  441. //
  442. // DEBUG_PUT - prints formatted string to debug output stream
  443. //
  444. #if defined(RETAIL_LOGGING)
  445. #define DEBUG_PUT(Args) \
  446. /* NOTHING */
  447. #else // defined(RETAIL_LOGGING)
  448. #define DEBUG_PUT(Args) \
  449. InternetDebugPrintf Args
  450. #endif // defined(RETAIL_LOGGING)
  451. //
  452. // DEBUG_DUMP - dump data
  453. //
  454. #if defined(RETAIL_LOGGING)
  455. #define DEBUG_DUMP(Category, Text, Address, Length) \
  456. /* NOTHING */
  457. #define DEBUG_DUMP_API(Category, Text, Address, Length) \
  458. if (InternetDebugCategoryFlags & DBG_ ## Category) { \
  459. InternetDebugDump(Text, (LPBYTE)Address, Length); \
  460. }
  461. #else // defined(RETAIL_LOGGING)
  462. #define DEBUG_DUMP_API DEBUG_DUMP
  463. #define DEBUG_DUMP(Category, Text, Address, Length) \
  464. if (InternetDebugCategoryFlags & DBG_ ## Category) { \
  465. InternetDebugDump(Text, (LPBYTE)Address, Length); \
  466. }
  467. #endif // defined(RETAIL_LOGGING)
  468. //
  469. // DEBUG_BREAK - break into debugger if break flag is set for this module
  470. //
  471. #define DEBUG_BREAK(Module) \
  472. if (InternetDebugBreakFlags & DBG_ ## Module) { \
  473. InternetDebugPrintf("Breakpoint. File %s Line %d\n", \
  474. __FILE__, \
  475. __LINE__ \
  476. ); \
  477. DebugBreak(); \
  478. }
  479. //
  480. // WAIT_FOR_SINGLE_OBJECT - perform WaitForSingleObject and check we didn't
  481. // get a timeout
  482. //
  483. #define WAIT_FOR_SINGLE_OBJECT(Object, Error) \
  484. Error = WaitForSingleObject((Object), DEBUG_WAIT_TIME); \
  485. if (Error == WAIT_TIMEOUT) { \
  486. InternetDebugPrintf("single object timeout\n"); \
  487. DebugBreak(); \
  488. }
  489. //
  490. // DEBUG_WAIT_TIMER - create DWORD variable for holding time
  491. //
  492. #define DEBUG_WAIT_TIMER(TimerVar) \
  493. DWORD TimerVar
  494. //
  495. // DEBUG_START_WAIT_TIMER - get current tick count
  496. //
  497. #define DEBUG_START_WAIT_TIMER(TimerVar) \
  498. TimerVar = GetTickCountWrap()
  499. //
  500. // DEBUG_CHECK_WAIT_TIMER - get the current number of ticks, subtract from the
  501. // previous value recorded by DEBUG_START_WAIT_TIMER and break to debugger if
  502. // outside the predefined range
  503. //
  504. #define DEBUG_CHECK_WAIT_TIMER(TimerVar, MilliSeconds) \
  505. TimerVar = (GetTickCountWrap() - TimerVar); \
  506. if (TimerVar > MilliSeconds) { \
  507. InternetDebugPrintf("Wait time (%d mSecs) exceeds acceptable value (%d mSecs)\n", \
  508. TimerVar, \
  509. MilliSeconds \
  510. ); \
  511. DebugBreak(); \
  512. }
  513. #define DEBUG_DATA(Type, Name, InitialValue) \
  514. Type Name = InitialValue
  515. #define DEBUG_DATA_EXTERN(Type, Name) \
  516. extern Type Name
  517. #define DEBUG_LABEL(label) \
  518. label:
  519. #define DEBUG_GOTO(label) \
  520. goto label
  521. #define DEBUG_ONLY(x) \
  522. x
  523. #if defined(i386)
  524. #define GET_CALLERS_ADDRESS(p, pp) x86SleazeCallersAddress(p, pp)
  525. #define GET_CALL_STACK(p) x86SleazeCallStack((LPVOID *)&p, ARRAY_ELEMENTS(p), 0)
  526. #else // defined(i386)
  527. #define GET_CALLERS_ADDRESS(p, pp)
  528. #define GET_CALL_STACK(p)
  529. #endif // defined(i386)
  530. #else // end #if INET_DEBUG
  531. #define IF_DEBUG_CODE() \
  532. if (0)
  533. #define IF_DEBUG(x) \
  534. if (0)
  535. #define IF_DEBUG_CONTROL(x) \
  536. if (0)
  537. #define DEBUG_ENTER(ParameterList) \
  538. /* NOTHING */
  539. #define DEBUG_ENTER_API(ParameterList) \
  540. /* NOTHING */
  541. #define DEBUG_LEAVE(Variable) \
  542. /* NOTHING */
  543. #define DEBUG_LEAVE_API(Variable) \
  544. /* NOTHING */
  545. #define DEBUG_ERROR(Category, Error) \
  546. /* NOTHING */
  547. #define DEBUG_PRINT(Category, ErrorLevel, Args) \
  548. /* NOTHING */
  549. #define DEBUG_PRINT_API(Category, ErrorLevel, Args) \
  550. /* NOTHING */
  551. #define DEBUG_PUT(Args) \
  552. /* NOTHING */
  553. #define DEBUG_DUMP(Category, Text, Address, Length) \
  554. /* NOTHING */
  555. #define DEBUG_DUMP_API(Category, Text, Address, Length) \
  556. /* NOTHING */
  557. #define DEBUG_BREAK(module) \
  558. /* NOTHING */
  559. #define WAIT_FOR_SINGLE_OBJECT(Object, Error) \
  560. Error = WaitForSingleObject((Object), INFINITE)
  561. #define DEBUG_WAIT_TIMER(TimerVar) \
  562. /* NOTHING */
  563. #define DEBUG_START_WAIT_TIMER(TimerVar) \
  564. /* NOTHING */
  565. #define DEBUG_CHECK_WAIT_TIMER(TimerVar, MilliSeconds) \
  566. /* NOTHING */
  567. #define DEBUG_DATA(Type, Name, InitialValue) \
  568. /* NOTHING */
  569. #define DEBUG_DATA_EXTERN(Type, Name) \
  570. /* NOTHING */
  571. #define DEBUG_LABEL(label) \
  572. /* NOTHING */
  573. #define DEBUG_GOTO(label) \
  574. /* NOTHING */
  575. #define DEBUG_ONLY(x) \
  576. /* NOTHING */
  577. #endif // INET_DEBUG
  578. #if defined(__cplusplus)
  579. }
  580. #endif
  581. #endif //ifndef _INETDBG_H_