[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
This commit is contained in:
SND\EreTIk_cp 2012-04-17 08:43:52 +00:00 committed by Mikhail I. Izmestev
parent 46a49fb421
commit 2248aa0845
3 changed files with 45 additions and 16 deletions

View File

@ -331,11 +331,11 @@ bool Symbol::eq(Symbol &rhs)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
GlobalScope::GlobalScope( GlobalScope::GlobalScope(
__inout DiaDataSourcePtr &_scope, __inout DiaDataSourcePtr &dataSource,
__inout DiaSessionPtr &_session, __inout DiaSessionPtr &_session,
__inout DiaSymbolPtr &_globalScope __inout DiaSymbolPtr &_globalScope
) : Symbol(_globalScope, CV_CFL_80386) ) : Symbol(_globalScope, CV_CFL_80386)
, m_source( _scope.Detach() ) , m_dataSource( dataSource.Detach() )
, m_session( _session.Detach() ) , m_session( _session.Detach() )
{ {
m_symbol->get_machineType(&m_machineType); m_symbol->get_machineType(&m_machineType);
@ -349,8 +349,8 @@ GlobalScopePtr GlobalScope::loadPdb(const std::string &filePath)
public: public:
CLoaderFromPdb(const std::string &filePath) : m_filePath(filePath) {} CLoaderFromPdb(const std::string &filePath) : m_filePath(filePath) {}
virtual void loadData(IDiaDataSource *_scope) override { virtual void loadData(IDiaDataSource *dataSource) override {
HRESULT hres = _scope->loadDataFromPdb( toWStr(m_filePath) ); HRESULT hres = dataSource->loadDataFromPdb( toWStr(m_filePath) );
if ( S_OK != hres ) if ( S_OK != hres )
throw Exception("Call IDiaDataSource::loadDataFromPdb", 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; LoadCallback loadCallback;
HRESULT hres = HRESULT hres =
_scope->loadDataForExe( toWStr(m_filePath), toWStr(m_searchPath), &loadCallback ); dataSource->loadDataForExe( toWStr(m_filePath), toWStr(m_searchPath), &loadCallback );
if ( S_OK != hres ) if ( S_OK != hres )
throw Exception("Call IDiaDataSource::loadDataForExe", 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) GlobalScopePtr GlobalScope::loadImpl(IScopeDataLoader &ScopeDataLoader)
{ {
DiaDataSourcePtr _scope; DiaDataSourcePtr dataSource;
HRESULT hres = HRESULT hres =
_scope.CoCreateInstance(__uuidof(DiaSource), NULL, CLSCTX_INPROC_SERVER); dataSource.CoCreateInstance(__uuidof(DiaSource), NULL, CLSCTX_INPROC_SERVER);
if ( S_OK != hres ) if ( S_OK != hres )
throw Exception("Call ::CoCreateInstance", hres); throw Exception("Call ::CoCreateInstance", hres);
ScopeDataLoader.loadData(_scope); ScopeDataLoader.loadData(dataSource);
DiaSessionPtr _session; DiaSessionPtr _session;
hres = _scope->openSession(&_session); hres = dataSource->openSession(&_session);
if ( S_OK != hres ) if ( S_OK != hres )
throw Exception("Call IDiaDataSource::openSession", hres); throw Exception("Call IDiaDataSource::openSession", hres);
@ -415,7 +415,7 @@ GlobalScopePtr GlobalScope::loadImpl(IScopeDataLoader &ScopeDataLoader)
if ( S_OK != hres ) if ( S_OK != hres )
throw Exception("Call IDiaSymbol::get_globalScope", 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);
}
////////////////////////////////////////////////////////////////////////////////
} }

View File

@ -267,20 +267,24 @@ public:
// get symbol by unique index // get symbol by unique index
SymbolPtr getSymbolById(ULONG symId); SymbolPtr getSymbolById(ULONG symId);
// get/set load address
ULONGLONG getLoadAddress();
void setLoadAddress(ULONGLONG loadAddress);
private: private:
interface IScopeDataLoader { interface IScopeDataLoader {
virtual ~IScopeDataLoader() {} virtual ~IScopeDataLoader() {}
virtual void loadData(IDiaDataSource *_scope) = 0; virtual void loadData(IDiaDataSource *dataSource) = 0;
}; };
static GlobalScopePtr loadImpl(IScopeDataLoader &ScopeDataLoader); static GlobalScopePtr loadImpl(IScopeDataLoader &ScopeDataLoader);
GlobalScope( GlobalScope(
__inout DiaDataSourcePtr &_scope, __inout DiaDataSourcePtr &dataSource,
__inout DiaSessionPtr &_session, __inout DiaSessionPtr &_session,
__inout DiaSymbolPtr &_globalScope __inout DiaSymbolPtr &_globalScope
); );
DiaDataSourcePtr m_source; DiaDataSourcePtr m_dataSource;
DiaSessionPtr m_session; DiaSessionPtr m_session;
}; };

View File

@ -752,11 +752,16 @@ BOOST_PYTHON_MODULE( pykd )
.def("__hash__", &pyDia::Symbol::getIndexId); .def("__hash__", &pyDia::Symbol::getIndexId);
python::class_<pyDia::GlobalScope, pyDia::GlobalScopePtr, python::bases<pyDia::Symbol> >( python::class_<pyDia::GlobalScope, pyDia::GlobalScopePtr, python::bases<pyDia::Symbol> >(
"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, .def("findByRva", &pyDia::GlobalScope::findByRva,
"Find symbol by RVA. Return tuple: (DiaSymbol, offset)") "Find symbol by RVA. Return tuple: (DiaSymbol, offset)")
.def("symbolById", &pyDia::GlobalScope::getSymbolById, .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: // CPU type:
DEF_PY_CONST_ULONG(IMAGE_FILE_MACHINE_I386); DEF_PY_CONST_ULONG(IMAGE_FILE_MACHINE_I386);