|
|
//----------------------------------------------------------------------------
//
// 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__
|