windows-nt/Source/XPSP1/NT/sdktools/debuggers/ntsd64/dbgsym.hpp

291 lines
7.2 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//----------------------------------------------------------------------------
//
// Symbol interface implementations.
//
// Copyright (C) Microsoft Corporation, 2000.
//
//----------------------------------------------------------------------------
#ifndef __DBGSYM_HPP__
#define __DBGSYM_HPP__
//
// DEBUG_SYMBOL_PARAMETERS_INTERNAL Flags
//
// SYMF_REGISTER; SYMF_FRAMEREL; SYMF_REGREL
#define ADDRESS_TRANSLATION_MASK (SYMF_REGISTER | SYMF_FRAMEREL | SYMF_REGREL)
#define SYMBOL_SCOPE_MASK (SYMF_PARAMETER | SYMF_LOCAL)
// DBG_DUMP_FIELD_STRING 0xf0000
#define STRING_DUMP_MASK DBG_DUMP_FIELD_STRING
// TypeName
#define TYPE_NAME_VALID 0x100
#define TYPE_NAME_USED 0x200
#define TYPE_NAME_CHANGED 0x400
#define TYPE_NAME_MASK 0xf00
// Used for locals when locals are added on change of scope
#define SYMBOL_IS_IN_SCOPE 0x1000
#define SYMBOL_IS_EXPRESSION 0x2000
#define SYMBOL_IS_EXTENSION 0x4000
typedef struct DEBUG_SYMBOL_PARAMETERS_INTERNAL {
DEBUG_SYMBOL_PARAMETERS External;
ULONG64 Address;
ULONG64 Offset;
ULONG Register;
ULONG Flags;
ANSI_STRING Name;
ULONG SymbolIndex;
ULONG TypeIndex;
ULONG Size;
// Deatails for eapanding this symbol
BOOL Expanded;
ULONG64 ExpandTypeAddress;
ULONG ExpandTypeIndex;
PVOID DataBuffer; // For extensions support
// Use a fixed size array for type name
// TYPE_NAME_VALID is unset for larger / unavailable names.
// TYPE_NAME_USED is set when this name is used to type-cast the symbol
CHAR TypeName[64];
ULONG64 Mask; // For bitfields
USHORT Shift;
DEBUG_SYMBOL_PARAMETERS_INTERNAL *Parent;
DEBUG_SYMBOL_PARAMETERS_INTERNAL *Next;
} DEBUG_SYMBOL_PARAMETERS_INTERNAL, *PDEBUG_SYMBOL_PARAMETERS_INTERNAL;
//----------------------------------------------------------------------------
//
// DebugSymbolGroup.
//
//----------------------------------------------------------------------------
#define MAX_DISPLAY_NAME 256 // Not MAX_NAME
class DebugSymbolGroup : public IDebugSymbolGroup
{
public:
DebugSymbolGroup(DebugClient *CreatedBy, ULONG ScopeGroup);
DebugSymbolGroup(DebugClient *CreatedBy);
~DebugSymbolGroup(void);
// IUnknown.
STDMETHOD(QueryInterface)(
THIS_
IN REFIID InterfaceId,
OUT PVOID* Interface
);
STDMETHOD_(ULONG, AddRef)(
THIS
);
STDMETHOD_(ULONG, Release)(
THIS
);
// IDebugSymbolGroup.
STDMETHOD(ShowAll)(
THIS_
);
STDMETHOD(GetNumberSymbols)(
THIS_
OUT PULONG Number
);
STDMETHOD(AddSymbol)(
THIS_
IN PCSTR Name,
OUT PULONG Index
);
STDMETHOD(RemoveSymbolByName)(
THIS_
IN PCSTR Name
);
STDMETHOD(RemoveSymbolByIndex)(
THIS_
IN ULONG Index
);
STDMETHOD(GetSymbolName)(
THIS_
IN ULONG Index,
OUT OPTIONAL PSTR Buffer,
IN ULONG BufferSize,
OUT OPTIONAL PULONG NameSize
);
STDMETHOD(GetSymbolParameters)(
THIS_
IN ULONG Start,
IN ULONG Count,
OUT /* size_is(Count) */ PDEBUG_SYMBOL_PARAMETERS Params
);
STDMETHOD(ExpandSymbol)(
THIS_
IN ULONG Index,
IN BOOL Expand
);
STDMETHOD(OutputSymbols)(
THIS_
IN ULONG OutputControl,
IN ULONG Flags,
IN ULONG Start,
IN ULONG Count
);
STDMETHOD(WriteSymbol)(
THIS_
IN ULONG Index,
IN PCSTR Value
);
STDMETHOD(OutputAsType)(
THIS_
IN ULONG Index,
IN PCSTR Type
);
private:
ULONG m_Refs;
BOOL m_Locals;
ULONG m_ScopeGroup;
ULONG m_NumParams;
PDEBUG_SYMBOL_PARAMETERS_INTERNAL m_pSymParams;
DebugClient *m_pCreatedBy;
BOOL m_LastClassExpanded;
ULONG m_thisAdjust; // ThisAdjust value for this pointer in class function scope
PDEBUG_SYMBOL_PARAMETERS_INTERNAL
LookupSymbolParameter(
IN ULONG Index
);
PDEBUG_SYMBOL_PARAMETERS_INTERNAL
LookupSymbolParameter(
IN PCSTR Name
);
HRESULT AddOneSymbol(
IN PCSTR Name,
IN OPTIONAL PSYMBOL_INFO pSymInfo,
OUT PULONG Index
);
VOID ResetIndex(
IN PDEBUG_SYMBOL_PARAMETERS_INTERNAL Start,
IN ULONG StartIndex
);
ULONG AddSymbolParameters(
IN ULONG Index,
IN ULONG Count,
IN PDEBUG_SYMBOL_PARAMETERS_INTERNAL SymbolParam
);
ULONG DeleteSymbolParam(
IN ULONG Index,
IN ULONG Count
);
BOOL IsRootSymbol (
IN ULONG Index
);
ULONG FindSortedIndex (
IN PCSTR Name,
IN BOOL IsArg,
IN ULONG64 Address
);
HRESULT ResetCurrentLocals();
HRESULT AddCurrentLocals();
void KeepLastScopeClass(
IN PDEBUG_SYMBOL_PARAMETERS_INTERNAL Sym_this,
IN PCHAR ExpansionState,
IN ULONG NumChilds
);
HRESULT ExpandSymPri(
THIS_
IN ULONG Index,
IN BOOL Expand
);
static BOOL CALLBACK AddLocals(
PSYMBOL_INFO pSymInfo,
ULONG Size,
PVOID Context
);
HRESULT FindChildren(
PDEBUG_SYMBOL_PARAMETERS_INTERNAL pParentSym,
PDEBUG_SYMBOL_PARAMETERS_INTERNAL *pChildren,
PULONG pChildCount,
PCHAR *pChildNames
);
};
typedef struct _ADDLOCALS_CTXT {
DebugSymbolGroup *pGrp;
} ADDLOCALS_CTXT;
BOOL
GetThisAdjustForCurrentScope(
PULONG thisAdjust
);
//
// Generated structs / entensions / extension function as DebugSymbolgroup
//
typedef enum _DGS_FIELD_TYPE {
DGS_FldDefault,
DGS_FldPointer,
DGS_FldBit,
} DGS_FIELD_TYPE;
typedef struct _DBG_GENERATED_STRUCT_FIELDS {
PCHAR Name;
ULONG Offset;
ULONG Size;
DGS_FIELD_TYPE Type;
ULONG64 BitMask;
USHORT BitShift;
PCHAR StructType; // If the filed has some subtypes,
// This points to Name in the struct array
} DBG_GENERATED_STRUCT_FIELDS, *PDBG_GENERATED_STRUCT_FIELDS;
typedef enum _DGS_TYPE {
DGS_DefaultStruct,
DGS_EFN,
DGS_Extension
} DGS_TYPE;
typedef struct _DBG_GENERATED_STRUCT_INFO {
ULONG Id;
PCHAR Name;
ULONG Size;
DGS_TYPE Type;
ULONG NumFields;
PDBG_GENERATED_STRUCT_FIELDS Fields; // Last member must have NULL name.
} DBG_GENERATED_STRUCT_INFO, *PDBG_GENERATED_STRUCT_INFO;
//
// Extension function to let debugger know about any generated sturct
//
// pGenStructs: This contains array of DBG_GENERATED_STRUCT_INFO
// for any generated structs the extension wants to support
// Last member should have NULL name.
//
// Following should be defined and exported from extension dlls for this purpose:
//
// BOOL _EFN_GetGeneratedStructInfo(PDEBUG_CLIENT Client, PDBG_GENERATED_STRUCT_INFO pGenStructs);
//
typedef BOOL
(WINAPI *EXT_GENERATED_STRUCT_INFO)(
PDEBUG_CLIENT Client,
PDBG_GENERATED_STRUCT_INFO *pGenStructs
);
#endif // #ifndef __DBGSYM_HPP__