mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-21 04:13:22 +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(
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user