From 80acef377a181df1a5a6cf81f1456d22d50f8b67 Mon Sep 17 00:00:00 2001 From: "SND\\EreTIk_cp" Date: Tue, 17 Apr 2012 16:57:51 +0000 Subject: [PATCH] [0.1.x] + find DIA-symbol by VA git-svn-id: https://pykd.svn.codeplex.com/svn@75587 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/diawrapper.cpp | 23 +++++++++++++++++++++++ pykd/diawrapper.h | 16 ++++++++++++++++ pykd/pymod.cpp | 3 ++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/pykd/diawrapper.cpp b/pykd/diawrapper.cpp index 7911808..67acb85 100644 --- a/pykd/diawrapper.cpp +++ b/pykd/diawrapper.cpp @@ -450,6 +450,29 @@ SymbolPtr GlobalScope::findByRvaImpl( //////////////////////////////////////////////////////////////////////////////// +SymbolPtr GlobalScope::findByVaImpl( + __in ULONGLONG va, + __in ULONG symTag, + __out LONG &displacement +) +{ + DiaSymbolPtr child; + HRESULT hres = + m_session->findSymbolByVAEx( + va, + static_cast(symTag), + &child, + &displacement); + if (S_OK != hres) + throw Exception("Call IDiaSession::findSymbolByVAEx", hres); + if (!child) + throw Exception("Call IDiaSession::findSymbolByVAEx", E_UNEXPECTED); + + return SymbolPtr( new Symbol(child, m_machineType) ); +} + +//////////////////////////////////////////////////////////////////////////////// + SymbolPtr GlobalScope::getSymbolById(ULONG symId) { DiaSymbolPtr _symbol; diff --git a/pykd/diawrapper.h b/pykd/diawrapper.h index 8707274..d9a54f7 100644 --- a/pykd/diawrapper.h +++ b/pykd/diawrapper.h @@ -265,6 +265,22 @@ public: __out LONG &displacement ); + // VA -> Symbol + python::tuple findByVa( + ULONG va, + ULONG symTag + ) + { + LONG displacement; + SymbolPtr child = findByVaImpl(va, symTag, displacement); + return python::make_tuple(child, displacement); + } + SymbolPtr findByVaImpl( + __in ULONGLONG va, + __in ULONG symTag, + __out LONG &displacement + ); + // get symbol by unique index SymbolPtr getSymbolById(ULONG symId); diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 529f083..1ab5043 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -757,6 +757,8 @@ BOOST_PYTHON_MODULE( pykd ) "DiaScope", "class wrapper for MS DIA global scope", python::no_init ) .def("findByRva", &pyDia::GlobalScope::findByRva, "Find symbol by RVA. Return tuple: (DiaSymbol, offset)") + .def("findByVa", &pyDia::GlobalScope::findByVa, + "Find symbol by VA. Return tuple: (DiaSymbol, offset)") .def("symbolById", &pyDia::GlobalScope::getSymbolById, "Retrieves a symbol by its unique identifier: DiaSymbol::indexId()") .def("loadAddress", &pyDia::GlobalScope::getLoadAddress, @@ -764,7 +766,6 @@ BOOST_PYTHON_MODULE( pykd ) .def("setLoadAddress", &pyDia::GlobalScope::setLoadAddress, "Sets the load address for the executable file that corresponds to the symbols in this symbol store"); - // CPU type: DEF_PY_CONST_ULONG(IMAGE_FILE_MACHINE_I386); DEF_PY_CONST_ULONG(IMAGE_FILE_MACHINE_IA64);