DRWATSON.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1993  Microsoft Corporation
  3. Module Name:
  4.     drwatson.h
  5. Abstract:
  6.     Common header file for drwatson data structures.
  7. Author:
  8.     Wesley Witt (wesw) 1-May-1993
  9. Environment:
  10.     User Mode
  11. --*/
  12. #include <imagehlp.h>
  13. typedef struct _tagOPTIONS {
  14.     CHAR                        szLogPath[MAX_PATH];
  15.     CHAR                        szWaveFile[MAX_PATH];
  16.     CHAR                        szCrashDump[MAX_PATH];
  17.     BOOL                        fDumpSymbols;
  18.     BOOL                        fDumpAllThreads;
  19.     BOOL                        fAppendToLogFile;
  20.     BOOL                        fVisual;
  21.     BOOL                        fSound;
  22.     BOOL                        fCrash;
  23.     DWORD                       dwInstructions;
  24.     DWORD                       dwMaxCrashes;
  25. } OPTIONS, *POPTIONS;
  26. typedef struct _tagCRASHES {
  27.     char                        szAppName[256];
  28.     char                        szFunction[256];
  29.     SYSTEMTIME                  time;
  30.     DWORD                       dwExceptionCode;
  31.     DWORD                       dwAddress;
  32. } CRASHES, *PCRASHES;
  33. typedef struct _tagCRASHINFO {
  34.     HWND       hList;
  35.     CRASHES    crash;
  36.     HDC        hdc;
  37.     DWORD      cxExtent;
  38.     DWORD      dwIndex;
  39.     DWORD      dwIndexDesired;
  40.     char       *pCrashData;
  41.     DWORD      dwCrashDataSize;
  42. } CRASHINFO, *PCRASHINFO;
  43. typedef struct _tagTHREADCONTEXT {
  44.     LIST_ENTRY                   ThreadList;
  45.     HANDLE                       hThread;
  46.     DWORD                        dwThreadId;
  47.     DWORD                        pc;
  48.     DWORD                        frame;
  49.     DWORD                        stack;
  50.     CONTEXT                      context;
  51.     DWORD                        stackBase;
  52.     DWORD                        stackRA;
  53.     BOOL                         fFaultingContext;
  54. } THREADCONTEXT, *PTHREADCONTEXT;
  55. typedef struct _tagDEBUGPACKET {
  56.     HWND                    hwnd;
  57.     HANDLE                  hEvent;
  58.     OPTIONS                 options;
  59.     DWORD                   dwPidToDebug;
  60.     HANDLE                  hEventToSignal;
  61.     HANDLE                  hProcess;
  62.     DWORD                   dwProcessId;
  63.     LIST_ENTRY              ThreadList;
  64.     PTHREADCONTEXT          tctx;
  65.     DWORD                   stackBase;
  66.     DWORD                   stackRA;
  67.     DEBUG_EVENT             DebugEvent;
  68. } DEBUGPACKET, *PDEBUGPACKET;
  69. typedef BOOL (CALLBACK* CRASHESENUMPROC)(PCRASHINFO);
  70. #if DBG
  71. #define Assert(exp)    if(!(exp)) {AssertError(#exp,__FILE__,__LINE__);}
  72. #else
  73. #define Assert(exp)
  74. #endif
  75. #define WM_DUMPCOMPLETE       WM_USER+500
  76. #define WM_EXCEPTIONINFO      WM_USER+501
  77. #define WM_ATTACHCOMPLETE     WM_USER+502
  78. extern PIMAGEHLP_SYMBOL sym;
  79. extern char szApp[MAX_PATH];
  80. #if defined(i386)
  81. #define BP_SIZE 1
  82. #define PC(C) ((C)->Eip)
  83. #elif defined(PPC)
  84. #define BP_SIZE 4
  85. #define PC(C) ((C)->Iar)
  86. #elif defined(MIPS)
  87. #define BP_SIZE 4
  88. #define PC(C) ((C)->Fir)
  89. #elif defined(ALPHA)
  90. #define BP_SIZE 4
  91. #define PC(C) ((C)->Fir)
  92. #else
  93. #error "Unknown target CPU"
  94. #endif
  95. //  **** From ntddk.h
  96. //
  97. //  Doubly-linked list manipulation routines.  Implemented as macros
  98. //  but logically these are procedures.
  99. //
  100. //
  101. //  VOID
  102. //  InitializeListHead(
  103. //      PLIST_ENTRY ListHead
  104. //      );
  105. //
  106. #define InitializeListHead(ListHead) (
  107.     (ListHead)->Flink = (ListHead)->Blink = (ListHead))
  108. //
  109. //  BOOLEAN
  110. //  IsListEmpty(
  111. //      PLIST_ENTRY ListHead
  112. //      );
  113. //
  114. #define IsListEmpty(ListHead) 
  115.     ((ListHead)->Flink == (ListHead))
  116. //
  117. //  PLIST_ENTRY
  118. //  RemoveHeadList(
  119. //      PLIST_ENTRY ListHead
  120. //      );
  121. //
  122. #define RemoveHeadList(ListHead) 
  123.     (ListHead)->Flink;
  124.     {RemoveEntryList((ListHead)->Flink)}
  125. //
  126. //  PLIST_ENTRY
  127. //  RemoveTailList(
  128. //      PLIST_ENTRY ListHead
  129. //      );
  130. //
  131. #define RemoveTailList(ListHead) 
  132.     (ListHead)->Blink;
  133.     {RemoveEntryList((ListHead)->Blink)}
  134. //
  135. //  VOID
  136. //  RemoveEntryList(
  137. //      PLIST_ENTRY Entry
  138. //      );
  139. //
  140. #define RemoveEntryList(Entry) {
  141.     PLIST_ENTRY _EX_Blink;
  142.     PLIST_ENTRY _EX_Flink;
  143.     _EX_Flink = (Entry)->Flink;
  144.     _EX_Blink = (Entry)->Blink;
  145.     _EX_Blink->Flink = _EX_Flink;
  146.     _EX_Flink->Blink = _EX_Blink;
  147.     }
  148. //
  149. //  VOID
  150. //  InsertTailList(
  151. //      PLIST_ENTRY ListHead,
  152. //      PLIST_ENTRY Entry
  153. //      );
  154. //
  155. #define InsertTailList(ListHead,Entry) {
  156.     PLIST_ENTRY _EX_Blink;
  157.     PLIST_ENTRY _EX_ListHead;
  158.     _EX_ListHead = (ListHead);
  159.     _EX_Blink = _EX_ListHead->Blink;
  160.     (Entry)->Flink = _EX_ListHead;
  161.     (Entry)->Blink = _EX_Blink;
  162.     _EX_Blink->Flink = (Entry);
  163.     _EX_ListHead->Blink = (Entry);
  164.     }
  165. //
  166. //  VOID
  167. //  InsertHeadList(
  168. //      PLIST_ENTRY ListHead,
  169. //      PLIST_ENTRY Entry
  170. //      );
  171. //
  172. #define InsertHeadList(ListHead,Entry) {
  173.     PLIST_ENTRY _EX_Flink;
  174.     PLIST_ENTRY _EX_ListHead;
  175.     _EX_ListHead = (ListHead);
  176.     _EX_Flink = _EX_ListHead->Flink;
  177.     (Entry)->Flink = _EX_Flink;
  178.     (Entry)->Blink = _EX_ListHead;
  179.     _EX_Flink->Blink = (Entry);
  180.     _EX_ListHead->Flink = (Entry);
  181.     }
  182. //
  183. //
  184. //  PSINGLE_LIST_ENTRY
  185. //  PopEntryList(
  186. //      PSINGLE_LIST_ENTRY ListHead
  187. //      );
  188. //
  189. #define PopEntryList(ListHead) 
  190.     (ListHead)->Next;
  191.     {
  192.         PSINGLE_LIST_ENTRY FirstEntry;
  193.         FirstEntry = (ListHead)->Next;
  194.         if (FirstEntry != NULL) {     
  195.             (ListHead)->Next = FirstEntry->Next;
  196.         }                             
  197.     }
  198. //
  199. //  VOID
  200. //  PushEntryList(
  201. //      PSINGLE_LIST_ENTRY ListHead,
  202. //      PSINGLE_LIST_ENTRY Entry
  203. //      );
  204. //
  205. #define PushEntryList(ListHead,Entry) 
  206.     (Entry)->Next = (ListHead)->Next; 
  207.     (ListHead)->Next = (Entry)