From b4442b7383baad8c0e103d0e512d7900a6e46fc2 Mon Sep 17 00:00:00 2001 From: "SND\\EreTIk_cp" Date: Mon, 22 Apr 2013 14:16:09 +0000 Subject: [PATCH] [0.2.x] ~ dia files refactoring git-svn-id: https://pykd.svn.codeplex.com/svn@83439 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dia/diadata.cpp | 573 ++------------------- pykd/dia/diadecls.h | 25 + pykd/dia/diaexcept.cpp | 121 +++++ pykd/dia/diaexcept.h | 39 ++ pykd/dia/diaload.cpp | 9 +- pykd/dia/diasession.cpp | 77 +++ pykd/dia/diasession.h | 48 ++ pykd/dia/{diawrapper.cpp => diasymbol.cpp} | 223 +------- pykd/dia/diasymbol.h | 139 +++++ pykd/dia/diawrapper.h | 258 ---------- pykd/pykd_2008.vcproj | 24 +- 11 files changed, 530 insertions(+), 1006 deletions(-) create mode 100644 pykd/dia/diadecls.h create mode 100644 pykd/dia/diaexcept.cpp create mode 100644 pykd/dia/diaexcept.h create mode 100644 pykd/dia/diasession.cpp create mode 100644 pykd/dia/diasession.h rename pykd/dia/{diawrapper.cpp => diasymbol.cpp} (65%) create mode 100644 pykd/dia/diasymbol.h delete mode 100644 pykd/dia/diawrapper.h diff --git a/pykd/dia/diadata.cpp b/pykd/dia/diadata.cpp index 8757e66..e2c6e2e 100644 --- a/pykd/dia/diadata.cpp +++ b/pykd/dia/diadata.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "diawrapper.h" +#include "diasymbol.h" namespace pykd { @@ -32,532 +32,49 @@ const size_t DiaSymbol::cntBasicTypeName = _countof(DiaSymbol::basicTypeName); /////////////////////////////////////////////////////////////////////////////// +namespace +{ + +const struct DiaRegToRegRelativeAmd64 : DiaRegToRegRelativeBase +{ + typedef std::map Base; + DiaRegToRegRelativeAmd64(); +} g_DiaRegToRegRelativeAmd64; + +DiaRegToRegRelativeAmd64::DiaRegToRegRelativeAmd64() +{ + (*this)[CV_AMD64_RIP] = rriInstructionPointer; + (*this)[CV_AMD64_RBP] = rriStackFrame; + (*this)[CV_AMD64_RSP] = rriStackPointer; +} + +} + +const DiaRegToRegRelativeBase &DiaSymbol::regToRegRelativeAmd64 = g_DiaRegToRegRelativeAmd64; + +/////////////////////////////////////////////////////////////////////////////// + +namespace +{ + +const struct DiaRegToRegRelativeI386 : DiaRegToRegRelativeBase +{ + typedef std::map Base; + DiaRegToRegRelativeI386(); +} g_DiaRegToRegRelativeI386; + +DiaRegToRegRelativeI386::DiaRegToRegRelativeI386() +{ + (*this)[CV_REG_EIP] = rriInstructionPointer; + (*this)[CV_REG_EBP] = rriStackFrame; + (*this)[CV_REG_ESP] = rriStackPointer; +} + +} + +const DiaRegToRegRelativeBase &DiaSymbol::regToRegRelativeI386 = g_DiaRegToRegRelativeI386; + +/////////////////////////////////////////////////////////////////////////////// + } //pykd namespace end - - - - - - - - - - - - - - - - - - - -// -//#include "diawrapper.h" -//#include "utils.h" -// -//namespace pyDia { -// -////////////////////////////////////////////////////////////////////////////////// -// -//#define _DEF_SYM_TAG_VAL(x) Symbol::ValueNameEntry(SymTag##x, #x) -//const Symbol::ValueNameEntry Symbol::symTagName[SymTagMax] = { -// _DEF_SYM_TAG_VAL(Null), -// _DEF_SYM_TAG_VAL(Exe), -// _DEF_SYM_TAG_VAL(Compiland), -// _DEF_SYM_TAG_VAL(CompilandDetails), -// _DEF_SYM_TAG_VAL(CompilandEnv), -// _DEF_SYM_TAG_VAL(Function), -// _DEF_SYM_TAG_VAL(Block), -// _DEF_SYM_TAG_VAL(Data), -// _DEF_SYM_TAG_VAL(Annotation), -// _DEF_SYM_TAG_VAL(Label), -// _DEF_SYM_TAG_VAL(PublicSymbol), -// _DEF_SYM_TAG_VAL(UDT), -// _DEF_SYM_TAG_VAL(Enum), -// _DEF_SYM_TAG_VAL(FunctionType), -// _DEF_SYM_TAG_VAL(PointerType), -// _DEF_SYM_TAG_VAL(ArrayType), -// _DEF_SYM_TAG_VAL(BaseType), -// _DEF_SYM_TAG_VAL(Typedef), -// _DEF_SYM_TAG_VAL(BaseClass), -// _DEF_SYM_TAG_VAL(Friend), -// _DEF_SYM_TAG_VAL(FunctionArgType), -// _DEF_SYM_TAG_VAL(FuncDebugStart), -// _DEF_SYM_TAG_VAL(FuncDebugEnd), -// _DEF_SYM_TAG_VAL(UsingNamespace), -// _DEF_SYM_TAG_VAL(VTableShape), -// _DEF_SYM_TAG_VAL(VTable), -// _DEF_SYM_TAG_VAL(Custom), -// _DEF_SYM_TAG_VAL(Thunk), -// _DEF_SYM_TAG_VAL(CustomType), -// _DEF_SYM_TAG_VAL(ManagedType), -// _DEF_SYM_TAG_VAL(Dimension) -//}; -//#undef _DEF_SYM_TAG_VAL -// -////////////////////////////////////////////////////////////////////////////////// -// -//#define _DEF_DATA_KIND_VAL(x) Symbol::ValueNameEntry(DataIs##x, #x) -//const Symbol::ValueNameEntry Symbol::dataKindName[DataIsConstant + 1] = { -// _DEF_DATA_KIND_VAL(Unknown), -// _DEF_DATA_KIND_VAL(Local), -// _DEF_DATA_KIND_VAL(StaticLocal), -// _DEF_DATA_KIND_VAL(Param), -// _DEF_DATA_KIND_VAL(ObjectPtr), -// _DEF_DATA_KIND_VAL(FileStatic), -// _DEF_DATA_KIND_VAL(Global), -// _DEF_DATA_KIND_VAL(Member), -// _DEF_DATA_KIND_VAL(StaticMember), -// _DEF_DATA_KIND_VAL(Constant) -//}; -//#undef _DEF_DATA_KIND_VAL -// -// -////////////////////////////////////////////////////////////////////////////////// -// -//#define _DEF_LOC_TYPE(x) Symbol::ValueNameEntry(LocIs##x, #x) -//const Symbol::ValueNameEntry Symbol::locTypeName[LocTypeMax] = { -// _DEF_LOC_TYPE(Null), -// _DEF_LOC_TYPE(Static), -// _DEF_LOC_TYPE(TLS), -// _DEF_LOC_TYPE(RegRel), -// _DEF_LOC_TYPE(ThisRel), -// _DEF_LOC_TYPE(Enregistered), -// _DEF_LOC_TYPE(BitField), -// _DEF_LOC_TYPE(Slot), -// _DEF_LOC_TYPE(IlRel), -// Symbol::ValueNameEntry(LocInMetaData, "InMetaData"), -// _DEF_LOC_TYPE(Constant) -//}; -//#undef _DEF_LOC_TYPE -// -////////////////////////////////////////////////////////////////////////////////// -// -//#define _DEF_BASIC_TYPE(x) Symbol::ValueNameEntry(bt##x, #x) -//const Symbol::ValueNameEntry Symbol::basicTypeName[] = { -// _DEF_BASIC_TYPE(NoType), -// _DEF_BASIC_TYPE(Void), -// _DEF_BASIC_TYPE(Char), -// _DEF_BASIC_TYPE(WChar), -// _DEF_BASIC_TYPE(Int), -// _DEF_BASIC_TYPE(UInt), -// _DEF_BASIC_TYPE(Float), -// _DEF_BASIC_TYPE(BCD), -// _DEF_BASIC_TYPE(Bool), -// _DEF_BASIC_TYPE(Long), -// _DEF_BASIC_TYPE(ULong), -// _DEF_BASIC_TYPE(Currency), -// _DEF_BASIC_TYPE(Date), -// _DEF_BASIC_TYPE(Variant), -// _DEF_BASIC_TYPE(Complex), -// _DEF_BASIC_TYPE(Bit), -// _DEF_BASIC_TYPE(BSTR), -// _DEF_BASIC_TYPE(Hresult) -//}; -//#undef _DEF_BASIC_TYPE -// -//const size_t Symbol::cntBasicTypeName = _countof(Symbol::basicTypeName); -// -//std::string Symbol::getBasicTypeName( ULONG basicType ) -//{ -// for ( size_t i = 0; i < Symbol::cntBasicTypeName; ++i ) -// { -// if ( basicType == Symbol::basicTypeName[i].first ) -// return std::string( Symbol::basicTypeName[i].second ); -// } -// -// std::stringstream sstr; -// -// sstr << "faild to find basic type with index %d" << basicType; -// -// throw Exception( sstr.str() ); -//} -// -////////////////////////////////////////////////////////////////////////////////// -// -//#define _DEF_UDT_KIND(x) Symbol::ValueNameEntry(Udt##x, #x) -//const Symbol::ValueNameEntry Symbol::udtKindName[] = { -// _DEF_UDT_KIND(Struct), -// _DEF_UDT_KIND(Class), -// _DEF_UDT_KIND(Union) -//}; -//#undef _DEF_UDT_KIND -// -//const size_t Symbol::cntUdtKindName = _countof(udtKindName); -// -////////////////////////////////////////////////////////////////////////////////// -// -//#define _DEF_I386_REG(x) Symbol::ValueNameEntry(CV_REG_##x, #x) -//const Symbol::ValueNameEntry Symbol::i386RegName[] = { -// _DEF_I386_REG(AL), -// _DEF_I386_REG(CL), -// _DEF_I386_REG(DL), -// _DEF_I386_REG(BL), -// _DEF_I386_REG(AH), -// _DEF_I386_REG(CH), -// _DEF_I386_REG(DH), -// _DEF_I386_REG(BH), -// _DEF_I386_REG(AX), -// _DEF_I386_REG(CX), -// _DEF_I386_REG(DX), -// _DEF_I386_REG(BX), -// _DEF_I386_REG(SP), -// _DEF_I386_REG(BP), -// _DEF_I386_REG(SI), -// _DEF_I386_REG(DI), -// _DEF_I386_REG(EAX), -// _DEF_I386_REG(ECX), -// _DEF_I386_REG(EDX), -// _DEF_I386_REG(EBX), -// _DEF_I386_REG(ESP), -// _DEF_I386_REG(EBP), -// _DEF_I386_REG(ESI), -// _DEF_I386_REG(EDI), -// _DEF_I386_REG(ES), -// _DEF_I386_REG(CS), -// _DEF_I386_REG(SS), -// _DEF_I386_REG(DS), -// _DEF_I386_REG(FS), -// _DEF_I386_REG(GS), -// _DEF_I386_REG(IP), -// _DEF_I386_REG(FLAGS ), -// _DEF_I386_REG(EIP), -// _DEF_I386_REG(EFLAGS), -// _DEF_I386_REG(TEMP), -// _DEF_I386_REG(TEMPH), -// _DEF_I386_REG(QUOTE), -// _DEF_I386_REG(PCDR3), -// _DEF_I386_REG(PCDR4), -// _DEF_I386_REG(PCDR5), -// _DEF_I386_REG(PCDR6), -// _DEF_I386_REG(PCDR7), -// _DEF_I386_REG(CR0), -// _DEF_I386_REG(CR1), -// _DEF_I386_REG(CR2), -// _DEF_I386_REG(CR3), -// _DEF_I386_REG(CR4), -// _DEF_I386_REG(DR0), -// _DEF_I386_REG(DR1), -// _DEF_I386_REG(DR2), -// _DEF_I386_REG(DR3), -// _DEF_I386_REG(DR4), -// _DEF_I386_REG(DR5), -// _DEF_I386_REG(DR6), -// _DEF_I386_REG(DR7), -// _DEF_I386_REG(GDTR), -// _DEF_I386_REG(GDTL), -// _DEF_I386_REG(IDTR), -// _DEF_I386_REG(IDTL), -// _DEF_I386_REG(LDTR), -// _DEF_I386_REG(TR) -//}; -//#undef _DEF_I386_REG -// -//const size_t Symbol::cntI386RegName = _countof(i386RegName); -// -////////////////////////////////////////////////////////////////////////////////// -// -//#define _DEF_AMD64_REG(x) Symbol::ValueNameEntry(CV_AMD64_##x, #x) -//const Symbol::ValueNameEntry Symbol::amd64RegName[] = { -// _DEF_AMD64_REG(AL), -// _DEF_AMD64_REG(CL), -// _DEF_AMD64_REG(DL), -// _DEF_AMD64_REG(BL), -// _DEF_AMD64_REG(AH), -// _DEF_AMD64_REG(CH), -// _DEF_AMD64_REG(DH), -// _DEF_AMD64_REG(BH), -// _DEF_AMD64_REG(AX), -// _DEF_AMD64_REG(CX), -// _DEF_AMD64_REG(DX), -// _DEF_AMD64_REG(BX), -// _DEF_AMD64_REG(SP), -// _DEF_AMD64_REG(BP), -// _DEF_AMD64_REG(SI), -// _DEF_AMD64_REG(DI), -// _DEF_AMD64_REG(EAX), -// _DEF_AMD64_REG(ECX), -// _DEF_AMD64_REG(EDX), -// _DEF_AMD64_REG(EBX), -// _DEF_AMD64_REG(ESP), -// _DEF_AMD64_REG(EBP), -// _DEF_AMD64_REG(ESI), -// _DEF_AMD64_REG(EDI), -// _DEF_AMD64_REG(ES), -// _DEF_AMD64_REG(CS), -// _DEF_AMD64_REG(SS), -// _DEF_AMD64_REG(DS), -// _DEF_AMD64_REG(FS), -// _DEF_AMD64_REG(GS), -// _DEF_AMD64_REG(FLAGS), -// _DEF_AMD64_REG(RIP), -// _DEF_AMD64_REG(EFLAGS), -// _DEF_AMD64_REG(CR0), -// _DEF_AMD64_REG(CR1), -// _DEF_AMD64_REG(CR2), -// _DEF_AMD64_REG(CR3), -// _DEF_AMD64_REG(CR4), -// _DEF_AMD64_REG(CR8), -// _DEF_AMD64_REG(DR0), -// _DEF_AMD64_REG(DR1), -// _DEF_AMD64_REG(DR2), -// _DEF_AMD64_REG(DR3), -// _DEF_AMD64_REG(DR4), -// _DEF_AMD64_REG(DR5), -// _DEF_AMD64_REG(DR6), -// _DEF_AMD64_REG(DR7), -// _DEF_AMD64_REG(DR8), -// _DEF_AMD64_REG(DR9), -// _DEF_AMD64_REG(DR10), -// _DEF_AMD64_REG(DR11), -// _DEF_AMD64_REG(DR12), -// _DEF_AMD64_REG(DR13), -// _DEF_AMD64_REG(DR14), -// _DEF_AMD64_REG(DR15), -// _DEF_AMD64_REG(GDTR), -// _DEF_AMD64_REG(GDTL), -// _DEF_AMD64_REG(IDTR), -// _DEF_AMD64_REG(IDTL), -// _DEF_AMD64_REG(LDTR), -// _DEF_AMD64_REG(TR), -// _DEF_AMD64_REG(ST0), -// _DEF_AMD64_REG(ST1), -// _DEF_AMD64_REG(ST2), -// _DEF_AMD64_REG(ST3), -// _DEF_AMD64_REG(ST4), -// _DEF_AMD64_REG(ST5), -// _DEF_AMD64_REG(ST6), -// _DEF_AMD64_REG(ST7), -// _DEF_AMD64_REG(CTRL), -// _DEF_AMD64_REG(STAT), -// _DEF_AMD64_REG(TAG), -// _DEF_AMD64_REG(FPIP), -// _DEF_AMD64_REG(FPCS), -// _DEF_AMD64_REG(FPDO), -// _DEF_AMD64_REG(FPDS), -// _DEF_AMD64_REG(ISEM), -// _DEF_AMD64_REG(FPEIP), -// _DEF_AMD64_REG(FPEDO), -// _DEF_AMD64_REG(MM0), -// _DEF_AMD64_REG(MM1), -// _DEF_AMD64_REG(MM2), -// _DEF_AMD64_REG(MM3), -// _DEF_AMD64_REG(MM4), -// _DEF_AMD64_REG(MM5), -// _DEF_AMD64_REG(MM6), -// _DEF_AMD64_REG(MM7), -// _DEF_AMD64_REG(XMM0), -// _DEF_AMD64_REG(XMM1), -// _DEF_AMD64_REG(XMM2), -// _DEF_AMD64_REG(XMM3), -// _DEF_AMD64_REG(XMM4), -// _DEF_AMD64_REG(XMM5), -// _DEF_AMD64_REG(XMM6), -// _DEF_AMD64_REG(XMM7), -// _DEF_AMD64_REG(XMM0_0), -// _DEF_AMD64_REG(XMM0_1), -// _DEF_AMD64_REG(XMM0_2), -// _DEF_AMD64_REG(XMM0_3), -// _DEF_AMD64_REG(XMM1_0), -// _DEF_AMD64_REG(XMM1_1), -// _DEF_AMD64_REG(XMM1_2), -// _DEF_AMD64_REG(XMM1_3), -// _DEF_AMD64_REG(XMM2_0), -// _DEF_AMD64_REG(XMM2_1), -// _DEF_AMD64_REG(XMM2_2), -// _DEF_AMD64_REG(XMM2_3), -// _DEF_AMD64_REG(XMM3_0), -// _DEF_AMD64_REG(XMM3_1), -// _DEF_AMD64_REG(XMM3_2), -// _DEF_AMD64_REG(XMM3_3), -// _DEF_AMD64_REG(XMM4_0), -// _DEF_AMD64_REG(XMM4_1), -// _DEF_AMD64_REG(XMM4_2), -// _DEF_AMD64_REG(XMM4_3), -// _DEF_AMD64_REG(XMM5_0), -// _DEF_AMD64_REG(XMM5_1), -// _DEF_AMD64_REG(XMM5_2), -// _DEF_AMD64_REG(XMM5_3), -// _DEF_AMD64_REG(XMM6_0), -// _DEF_AMD64_REG(XMM6_1), -// _DEF_AMD64_REG(XMM6_2), -// _DEF_AMD64_REG(XMM6_3), -// _DEF_AMD64_REG(XMM7_0), -// _DEF_AMD64_REG(XMM7_1), -// _DEF_AMD64_REG(XMM7_2), -// _DEF_AMD64_REG(XMM7_3), -// _DEF_AMD64_REG(XMM0L), -// _DEF_AMD64_REG(XMM1L), -// _DEF_AMD64_REG(XMM2L), -// _DEF_AMD64_REG(XMM3L), -// _DEF_AMD64_REG(XMM4L), -// _DEF_AMD64_REG(XMM5L), -// _DEF_AMD64_REG(XMM6L), -// _DEF_AMD64_REG(XMM7L), -// _DEF_AMD64_REG(XMM0H), -// _DEF_AMD64_REG(XMM1H), -// _DEF_AMD64_REG(XMM2H), -// _DEF_AMD64_REG(XMM3H), -// _DEF_AMD64_REG(XMM4H), -// _DEF_AMD64_REG(XMM5H), -// _DEF_AMD64_REG(XMM6H), -// _DEF_AMD64_REG(XMM7H), -// _DEF_AMD64_REG(MXCSR), -// _DEF_AMD64_REG(EMM0L), -// _DEF_AMD64_REG(EMM1L), -// _DEF_AMD64_REG(EMM2L), -// _DEF_AMD64_REG(EMM3L), -// _DEF_AMD64_REG(EMM4L), -// _DEF_AMD64_REG(EMM5L), -// _DEF_AMD64_REG(EMM6L), -// _DEF_AMD64_REG(EMM7L), -// _DEF_AMD64_REG(EMM0H), -// _DEF_AMD64_REG(EMM1H), -// _DEF_AMD64_REG(EMM2H), -// _DEF_AMD64_REG(EMM3H), -// _DEF_AMD64_REG(EMM4H), -// _DEF_AMD64_REG(EMM5H), -// _DEF_AMD64_REG(EMM6H), -// _DEF_AMD64_REG(EMM7H), -// _DEF_AMD64_REG(MM00), -// _DEF_AMD64_REG(MM01), -// _DEF_AMD64_REG(MM10), -// _DEF_AMD64_REG(MM11), -// _DEF_AMD64_REG(MM20), -// _DEF_AMD64_REG(MM21), -// _DEF_AMD64_REG(MM30), -// _DEF_AMD64_REG(MM31), -// _DEF_AMD64_REG(MM40), -// _DEF_AMD64_REG(MM41), -// _DEF_AMD64_REG(MM50), -// _DEF_AMD64_REG(MM51), -// _DEF_AMD64_REG(MM60), -// _DEF_AMD64_REG(MM61), -// _DEF_AMD64_REG(MM70), -// _DEF_AMD64_REG(MM71), -// _DEF_AMD64_REG(XMM8), -// _DEF_AMD64_REG(XMM9), -// _DEF_AMD64_REG(XMM10), -// _DEF_AMD64_REG(XMM11), -// _DEF_AMD64_REG(XMM12), -// _DEF_AMD64_REG(XMM13), -// _DEF_AMD64_REG(XMM14), -// _DEF_AMD64_REG(XMM15), -// _DEF_AMD64_REG(XMM8_0), -// _DEF_AMD64_REG(XMM8_1), -// _DEF_AMD64_REG(XMM8_2), -// _DEF_AMD64_REG(XMM8_3), -// _DEF_AMD64_REG(XMM9_0), -// _DEF_AMD64_REG(XMM9_1), -// _DEF_AMD64_REG(XMM9_2), -// _DEF_AMD64_REG(XMM9_3), -// _DEF_AMD64_REG(XMM10_0), -// _DEF_AMD64_REG(XMM10_1), -// _DEF_AMD64_REG(XMM10_2), -// _DEF_AMD64_REG(XMM10_3), -// _DEF_AMD64_REG(XMM11_0), -// _DEF_AMD64_REG(XMM11_1), -// _DEF_AMD64_REG(XMM11_2), -// _DEF_AMD64_REG(XMM11_3), -// _DEF_AMD64_REG(XMM12_0), -// _DEF_AMD64_REG(XMM12_1), -// _DEF_AMD64_REG(XMM12_2), -// _DEF_AMD64_REG(XMM12_3), -// _DEF_AMD64_REG(XMM13_0), -// _DEF_AMD64_REG(XMM13_1), -// _DEF_AMD64_REG(XMM13_2), -// _DEF_AMD64_REG(XMM13_3), -// _DEF_AMD64_REG(XMM14_0), -// _DEF_AMD64_REG(XMM14_1), -// _DEF_AMD64_REG(XMM14_2), -// _DEF_AMD64_REG(XMM14_3), -// _DEF_AMD64_REG(XMM15_0), -// _DEF_AMD64_REG(XMM15_1), -// _DEF_AMD64_REG(XMM15_2), -// _DEF_AMD64_REG(XMM15_3), -// _DEF_AMD64_REG(XMM8L), -// _DEF_AMD64_REG(XMM9L), -// _DEF_AMD64_REG(XMM10L), -// _DEF_AMD64_REG(XMM11L), -// _DEF_AMD64_REG(XMM12L), -// _DEF_AMD64_REG(XMM13L), -// _DEF_AMD64_REG(XMM14L), -// _DEF_AMD64_REG(XMM15L), -// _DEF_AMD64_REG(XMM8H), -// _DEF_AMD64_REG(XMM9H), -// _DEF_AMD64_REG(XMM10H), -// _DEF_AMD64_REG(XMM11H), -// _DEF_AMD64_REG(XMM12H), -// _DEF_AMD64_REG(XMM13H), -// _DEF_AMD64_REG(XMM14H), -// _DEF_AMD64_REG(XMM15H), -// _DEF_AMD64_REG(EMM8L), -// _DEF_AMD64_REG(EMM9L), -// _DEF_AMD64_REG(EMM10L), -// _DEF_AMD64_REG(EMM11L), -// _DEF_AMD64_REG(EMM12L), -// _DEF_AMD64_REG(EMM13L), -// _DEF_AMD64_REG(EMM14L), -// _DEF_AMD64_REG(EMM15L), -// _DEF_AMD64_REG(EMM8H), -// _DEF_AMD64_REG(EMM9H), -// _DEF_AMD64_REG(EMM10H), -// _DEF_AMD64_REG(EMM11H), -// _DEF_AMD64_REG(EMM12H), -// _DEF_AMD64_REG(EMM13H), -// _DEF_AMD64_REG(EMM14H), -// _DEF_AMD64_REG(EMM15H), -// _DEF_AMD64_REG(SIL), -// _DEF_AMD64_REG(DIL), -// _DEF_AMD64_REG(BPL), -// _DEF_AMD64_REG(SPL), -// _DEF_AMD64_REG(RAX), -// _DEF_AMD64_REG(RBX), -// _DEF_AMD64_REG(RCX), -// _DEF_AMD64_REG(RDX), -// _DEF_AMD64_REG(RSI), -// _DEF_AMD64_REG(RDI), -// _DEF_AMD64_REG(RBP), -// _DEF_AMD64_REG(RSP), -// _DEF_AMD64_REG(R8), -// _DEF_AMD64_REG(R9), -// _DEF_AMD64_REG(R10), -// _DEF_AMD64_REG(R11), -// _DEF_AMD64_REG(R12), -// _DEF_AMD64_REG(R13), -// _DEF_AMD64_REG(R14), -// _DEF_AMD64_REG(R15), -// _DEF_AMD64_REG(R8B), -// _DEF_AMD64_REG(R9B), -// _DEF_AMD64_REG(R10B), -// _DEF_AMD64_REG(R11B), -// _DEF_AMD64_REG(R12B), -// _DEF_AMD64_REG(R13B), -// _DEF_AMD64_REG(R14B), -// _DEF_AMD64_REG(R15B), -// _DEF_AMD64_REG(R8W), -// _DEF_AMD64_REG(R9W), -// _DEF_AMD64_REG(R10W), -// _DEF_AMD64_REG(R11W), -// _DEF_AMD64_REG(R12W), -// _DEF_AMD64_REG(R13W), -// _DEF_AMD64_REG(R14W), -// _DEF_AMD64_REG(R15W), -// _DEF_AMD64_REG(R8D), -// _DEF_AMD64_REG(R9D), -// _DEF_AMD64_REG(R10D), -// _DEF_AMD64_REG(R11D), -// _DEF_AMD64_REG(R12D), -// _DEF_AMD64_REG(R13D), -// _DEF_AMD64_REG(R14D), -// _DEF_AMD64_REG(R15D) -//}; -//#undef _DEF_AMD64_REG -// -//const size_t Symbol::cntAmd64RegName= _countof(amd64RegName); -// -////////////////////////////////////////////////////////////////////////////////// -// -//} diff --git a/pykd/dia/diadecls.h b/pykd/dia/diadecls.h new file mode 100644 index 0000000..0e89e0a --- /dev/null +++ b/pykd/dia/diadecls.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include "symengine.h" + +#include "dia\diaexcept.h" + + +namespace pykd { + +////////////////////////////////////////////////////////////////////////////// + +typedef CComPtr< IDiaSymbol > DiaSymbolPtr; +typedef CComPtr< IDiaEnumSymbols > DiaEnumSymbolsPtr; +typedef CComPtr< IDiaDataSource > DiaDataSourcePtr; +typedef CComPtr< IDiaSession > DiaSessionPtr; +typedef CComPtr< IDiaEnumSymbolsByAddr > DiaEnumSymbolsByAddrPtr; +typedef CComPtr< IDiaEnumLineNumbers > DiaEnumLineNumbersPtr; +typedef CComPtr< IDiaLineNumber> DiaLineNumberPtr; +typedef CComPtr< IDiaSourceFile > DiaSourceFilePtr; + +////////////////////////////////////////////////////////////////////////////// + +} // end pykd namespace diff --git a/pykd/dia/diaexcept.cpp b/pykd/dia/diaexcept.cpp new file mode 100644 index 0000000..623da98 --- /dev/null +++ b/pykd/dia/diaexcept.cpp @@ -0,0 +1,121 @@ + +#include "stdafx.h" +#include "dia\diadecls.h" +#include "win\utils.h" + +namespace pykd { + +/////////////////////////////////////////////////////////////////////////////// + +const std::string DiaException::descPrefix("pyDia: "); + +std::string DiaException::makeFullDesc(const std::string &desc, HRESULT hres, IDiaSymbol *symbol /*= NULL*/) +{ + std::stringstream sstream; + sstream << descPrefix << desc << " failed" << std::endl; + if (symbol) + { + BSTR bstrName = NULL; + HRESULT locRes = symbol->get_undecoratedName(&bstrName); + if (S_OK == locRes && bstrName) + { + autoBstr freeBstr(bstrName); + sstream << "Symbol name: \"" << autoBstr::asStr(bstrName) << "\""; + } + else + { + locRes = symbol->get_name(&bstrName); + if (S_OK == locRes && bstrName) + { + autoBstr freeBstr(bstrName); + sstream << "Symbol name: " << autoBstr::asStr(bstrName); + } + else + { + sstream << "Symbol: "; + } + } + + DWORD dwValue; + locRes = symbol->get_relativeVirtualAddress(&dwValue); + if (S_OK == locRes) + { + sstream << ", RVA= 0x" << std::hex << dwValue; + } + + locRes = symbol->get_symTag(&dwValue); + if (S_OK == locRes) + { + sstream << ", tag= " << std::dec << dwValue; + } + + locRes = symbol->get_locationType(&dwValue); + if (S_OK == locRes) + { + sstream << ", location: " << std::dec << dwValue; + } + + sstream << std::endl; + } + sstream << "Return value is 0x" << std::hex << hres; + + switch (hres) + { +#define _CASE_DIA_ERROR(x) case E_PDB_##x: sstream << ": E_PDB_" #x << std::endl; break + + _CASE_DIA_ERROR(USAGE); + _CASE_DIA_ERROR(OUT_OF_MEMORY); + _CASE_DIA_ERROR(FILE_SYSTEM); + _CASE_DIA_ERROR(NOT_FOUND); + _CASE_DIA_ERROR(INVALID_SIG); + _CASE_DIA_ERROR(INVALID_AGE); + _CASE_DIA_ERROR(PRECOMP_REQUIRED); + _CASE_DIA_ERROR(OUT_OF_TI); + _CASE_DIA_ERROR(NOT_IMPLEMENTED); + _CASE_DIA_ERROR(V1_PDB); + _CASE_DIA_ERROR(FORMAT); + _CASE_DIA_ERROR(LIMIT); + _CASE_DIA_ERROR(CORRUPT); + _CASE_DIA_ERROR(TI16); + _CASE_DIA_ERROR(ACCESS_DENIED); + _CASE_DIA_ERROR(ILLEGAL_TYPE_EDIT); + _CASE_DIA_ERROR(INVALID_EXECUTABLE); + _CASE_DIA_ERROR(DBG_NOT_FOUND); + _CASE_DIA_ERROR(NO_DEBUG_INFO); + _CASE_DIA_ERROR(INVALID_EXE_TIMESTAMP); + _CASE_DIA_ERROR(RESERVED); + _CASE_DIA_ERROR(DEBUG_INFO_NOT_IN_PDB); + _CASE_DIA_ERROR(SYMSRV_BAD_CACHE_PATH); + _CASE_DIA_ERROR(SYMSRV_CACHE_FULL); + +#undef _CASE_DIA_ERROR + default: + { + PCHAR errMessage = NULL; + FormatMessageA( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + hres, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (PCHAR)&errMessage, + 0, + NULL); + if (errMessage) + { + sstream << ": " << std::endl; + sstream << errMessage; + LocalFree(errMessage); + } + else + { + sstream << std::endl; + } + } + } + + return sstream.str(); +} + +/////////////////////////////////////////////////////////////////////////////// + +}; // pykd namespace end diff --git a/pykd/dia/diaexcept.h b/pykd/dia/diaexcept.h new file mode 100644 index 0000000..e65737d --- /dev/null +++ b/pykd/dia/diaexcept.h @@ -0,0 +1,39 @@ + +#pragma once + +#include "dbgexcept.h" + +namespace pykd { + +////////////////////////////////////////////////////////////////////////////// + +class DiaException : public SymbolException { +public: + DiaException(const std::string &desc, HRESULT hres, IDiaSymbol *symbol = NULL) + : SymbolException( makeFullDesc(desc, hres, symbol) ) + , m_hres(hres) + { + } + + DiaException(const std::string &desc) + : SymbolException(descPrefix + desc) + , m_hres(S_FALSE) + { + } + + HRESULT getRes() const { + return m_hres; + } +private: + + static const std::string descPrefix; + + static std::string makeFullDesc(const std::string &desc, HRESULT hres, IDiaSymbol *symbol = NULL); + + HRESULT m_hres; +}; + +//////////////////////////////////////////////////////////////////////////// + +} // end pykd namespace + diff --git a/pykd/dia/diaload.cpp b/pykd/dia/diaload.cpp index 602d88f..9d14e01 100644 --- a/pykd/dia/diaload.cpp +++ b/pykd/dia/diaload.cpp @@ -4,10 +4,11 @@ #include "stdafx.h" #include "dbghelp.h" -#include "dia/diawrapper.h" -#include "win/utils.h" +#include "dbgmem.h" #include "dbgengine.h" -#include "diacallback.h" +#include "win/utils.h" +#include "dia/diasession.h" +#include "dia/diacallback.h" ////////////////////////////////////////////////////////////////////////////////// @@ -217,7 +218,7 @@ protected: ////////////////////////////////////////////////////////////////////////////////// -SymbolSessionPtr loadSymbolFile(const std::string &filePath, ULONGLONG loadBase ) +SymbolSessionPtr loadSymbolFile(const std::string &filePath, ULONGLONG loadBase ) { diaLoad::DataFromPdb dataFromPdb(filePath); return diaLoad::createSession(dataFromPdb, loadBase, filePath); diff --git a/pykd/dia/diasession.cpp b/pykd/dia/diasession.cpp new file mode 100644 index 0000000..019babf --- /dev/null +++ b/pykd/dia/diasession.cpp @@ -0,0 +1,77 @@ + +#include "stdafx.h" + +#include "dbghelp.h" +#include "dia\diasession.h" +#include "win\utils.h" + +namespace pykd { + +////////////////////////////////////////////////////////////////////////////// + +SymbolPtr DiaSession::findByRva( ULONG rva, ULONG symTag, LONG* pdisplacement ) +{ + DiaSymbolPtr child; + LONG displacement; + + HRESULT hres = + m_session->findSymbolByRVAEx( + rva, + static_cast(symTag), + &child, + &displacement); + + if (S_OK != hres) + throw DiaException("Call IDiaSession::findSymbolByRVAEx", hres); + if (!child) + throw DiaException("Call IDiaSession::findSymbolByRVAEx", E_UNEXPECTED); + if ( !pdisplacement && displacement) + throw DiaException("Call IDiaSession::findSymbolByRVAEx failed to find suymbol" ); + + if (pdisplacement) + *pdisplacement = displacement; + + return SymbolPtr( new DiaSymbol(child, m_globalSymbol->getMachineType() ) ); +} + +/////////////////////////////////////////////////////////////////////////////// + +void DiaSession::getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement ) +{ + DiaEnumLineNumbersPtr lines; + + HRESULT hres = m_session->findLinesByVA( offset, 1, &lines ); + if (S_OK != hres) + throw DiaException("failed to find source line"); + + DiaLineNumberPtr sourceLine; + hres = lines->Item( 0, &sourceLine ); + if (S_OK != hres) + throw DiaException("failed to find source line"); + + DiaSourceFilePtr sourceFile; + hres = sourceLine->get_sourceFile( &sourceFile ); + if (S_OK != hres) + throw DiaException("failed to find source line"); + + autoBstr fileNameBstr; + hres = sourceFile->get_fileName ( &fileNameBstr ); + if (S_OK != hres) + throw DiaException("failed to find source line"); + fileName = fileNameBstr.asStr(); + + hres = sourceLine->get_lineNumber( &lineNo ); + if (S_OK != hres) + throw DiaException("failed to find source line"); + + ULONGLONG va; + hres = sourceLine->get_virtualAddress ( &va ); + if (S_OK != hres) + throw DiaException("failed to find source line"); + + displacement = (LONG)( (LONGLONG)offset - (LONGLONG)va ); +} + +/////////////////////////////////////////////////////////////////////////////// + +}; // pykd namespace end diff --git a/pykd/dia/diasession.h b/pykd/dia/diasession.h new file mode 100644 index 0000000..7c2918d --- /dev/null +++ b/pykd/dia/diasession.h @@ -0,0 +1,48 @@ + +#pragma once + +#include "dia\diadecls.h" +#include "dia\diasymbol.h" + +namespace pykd { + +//////////////////////////////////////////////////////////////////////////// + +class DiaSession : public SymbolSession +{ +public: + + DiaSession( IDiaSession* session, IDiaSymbol *globalScope, const std::string symbolFile ) : + m_globalScope( globalScope ), + m_globalSymbol( DiaSymbol::fromGlobalScope( globalScope ) ), + m_session( session ), + m_symbolFileName( symbolFile ) + {} + + virtual SymbolPtr getSymbolScope() { + return m_globalSymbol; + } + + virtual SymbolPtr findByRva( ULONG rva, ULONG symTag = SymTagNull, LONG* displacement = NULL ); + + virtual void getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement ); + + virtual std::string getSymbolFileName() { + return m_symbolFileName; + } + +private: + + ULONG findRvaByName( const std::string &name ); + + DiaSymbolPtr m_globalScope; + SymbolPtr m_globalSymbol; + DiaSessionPtr m_session; + std::string m_symbolFileName; + +}; + +//////////////////////////////////////////////////////////////////////////// + +} // end pykd namespace + diff --git a/pykd/dia/diawrapper.cpp b/pykd/dia/diasymbol.cpp similarity index 65% rename from pykd/dia/diawrapper.cpp rename to pykd/dia/diasymbol.cpp index 8fa456f..bd8c0d0 100644 --- a/pykd/dia/diawrapper.cpp +++ b/pykd/dia/diasymbol.cpp @@ -1,152 +1,12 @@ #include "stdafx.h" + #include "dbghelp.h" -#include "dia/diawrapper.h" +#include "dia/diasymbol.h" #include "win/utils.h" namespace pykd { -/////////////////////////////////////////////////////////////////////////////// - -static const struct DiaRegToRegRelativeAmd64 : DiaRegToRegRelativeBase -{ - typedef std::map Base; - DiaRegToRegRelativeAmd64(); -} g_DiaRegToRegRelativeAmd64; - -DiaRegToRegRelativeAmd64::DiaRegToRegRelativeAmd64() -{ - (*this)[CV_AMD64_RIP] = rriInstructionPointer; - (*this)[CV_AMD64_RBP] = rriStackFrame; - (*this)[CV_AMD64_RSP] = rriStackPointer; -} - -/////////////////////////////////////////////////////////////////////////////// - -static const struct DiaRegToRegRelativeI386 : DiaRegToRegRelativeBase -{ - typedef std::map Base; - DiaRegToRegRelativeI386(); -} g_DiaRegToRegRelativeI386; - -DiaRegToRegRelativeI386::DiaRegToRegRelativeI386() -{ - (*this)[CV_REG_EIP] = rriInstructionPointer; - (*this)[CV_REG_EBP] = rriStackFrame; - (*this)[CV_REG_ESP] = rriStackPointer; -} - -/////////////////////////////////////////////////////////////////////////////// - -const std::string DiaException::descPrefix("pyDia: "); - -std::string DiaException::makeFullDesc(const std::string &desc, HRESULT hres, IDiaSymbol *symbol /*= NULL*/) -{ - std::stringstream sstream; - sstream << descPrefix << desc << " failed" << std::endl; - if (symbol) - { - BSTR bstrName = NULL; - HRESULT locRes = symbol->get_undecoratedName(&bstrName); - if (S_OK == locRes && bstrName) - { - autoBstr freeBstr(bstrName); - sstream << "Symbol name: \"" << autoBstr::asStr(bstrName) << "\""; - } - else - { - locRes = symbol->get_name(&bstrName); - if (S_OK == locRes && bstrName) - { - autoBstr freeBstr(bstrName); - sstream << "Symbol name: " << autoBstr::asStr(bstrName); - } - else - { - sstream << "Symbol: "; - } - } - - DWORD dwValue; - locRes = symbol->get_relativeVirtualAddress(&dwValue); - if (S_OK == locRes) - { - sstream << ", RVA= 0x" << std::hex << dwValue; - } - - locRes = symbol->get_symTag(&dwValue); - if (S_OK == locRes) - { - sstream << ", tag= " << std::dec << dwValue; - } - - locRes = symbol->get_locationType(&dwValue); - if (S_OK == locRes) - { - sstream << ", location: " << std::dec << dwValue; - } - - sstream << std::endl; - } - sstream << "Return value is 0x" << std::hex << hres; - - switch (hres) - { -#define _CASE_DIA_ERROR(x) case E_PDB_##x: sstream << ": E_PDB_" #x << std::endl; break - - _CASE_DIA_ERROR(USAGE); - _CASE_DIA_ERROR(OUT_OF_MEMORY); - _CASE_DIA_ERROR(FILE_SYSTEM); - _CASE_DIA_ERROR(NOT_FOUND); - _CASE_DIA_ERROR(INVALID_SIG); - _CASE_DIA_ERROR(INVALID_AGE); - _CASE_DIA_ERROR(PRECOMP_REQUIRED); - _CASE_DIA_ERROR(OUT_OF_TI); - _CASE_DIA_ERROR(NOT_IMPLEMENTED); - _CASE_DIA_ERROR(V1_PDB); - _CASE_DIA_ERROR(FORMAT); - _CASE_DIA_ERROR(LIMIT); - _CASE_DIA_ERROR(CORRUPT); - _CASE_DIA_ERROR(TI16); - _CASE_DIA_ERROR(ACCESS_DENIED); - _CASE_DIA_ERROR(ILLEGAL_TYPE_EDIT); - _CASE_DIA_ERROR(INVALID_EXECUTABLE); - _CASE_DIA_ERROR(DBG_NOT_FOUND); - _CASE_DIA_ERROR(NO_DEBUG_INFO); - _CASE_DIA_ERROR(INVALID_EXE_TIMESTAMP); - _CASE_DIA_ERROR(RESERVED); - _CASE_DIA_ERROR(DEBUG_INFO_NOT_IN_PDB); - _CASE_DIA_ERROR(SYMSRV_BAD_CACHE_PATH); - _CASE_DIA_ERROR(SYMSRV_CACHE_FULL); - -#undef _CASE_DIA_ERROR - default: - { - PCHAR errMessage = NULL; - FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - hres, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (PCHAR)&errMessage, - 0, - NULL); - if (errMessage) - { - sstream << ": " << std::endl; - sstream << errMessage; - LocalFree(errMessage); - } - else - { - sstream << std::endl; - } - } - } - - return sstream.str(); -} - //////////////////////////////////////////////////////////////////////////////// #define callSymbol(method) \ @@ -415,22 +275,22 @@ ULONG DiaSymbol::getRegRealativeId() switch (m_machineType) { case IMAGE_FILE_MACHINE_AMD64: - return getRegRealativeIdImpl(g_DiaRegToRegRelativeAmd64); + return getRegRealativeIdImpl(regToRegRelativeAmd64); case IMAGE_FILE_MACHINE_I386: - return getRegRealativeIdImpl(g_DiaRegToRegRelativeI386); + return getRegRealativeIdImpl(regToRegRelativeI386); } throw DiaException("Unsupported machine type"); } //////////////////////////////////////////////////////////////////////////////// -ULONG DiaSymbol::getRegRealativeIdImpl(const DiaRegToRegRelativeBase &DiaRegToRegRelative) +ULONG DiaSymbol::getRegRealativeIdImpl(const DiaRegToRegRelativeBase ®ToRegRelative) { DiaRegToRegRelativeBase::const_iterator it = - DiaRegToRegRelative.find(callSymbol(get_registerId)); + regToRegRelative.find(callSymbol(get_registerId)); - if (it == DiaRegToRegRelative.end()) - throw DiaException("Cannot convert DAI register ID to relative register ID"); + if (it == regToRegRelative.end()) + throw DiaException("Cannot convert DIA register ID to relative register ID"); return it->second; } @@ -678,70 +538,5 @@ bool DiaSymbol::isVirtualBaseClass() ////////////////////////////////////////////////////////////////////////////// -SymbolPtr DiaSession::findByRva( ULONG rva, ULONG symTag, LONG* pdisplacement ) -{ - DiaSymbolPtr child; - LONG displacement; - - HRESULT hres = - m_session->findSymbolByRVAEx( - rva, - static_cast(symTag), - &child, - &displacement); - - if (S_OK != hres) - throw DiaException("Call IDiaSession::findSymbolByRVAEx", hres); - if (!child) - throw DiaException("Call IDiaSession::findSymbolByRVAEx", E_UNEXPECTED); - if ( !pdisplacement && displacement) - throw DiaException("Call IDiaSession::findSymbolByRVAEx failed to find suymbol" ); - - if (pdisplacement) - *pdisplacement = displacement; - - return SymbolPtr( new DiaSymbol(child, m_globalSymbol->getMachineType() ) ); -} - -/////////////////////////////////////////////////////////////////////////////// - -void DiaSession::getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement ) -{ - DiaEnumLineNumbersPtr lines; - - HRESULT hres = m_session->findLinesByVA( offset, 1, &lines ); - if (S_OK != hres) - throw DiaException("failed to find source line"); - - DiaLineNumberPtr sourceLine; - hres = lines->Item( 0, &sourceLine ); - if (S_OK != hres) - throw DiaException("failed to find source line"); - - DiaSourceFilePtr sourceFile; - hres = sourceLine->get_sourceFile( &sourceFile ); - if (S_OK != hres) - throw DiaException("failed to find source line"); - - autoBstr fileNameBstr; - hres = sourceFile->get_fileName ( &fileNameBstr ); - if (S_OK != hres) - throw DiaException("failed to find source line"); - fileName = fileNameBstr.asStr(); - - hres = sourceLine->get_lineNumber( &lineNo ); - if (S_OK != hres) - throw DiaException("failed to find source line"); - - ULONGLONG va; - hres = sourceLine->get_virtualAddress ( &va ); - if (S_OK != hres) - throw DiaException("failed to find source line"); - - displacement = (LONG)( (LONGLONG)offset - (LONGLONG)va ); -} - -/////////////////////////////////////////////////////////////////////////////// - -}; // pykd nemaspace end +}; // pykd namespace end diff --git a/pykd/dia/diasymbol.h b/pykd/dia/diasymbol.h new file mode 100644 index 0000000..b1708fc --- /dev/null +++ b/pykd/dia/diasymbol.h @@ -0,0 +1,139 @@ + +#pragma once + +#include "dia\diadecls.h" + +namespace pykd { + +////////////////////////////////////////////////////////////////////////////// + +typedef std::map DiaRegToRegRelativeBase; + +////////////////////////////////////////////////////////////////////////////// + +class DiaSymbol : public Symbol { +public: + DiaSymbol( DiaSymbolPtr &_symbol, DWORD machineType ); + + static SymbolPtr fromGlobalScope( IDiaSymbol *_symbol ); + + SymbolPtr getChildByName(const std::string &_name ); + + ULONG getRva(); + + SymbolPtrList findChildren( + ULONG symTag, + const std::string &name = "", + bool caseSensitive = FALSE + ); + + ULONGLONG getSize(); + + std::string getName(); + + SymbolPtr getType(); + + SymbolPtr getIndexType(); + + ULONG getSymTag(); + + ULONGLONG getVa(); + + ULONG getLocType(); + + LONG getOffset(); + + ULONG getCount(); + + void getValue( BaseTypeVariant &vtValue ); + + bool isBasicType(); + + bool isIndirectVirtualBaseClass(); + + bool isVirtualBaseClass(); + + ULONG getBaseType(); + + ULONG getBitPosition(); + + ULONG getIndexId(); + + ULONG getUdtKind(); + + ULONG getDataKind(); + + //ULONG getRegisterId(); + virtual ULONG getRegRealativeId() override; + + ULONG getMachineType() { + return m_machineType; + } + + //SymbolPtr getChildByName(const std::string &_name); + + ULONG getChildCount( ULONG symTag ); + + ULONG getChildCount() { + return getChildCount(SymTagNull); + } + + SymbolPtr getChildByIndex(ULONG symTag, ULONG _index ); + + SymbolPtr getChildByIndex(ULONG _index ) { + return getChildByIndex( SymTagNull, _index ); + } + + bool isConstant(); + + //std::string print(); + + //bool eq(Symbol &rhs); + + int getVirtualBasePointerOffset(); + + ULONG getVirtualBaseDispIndex(); + + ULONG getVirtualBaseDispSize(); + + //ULONG getSection(); + + void setLoadAddress( ULONGLONG baseAddress ); + +public: + typedef std::pair ValueNameEntry; + + static const ValueNameEntry basicTypeName[]; + static const size_t cntBasicTypeName; + + static std::string getBasicTypeName( ULONG basicType ); + +protected: + static const DiaRegToRegRelativeBase ®ToRegRelativeAmd64; + static const DiaRegToRegRelativeBase ®ToRegRelativeI386; + ULONG getRegRealativeIdImpl(const DiaRegToRegRelativeBase &DiaRegToRegRelative); + + template + TRet callSymbolT( + HRESULT(STDMETHODCALLTYPE IDiaSymbol::*method)(TRet *), + const char *methodName + ) + { + TRet retValue; + HRESULT hres = (m_symbol->*method)(&retValue); + if (S_OK != hres) + throw DiaException(std::string("Call IDiaSymbol::") + methodName, hres, m_symbol); + + return retValue; + } + + DiaSymbolPtr m_symbol; + + DWORD m_machineType; +}; + + +//////////////////////////////////////////////////////////////////////////// + +} // end pykd namespace + diff --git a/pykd/dia/diawrapper.h b/pykd/dia/diawrapper.h deleted file mode 100644 index 5de817e..0000000 --- a/pykd/dia/diawrapper.h +++ /dev/null @@ -1,258 +0,0 @@ - -#pragma once - -#include "symengine.h" -#include "dbgexcept.h" - -#include - -namespace pykd { - -////////////////////////////////////////////////////////////////////////////// - -typedef CComPtr< IDiaSymbol > DiaSymbolPtr; -typedef CComPtr< IDiaEnumSymbols > DiaEnumSymbolsPtr; -typedef CComPtr< IDiaDataSource > DiaDataSourcePtr; -typedef CComPtr< IDiaSession > DiaSessionPtr; -typedef CComPtr< IDiaEnumSymbolsByAddr > DiaEnumSymbolsByAddrPtr; -typedef CComPtr< IDiaEnumLineNumbers > DiaEnumLineNumbersPtr; -typedef CComPtr< IDiaLineNumber> DiaLineNumberPtr; -typedef CComPtr< IDiaSourceFile > DiaSourceFilePtr; - -typedef std::map DiaRegToRegRelativeBase; - -////////////////////////////////////////////////////////////////////////////// - -class DiaException : public SymbolException { -public: - DiaException(const std::string &desc, HRESULT hres, IDiaSymbol *symbol = NULL) - : SymbolException( makeFullDesc(desc, hres, symbol) ) - , m_hres(hres) - { - } - - DiaException(const std::string &desc) - : SymbolException(descPrefix + desc) - , m_hres(S_FALSE) - { - } - - HRESULT getRes() const { - return m_hres; - } -private: - - static const std::string descPrefix; - - static std::string makeFullDesc(const std::string &desc, HRESULT hres, IDiaSymbol *symbol = NULL); - - HRESULT m_hres; -}; - -//////////////////////////////////////////////////////////////////////////// - -class DiaSymbol : public Symbol { -public: - DiaSymbol( DiaSymbolPtr &_symbol, DWORD machineType ); - - static SymbolPtr fromGlobalScope( IDiaSymbol *_symbol ); - - SymbolPtr getChildByName(const std::string &_name ); - - ULONG getRva(); - - SymbolPtrList findChildren( - ULONG symTag, - const std::string &name = "", - bool caseSensitive = FALSE - ); - - ULONGLONG getSize(); - - std::string getName(); - - SymbolPtr getType(); - - SymbolPtr getIndexType(); - - ULONG getSymTag(); - - ULONGLONG getVa(); - - ULONG getLocType(); - - LONG getOffset(); - - ULONG getCount(); - - void getValue( BaseTypeVariant &vtValue ); - - bool isBasicType(); - - bool isIndirectVirtualBaseClass(); - - bool isVirtualBaseClass(); - - ULONG getBaseType(); - - ULONG getBitPosition(); - - ULONG getIndexId(); - - ULONG getUdtKind(); - - ULONG getDataKind(); - - //ULONG getRegisterId(); - virtual ULONG getRegRealativeId() override; - - ULONG getMachineType() { - return m_machineType; - } - - //SymbolPtr getChildByName(const std::string &_name); - - ULONG getChildCount( ULONG symTag ); - - ULONG getChildCount() { - return getChildCount(SymTagNull); - } - - SymbolPtr getChildByIndex(ULONG symTag, ULONG _index ); - - SymbolPtr getChildByIndex(ULONG _index ) { - return getChildByIndex( SymTagNull, _index ); - } - - bool isConstant(); - - //std::string print(); - - //bool eq(Symbol &rhs); - - int getVirtualBasePointerOffset(); - - ULONG getVirtualBaseDispIndex(); - - ULONG getVirtualBaseDispSize(); - - //ULONG getSection(); - - void setLoadAddress( ULONGLONG baseAddress ); - -public: - typedef std::pair ValueNameEntry; - - //static const ValueNameEntry dataKindName[DataIsConstant + 1]; - - //static const ValueNameEntry symTagName[SymTagMax]; - - //static const ValueNameEntry locTypeName[LocTypeMax]; - - static const ValueNameEntry basicTypeName[]; - static const size_t cntBasicTypeName; - - //static const ValueNameEntry udtKindName[]; - //static const size_t cntUdtKindName; - - //static const ValueNameEntry i386RegName[]; - //static const size_t cntI386RegName; - - //static const ValueNameEntry amd64RegName[]; - //static const size_t cntAmd64RegName; - - static std::string getBasicTypeName( ULONG basicType ); - -protected: - - //// Check symbols loop - //class checkSymLoop - //{ - //public: - // checkSymLoop(checkSymLoop *prev) - // : m_symSetPtr( prev ? prev->m_symSetPtr : symSetPtr(new symSet) ) - // { - // } - - // bool check(IDiaSymbol *_symbol) - // { - // DWORD symIndexId = 0; - // _symbol->get_symIndexId(&symIndexId); - // return !m_symSetPtr->insert(symIndexId).second; - // } - - //private: - // typedef std::set symSet; - // typedef boost::shared_ptr symSetPtr; - // symSetPtr m_symSetPtr; - //}; - - //static std::string printImpl( - // IDiaSymbol *_symbol, - // DWORD machineType, - // ULONG indent = 0, - // checkSymLoop *checkLoopPrev = NULL, - // const char *prefix = NULL - //); - - ULONG getRegRealativeIdImpl(const DiaRegToRegRelativeBase &DiaRegToRegRelative); - - template - TRet callSymbolT( - HRESULT(STDMETHODCALLTYPE IDiaSymbol::*method)(TRet *), - const char *methodName - ) - { - TRet retValue; - HRESULT hres = (m_symbol->*method)(&retValue); - if (S_OK != hres) - throw DiaException(std::string("Call IDiaSymbol::") + methodName, hres, m_symbol); - - return retValue; - } - - DiaSymbolPtr m_symbol; - - DWORD m_machineType; -}; - -//////////////////////////////////////////////////////////////////////////// - -class DiaSession : public SymbolSession -{ -public: - - DiaSession( IDiaSession* session, IDiaSymbol *globalScope, const std::string symbolFile ) : - m_globalScope( globalScope ), - m_globalSymbol( DiaSymbol::fromGlobalScope( globalScope ) ), - m_session( session ), - m_symbolFileName( symbolFile ) - {} - - virtual SymbolPtr getSymbolScope() { - return m_globalSymbol; - } - - virtual SymbolPtr findByRva( ULONG rva, ULONG symTag = SymTagNull, LONG* displacement = NULL ); - - virtual void getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement ); - - virtual std::string getSymbolFileName() { - return m_symbolFileName; - } - -private: - - ULONG findRvaByName( const std::string &name ); - - DiaSymbolPtr m_globalScope; - SymbolPtr m_globalSymbol; - DiaSessionPtr m_session; - std::string m_symbolFileName; - -}; - -//////////////////////////////////////////////////////////////////////////// - -} // end pykd namespace - diff --git a/pykd/pykd_2008.vcproj b/pykd/pykd_2008.vcproj index a9afee0..db50989 100644 --- a/pykd/pykd_2008.vcproj +++ b/pykd/pykd_2008.vcproj @@ -625,16 +625,36 @@ RelativePath=".\dia\diadata.cpp" > + + + + + + + + + +