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.

290 lines
7.2 KiB

  1. //----------------------------------------------------------------------------
  2. //
  3. // Symbol interface implementations.
  4. //
  5. // Copyright (C) Microsoft Corporation, 2000.
  6. //
  7. //----------------------------------------------------------------------------
  8. #ifndef __DBGSYM_HPP__
  9. #define __DBGSYM_HPP__
  10. //
  11. // DEBUG_SYMBOL_PARAMETERS_INTERNAL Flags
  12. //
  13. // SYMF_REGISTER; SYMF_FRAMEREL; SYMF_REGREL
  14. #define ADDRESS_TRANSLATION_MASK (SYMF_REGISTER | SYMF_FRAMEREL | SYMF_REGREL)
  15. #define SYMBOL_SCOPE_MASK (SYMF_PARAMETER | SYMF_LOCAL)
  16. // DBG_DUMP_FIELD_STRING 0xf0000
  17. #define STRING_DUMP_MASK DBG_DUMP_FIELD_STRING
  18. // TypeName
  19. #define TYPE_NAME_VALID 0x100
  20. #define TYPE_NAME_USED 0x200
  21. #define TYPE_NAME_CHANGED 0x400
  22. #define TYPE_NAME_MASK 0xf00
  23. // Used for locals when locals are added on change of scope
  24. #define SYMBOL_IS_IN_SCOPE 0x1000
  25. #define SYMBOL_IS_EXPRESSION 0x2000
  26. #define SYMBOL_IS_EXTENSION 0x4000
  27. typedef struct DEBUG_SYMBOL_PARAMETERS_INTERNAL {
  28. DEBUG_SYMBOL_PARAMETERS External;
  29. ULONG64 Address;
  30. ULONG64 Offset;
  31. ULONG Register;
  32. ULONG Flags;
  33. ANSI_STRING Name;
  34. ULONG SymbolIndex;
  35. ULONG TypeIndex;
  36. ULONG Size;
  37. // Deatails for eapanding this symbol
  38. BOOL Expanded;
  39. ULONG64 ExpandTypeAddress;
  40. ULONG ExpandTypeIndex;
  41. PVOID DataBuffer; // For extensions support
  42. // Use a fixed size array for type name
  43. // TYPE_NAME_VALID is unset for larger / unavailable names.
  44. // TYPE_NAME_USED is set when this name is used to type-cast the symbol
  45. CHAR TypeName[64];
  46. ULONG64 Mask; // For bitfields
  47. USHORT Shift;
  48. DEBUG_SYMBOL_PARAMETERS_INTERNAL *Parent;
  49. DEBUG_SYMBOL_PARAMETERS_INTERNAL *Next;
  50. } DEBUG_SYMBOL_PARAMETERS_INTERNAL, *PDEBUG_SYMBOL_PARAMETERS_INTERNAL;
  51. //----------------------------------------------------------------------------
  52. //
  53. // DebugSymbolGroup.
  54. //
  55. //----------------------------------------------------------------------------
  56. #define MAX_DISPLAY_NAME 256 // Not MAX_NAME
  57. class DebugSymbolGroup : public IDebugSymbolGroup
  58. {
  59. public:
  60. DebugSymbolGroup(DebugClient *CreatedBy, ULONG ScopeGroup);
  61. DebugSymbolGroup(DebugClient *CreatedBy);
  62. ~DebugSymbolGroup(void);
  63. // IUnknown.
  64. STDMETHOD(QueryInterface)(
  65. THIS_
  66. IN REFIID InterfaceId,
  67. OUT PVOID* Interface
  68. );
  69. STDMETHOD_(ULONG, AddRef)(
  70. THIS
  71. );
  72. STDMETHOD_(ULONG, Release)(
  73. THIS
  74. );
  75. // IDebugSymbolGroup.
  76. STDMETHOD(ShowAll)(
  77. THIS_
  78. );
  79. STDMETHOD(GetNumberSymbols)(
  80. THIS_
  81. OUT PULONG Number
  82. );
  83. STDMETHOD(AddSymbol)(
  84. THIS_
  85. IN PCSTR Name,
  86. OUT PULONG Index
  87. );
  88. STDMETHOD(RemoveSymbolByName)(
  89. THIS_
  90. IN PCSTR Name
  91. );
  92. STDMETHOD(RemoveSymbolByIndex)(
  93. THIS_
  94. IN ULONG Index
  95. );
  96. STDMETHOD(GetSymbolName)(
  97. THIS_
  98. IN ULONG Index,
  99. OUT OPTIONAL PSTR Buffer,
  100. IN ULONG BufferSize,
  101. OUT OPTIONAL PULONG NameSize
  102. );
  103. STDMETHOD(GetSymbolParameters)(
  104. THIS_
  105. IN ULONG Start,
  106. IN ULONG Count,
  107. OUT /* size_is(Count) */ PDEBUG_SYMBOL_PARAMETERS Params
  108. );
  109. STDMETHOD(ExpandSymbol)(
  110. THIS_
  111. IN ULONG Index,
  112. IN BOOL Expand
  113. );
  114. STDMETHOD(OutputSymbols)(
  115. THIS_
  116. IN ULONG OutputControl,
  117. IN ULONG Flags,
  118. IN ULONG Start,
  119. IN ULONG Count
  120. );
  121. STDMETHOD(WriteSymbol)(
  122. THIS_
  123. IN ULONG Index,
  124. IN PCSTR Value
  125. );
  126. STDMETHOD(OutputAsType)(
  127. THIS_
  128. IN ULONG Index,
  129. IN PCSTR Type
  130. );
  131. private:
  132. ULONG m_Refs;
  133. BOOL m_Locals;
  134. ULONG m_ScopeGroup;
  135. ULONG m_NumParams;
  136. PDEBUG_SYMBOL_PARAMETERS_INTERNAL m_pSymParams;
  137. DebugClient *m_pCreatedBy;
  138. BOOL m_LastClassExpanded;
  139. ULONG m_thisAdjust; // ThisAdjust value for this pointer in class function scope
  140. PDEBUG_SYMBOL_PARAMETERS_INTERNAL
  141. LookupSymbolParameter(
  142. IN ULONG Index
  143. );
  144. PDEBUG_SYMBOL_PARAMETERS_INTERNAL
  145. LookupSymbolParameter(
  146. IN PCSTR Name
  147. );
  148. HRESULT AddOneSymbol(
  149. IN PCSTR Name,
  150. IN OPTIONAL PSYMBOL_INFO pSymInfo,
  151. OUT PULONG Index
  152. );
  153. VOID ResetIndex(
  154. IN PDEBUG_SYMBOL_PARAMETERS_INTERNAL Start,
  155. IN ULONG StartIndex
  156. );
  157. ULONG AddSymbolParameters(
  158. IN ULONG Index,
  159. IN ULONG Count,
  160. IN PDEBUG_SYMBOL_PARAMETERS_INTERNAL SymbolParam
  161. );
  162. ULONG DeleteSymbolParam(
  163. IN ULONG Index,
  164. IN ULONG Count
  165. );
  166. BOOL IsRootSymbol (
  167. IN ULONG Index
  168. );
  169. ULONG FindSortedIndex (
  170. IN PCSTR Name,
  171. IN BOOL IsArg,
  172. IN ULONG64 Address
  173. );
  174. HRESULT ResetCurrentLocals();
  175. HRESULT AddCurrentLocals();
  176. void KeepLastScopeClass(
  177. IN PDEBUG_SYMBOL_PARAMETERS_INTERNAL Sym_this,
  178. IN PCHAR ExpansionState,
  179. IN ULONG NumChilds
  180. );
  181. HRESULT ExpandSymPri(
  182. THIS_
  183. IN ULONG Index,
  184. IN BOOL Expand
  185. );
  186. static BOOL CALLBACK AddLocals(
  187. PSYMBOL_INFO pSymInfo,
  188. ULONG Size,
  189. PVOID Context
  190. );
  191. HRESULT FindChildren(
  192. PDEBUG_SYMBOL_PARAMETERS_INTERNAL pParentSym,
  193. PDEBUG_SYMBOL_PARAMETERS_INTERNAL *pChildren,
  194. PULONG pChildCount,
  195. PCHAR *pChildNames
  196. );
  197. };
  198. typedef struct _ADDLOCALS_CTXT {
  199. DebugSymbolGroup *pGrp;
  200. } ADDLOCALS_CTXT;
  201. BOOL
  202. GetThisAdjustForCurrentScope(
  203. PULONG thisAdjust
  204. );
  205. //
  206. // Generated structs / entensions / extension function as DebugSymbolgroup
  207. //
  208. typedef enum _DGS_FIELD_TYPE {
  209. DGS_FldDefault,
  210. DGS_FldPointer,
  211. DGS_FldBit,
  212. } DGS_FIELD_TYPE;
  213. typedef struct _DBG_GENERATED_STRUCT_FIELDS {
  214. PCHAR Name;
  215. ULONG Offset;
  216. ULONG Size;
  217. DGS_FIELD_TYPE Type;
  218. ULONG64 BitMask;
  219. USHORT BitShift;
  220. PCHAR StructType; // If the filed has some subtypes,
  221. // This points to Name in the struct array
  222. } DBG_GENERATED_STRUCT_FIELDS, *PDBG_GENERATED_STRUCT_FIELDS;
  223. typedef enum _DGS_TYPE {
  224. DGS_DefaultStruct,
  225. DGS_EFN,
  226. DGS_Extension
  227. } DGS_TYPE;
  228. typedef struct _DBG_GENERATED_STRUCT_INFO {
  229. ULONG Id;
  230. PCHAR Name;
  231. ULONG Size;
  232. DGS_TYPE Type;
  233. ULONG NumFields;
  234. PDBG_GENERATED_STRUCT_FIELDS Fields; // Last member must have NULL name.
  235. } DBG_GENERATED_STRUCT_INFO, *PDBG_GENERATED_STRUCT_INFO;
  236. //
  237. // Extension function to let debugger know about any generated sturct
  238. //
  239. // pGenStructs: This contains array of DBG_GENERATED_STRUCT_INFO
  240. // for any generated structs the extension wants to support
  241. // Last member should have NULL name.
  242. //
  243. // Following should be defined and exported from extension dlls for this purpose:
  244. //
  245. // BOOL _EFN_GetGeneratedStructInfo(PDEBUG_CLIENT Client, PDBG_GENERATED_STRUCT_INFO pGenStructs);
  246. //
  247. typedef BOOL
  248. (WINAPI *EXT_GENERATED_STRUCT_INFO)(
  249. PDEBUG_CLIENT Client,
  250. PDBG_GENERATED_STRUCT_INFO *pGenStructs
  251. );
  252. #endif // #ifndef __DBGSYM_HPP__