[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(
__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);
}
////////////////////////////////////////////////////////////////////////////////
}

View File

@ -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;
};

View File

@ -752,11 +752,16 @@ BOOST_PYTHON_MODULE( pykd )
.def("__hash__", &pyDia::Symbol::getIndexId);
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,
"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);