|
|
//----------------------------------------------------------------------------
//
// Symbol interface implementations.
//
// Copyright (C) Microsoft Corporation, 2000-2002.
//
//----------------------------------------------------------------------------
#ifndef __DBGSYM_HPP__
#define __DBGSYM_HPP__
class DebugSymbolGroup; class SymbolGroupFormat;
//----------------------------------------------------------------------------
//
// SymbolGroupEntry.
//
//----------------------------------------------------------------------------
enum SymbolGroupFormatKind { SGFORMAT_TYPED_DATA, SGFORMAT_EXPRESSION, SGFORMAT_EXTENSION, SGFORMAT_TEXT, };
// Used for locals when locals are added on change of scope.
#define SYMBOL_IN_SCOPE 0x00000001
// This means another same-named symbol is in inner scope
// blocking this symbol. Although its still a valid member of
// local symbolgroup, but can't be seen by code at IP.
#define SYMBOL_ECLIPSED 0x00000002
class SymbolGroupEntry { public: SymbolGroupEntry(void); ~SymbolGroupEntry(void); SymbolGroupEntry* m_Parent; SymbolGroupEntry* m_Next; SymbolGroupFormat* m_Format;
PSTR m_Expr; PSTR m_Cast; DEBUG_SYMBOL_PARAMETERS m_Params; ULONG m_Flags; TypedData m_BaseData; SymbolGroupFormatKind m_BaseFormatKind; };
class SymbolGroupFormat { public: SymbolGroupFormat(SymbolGroupEntry* Entry, SymbolGroupFormatKind Kind); virtual ~SymbolGroupFormat(void);
virtual ULONG CreateChildren(DebugSymbolGroup* Group) = 0; virtual ULONG Refresh(TypedDataAccess AllowAccess) = 0; virtual ULONG Write(PCSTR Value) = 0; virtual void OutputValue(void) = 0; virtual void OutputOffset(void) = 0; virtual void OutputType(void) = 0; virtual void TestImages(void);
SymbolGroupEntry* m_Entry; SymbolGroupFormatKind m_Kind;
// If there's an expression error the basic
// expression could not be evaluated and this
// entry is just a placeholder for an error message.
ULONG m_ExprErr; // If there's a value error the basic expression
// was evaluated properly but the value could
// not be retrieved and is invalid. If m_ExprErr
// is set m_ValueErr should be set to match.
ULONG m_ValueErr; };
class TypedDataSymbolGroupFormat : public SymbolGroupFormat { public: TypedDataSymbolGroupFormat(SymbolGroupEntry* Entry) : SymbolGroupFormat(Entry, SGFORMAT_TYPED_DATA) {} TypedDataSymbolGroupFormat(SymbolGroupEntry* Entry, SymbolGroupFormatKind Kind) : SymbolGroupFormat(Entry, Kind) {} virtual ULONG CreateChildren(DebugSymbolGroup* Group); ULONG AddChild(SymbolGroupEntry** AddAfter, PSTR Name, TypedData* Data); static ULONG CreateChildrenCb(PVOID Context, PSTR Name, TypedData* Child); virtual ULONG Refresh(TypedDataAccess AllowAccess); virtual ULONG Write(PCSTR Value); virtual void OutputValue(void); virtual void OutputOffset(void); virtual void OutputType(void); virtual void TestImages(void);
SymbolGroupEntry* RefreshChildren(void); static ULONG RefreshChildrenCb(PVOID Context, PSTR Name, TypedData* Child); void UpdateParams(void); TypedData m_CastType; TypedData m_CastData; };
class ExprSymbolGroupFormat : public TypedDataSymbolGroupFormat { public: ExprSymbolGroupFormat(SymbolGroupEntry* Entry) : TypedDataSymbolGroupFormat(Entry, SGFORMAT_EXPRESSION) {} virtual ULONG Refresh(TypedDataAccess AllowAccess); };
class ExtSymbolGroupFormat : public SymbolGroupFormat { public: ExtSymbolGroupFormat(SymbolGroupEntry* Entry, DebugClient* Client); virtual ~ExtSymbolGroupFormat(void);
virtual ULONG CreateChildren(DebugSymbolGroup* Group); virtual ULONG Refresh(TypedDataAccess AllowAccess); virtual ULONG Write(PCSTR Value); virtual void OutputValue(void); virtual void OutputOffset(void); virtual void OutputType(void); DebugClient* m_Client; PSTR m_Output; };
class TextSymbolGroupFormat : public SymbolGroupFormat { public: TextSymbolGroupFormat(SymbolGroupEntry* Entry, PSTR Text, BOOL Own); virtual ~TextSymbolGroupFormat(void); virtual ULONG CreateChildren(DebugSymbolGroup* Group); virtual ULONG Refresh(TypedDataAccess AllowAccess); virtual ULONG Write(PCSTR Value); virtual void OutputValue(void); virtual void OutputOffset(void); virtual void OutputType(void); PSTR m_Text; BOOL m_Own; };
//----------------------------------------------------------------------------
//
// DebugSymbolGroup.
//
//----------------------------------------------------------------------------
class DebugSymbolGroup : public IDebugSymbolGroup { public: DebugSymbolGroup(DebugClient *CreatedBy, ULONG ScopeGroup); ~DebugSymbolGroup(void);
// IUnknown.
STDMETHOD(QueryInterface)( THIS_ IN REFIID InterfaceId, OUT PVOID* Interface ); STDMETHOD_(ULONG, AddRef)( THIS ); STDMETHOD_(ULONG, Release)( THIS );
// IDebugSymbolGroup.
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 ); SymbolGroupEntry* FindEntryByIndex(ULONG Index); SymbolGroupEntry* FindEntryByExpr(SymbolGroupEntry* Parent, SymbolGroupEntry* After, PCSTR Expr); ULONG FindEntryIndex(SymbolGroupEntry* Entry);
void DeleteEntry(SymbolGroupEntry* Entry); void DeleteChildren(SymbolGroupEntry* Parent);
void LinkEntry(IN SymbolGroupEntry* Entry, IN OUT PULONG Index); HRESULT NewEntry(IN PCSTR Expr, IN OPTIONAL PSYMBOL_INFO SymInfo, OUT SymbolGroupEntry** EntryRet);
HRESULT SetEntryExpansion(IN SymbolGroupEntry* Entry, IN BOOL Expand); HRESULT AddCurrentLocals(void); ULONG FindLocalInsertionIndex(SymbolGroupEntry* Entry); static BOOL CALLBACK AddAllScopedSymbols(PSYMBOL_INFO SymInfo, ULONG Size, PVOID Context);
void TestImages(void); void ShowAll(void);
DebugClient* m_Client; ULONG m_ScopeGroup;
ULONG m_Refs; ULONG m_NumEntries; // Entry list is kept sorted by parent/child relationship
// so all children of a parent follow it directly in the
// order they were found.
SymbolGroupEntry* m_Entries; BOOL m_LastClassExpanded; };
#endif // #ifndef __DBGSYM_HPP__
|