From 2248aa084516e142bf0709976469057b1493b00b Mon Sep 17 00:00:00 2001 From: "SND\\EreTIk_cp" Date: Tue, 17 Apr 2012 08:43:52 +0000 Subject: [PATCH] [0.1.x] + get/set load address for DIA global scope git-svn-id: https://pykd.svn.codeplex.com/svn@75579 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/diawrapper.cpp | 42 +++++++++++++++++++++++++++++++----------- pykd/diawrapper.h | 10 +++++++--- pykd/pymod.cpp | 9 +++++++-- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/pykd/diawrapper.cpp b/pykd/diawrapper.cpp index 0e2da88..b1d4316 100644 --- a/pykd/diawrapper.cpp +++ b/pykd/diawrapper.cpp @@ -331,11 +331,11 @@ bool Symbol::eq(Symbol &rhs) //////////////////////////////////////////////////////////////////////////////// GlobalScope::GlobalScope( - __inout DiaDataSourcePtr &_scope, + __inout DiaDataSourcePtr &dataSource, __inout DiaSessionPtr &_session, __inout DiaSymbolPtr &_globalScope ) : Symbol(_globalScope, CV_CFL_80386) - , m_source( _scope.Detach() ) + , m_dataSource( dataSource.Detach() ) , m_session( _session.Detach() ) { m_symbol->get_machineType(&m_machineType); @@ -349,8 +349,8 @@ GlobalScopePtr GlobalScope::loadPdb(const std::string &filePath) public: CLoaderFromPdb(const std::string &filePath) : m_filePath(filePath) {} - virtual void loadData(IDiaDataSource *_scope) override { - HRESULT hres = _scope->loadDataFromPdb( toWStr(m_filePath) ); + virtual void loadData(IDiaDataSource *dataSource) override { + HRESULT hres = dataSource->loadDataFromPdb( toWStr(m_filePath) ); if ( S_OK != hres ) throw Exception("Call IDiaDataSource::loadDataFromPdb", hres); } @@ -376,10 +376,10 @@ GlobalScopePtr GlobalScope::loadExe(const std::string &filePath, PCSTR searchPat { } - virtual void loadData(IDiaDataSource *_scope) override { + virtual void loadData(IDiaDataSource *dataSource) override { LoadCallback loadCallback; HRESULT hres = - _scope->loadDataForExe( toWStr(m_filePath), toWStr(m_searchPath), &loadCallback ); + dataSource->loadDataForExe( toWStr(m_filePath), toWStr(m_searchPath), &loadCallback ); if ( S_OK != hres ) throw Exception("Call IDiaDataSource::loadDataForExe", hres); } @@ -396,17 +396,17 @@ GlobalScopePtr GlobalScope::loadExe(const std::string &filePath, PCSTR searchPat GlobalScopePtr GlobalScope::loadImpl(IScopeDataLoader &ScopeDataLoader) { - DiaDataSourcePtr _scope; + DiaDataSourcePtr dataSource; HRESULT hres = - _scope.CoCreateInstance(__uuidof(DiaSource), NULL, CLSCTX_INPROC_SERVER); + dataSource.CoCreateInstance(__uuidof(DiaSource), NULL, CLSCTX_INPROC_SERVER); if ( S_OK != hres ) throw Exception("Call ::CoCreateInstance", hres); - ScopeDataLoader.loadData(_scope); + ScopeDataLoader.loadData(dataSource); DiaSessionPtr _session; - hres = _scope->openSession(&_session); + hres = dataSource->openSession(&_session); if ( S_OK != hres ) throw Exception("Call IDiaDataSource::openSession", hres); @@ -415,7 +415,7 @@ GlobalScopePtr GlobalScope::loadImpl(IScopeDataLoader &ScopeDataLoader) if ( S_OK != hres ) throw Exception("Call IDiaSymbol::get_globalScope", hres); - return GlobalScopePtr( new GlobalScope(_scope, _session, _globalScope) ); + return GlobalScopePtr( new GlobalScope(dataSource, _session, _globalScope) ); } //////////////////////////////////////////////////////////////////////////////// @@ -457,4 +457,24 @@ SymbolPtr GlobalScope::getSymbolById(ULONG symId) //////////////////////////////////////////////////////////////////////////////// +ULONGLONG GlobalScope::getLoadAddress() +{ + ULONGLONG loadAddress; + HRESULT hres = m_session->get_loadAddress(&loadAddress); + if (S_OK != hres) + throw Exception("Call IDiaSession::get_loadAddress", hres); + return loadAddress; +} + +//////////////////////////////////////////////////////////////////////////////// + +void GlobalScope::setLoadAddress(ULONGLONG loadAddress) +{ + HRESULT hres = m_session->put_loadAddress(loadAddress); + if (S_OK != hres) + throw Exception("Call IDiaSession::put_loadAddress", hres); +} + +//////////////////////////////////////////////////////////////////////////////// + } diff --git a/pykd/diawrapper.h b/pykd/diawrapper.h index 977fc0a..4371844 100644 --- a/pykd/diawrapper.h +++ b/pykd/diawrapper.h @@ -267,20 +267,24 @@ public: // get symbol by unique index SymbolPtr getSymbolById(ULONG symId); + // get/set load address + ULONGLONG getLoadAddress(); + void setLoadAddress(ULONGLONG loadAddress); + private: interface IScopeDataLoader { virtual ~IScopeDataLoader() {} - virtual void loadData(IDiaDataSource *_scope) = 0; + virtual void loadData(IDiaDataSource *dataSource) = 0; }; static GlobalScopePtr loadImpl(IScopeDataLoader &ScopeDataLoader); GlobalScope( - __inout DiaDataSourcePtr &_scope, + __inout DiaDataSourcePtr &dataSource, __inout DiaSessionPtr &_session, __inout DiaSymbolPtr &_globalScope ); - DiaDataSourcePtr m_source; + DiaDataSourcePtr m_dataSource; DiaSessionPtr m_session; }; diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 2f45a39..a80d4a1 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -752,11 +752,16 @@ BOOST_PYTHON_MODULE( pykd ) .def("__hash__", &pyDia::Symbol::getIndexId); python::class_ >( - "DiaScope", "class wrapper for MS DIA Symbol", python::no_init ) + "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("symbolById", &pyDia::GlobalScope::getSymbolById, - "Retrieves a symbol by its unique identifier: DiaSymbol::indexId()"); + "Retrieves a symbol by its unique identifier: DiaSymbol::indexId()") + .def("loadAddress", &pyDia::GlobalScope::getLoadAddress, + "Retrieves the load address for the executable file that corresponds to the symbols in this symbol store") + .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);