mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-21 12:53:23 +08:00
[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:
parent
46a49fb421
commit
2248aa0845
@ -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);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user