2013-12-17 15:49:24 +08:00
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
#include "kdlib/module.h"
|
|
|
|
#include "kdlib/exceptions.h"
|
|
|
|
|
|
|
|
#include "pytypeinfo.h"
|
|
|
|
|
|
|
|
namespace pykd {
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
std::wstring findSymbol( kdlib::MEMOFFSET_64 offset, bool showDisplacement )
|
|
|
|
{
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
|
|
|
|
kdlib::MEMDISPLACEMENT displacement = 0;
|
|
|
|
std::wstring symbolName;
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
kdlib::ModulePtr mod = kdlib::loadModule( offset );
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
symbolName = mod->findSymbol( offset, displacement );
|
|
|
|
|
|
|
|
std::wstringstream sstr;
|
|
|
|
|
|
|
|
sstr << mod->getName() << L'!' << symbolName;
|
|
|
|
|
|
|
|
if ( !showDisplacement || displacement == 0 )
|
|
|
|
return sstr.str();
|
|
|
|
|
|
|
|
if ( displacement > 0 )
|
|
|
|
sstr << L'+' << std::hex << displacement;
|
|
|
|
else
|
|
|
|
sstr << L'-' << std::hex << -displacement;
|
|
|
|
|
|
|
|
return sstr.str();
|
|
|
|
|
|
|
|
} catch( kdlib::DbgException& )
|
|
|
|
{
|
|
|
|
std::wstringstream sstr;
|
2014-11-11 18:07:52 +08:00
|
|
|
sstr << mod->getName();
|
|
|
|
if (showDisplacement)
|
|
|
|
sstr << '+' << std::hex << ( offset - mod->getBase() );
|
2013-12-17 15:49:24 +08:00
|
|
|
return sstr.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch( kdlib::DbgException& )
|
|
|
|
{
|
|
|
|
std::wstringstream sstr;
|
|
|
|
sstr << std::hex << offset;
|
|
|
|
return sstr.str();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
python::tuple findSymbolAndDisp( ULONG64 offset )
|
|
|
|
{
|
|
|
|
kdlib::MEMDISPLACEMENT displacement = 0;
|
|
|
|
std::wstring symbolName;
|
|
|
|
std::wstring moduleName;
|
|
|
|
|
|
|
|
do {
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
symbolName = kdlib::findSymbol( offset, displacement );
|
|
|
|
moduleName = kdlib::getModuleName( kdlib::findModuleBase( offset ) );
|
|
|
|
} while(false);
|
|
|
|
|
|
|
|
return python::make_tuple(moduleName,symbolName,displacement);
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2014-03-13 01:07:56 +08:00
|
|
|
python::list TypeInfoAdapter::getFields( kdlib::TypeInfo &typeInfo )
|
|
|
|
{
|
|
|
|
typedef boost::tuple<std::wstring,kdlib::TypeInfoPtr> FieldTuple;
|
|
|
|
|
|
|
|
std::list<FieldTuple> lst;
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
|
|
|
|
for ( size_t i = 0; i < typeInfo.getElementCount(); ++i )
|
|
|
|
{
|
|
|
|
std::wstring name = typeInfo.getElementName(i);
|
|
|
|
kdlib::TypeInfoPtr val = typeInfo.getElement(i);
|
|
|
|
|
|
|
|
lst.push_back( FieldTuple( name, val ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
} while(false);
|
|
|
|
|
|
|
|
python::list pylst;
|
|
|
|
|
|
|
|
for ( std::list<FieldTuple>::const_iterator it = lst.begin(); it != lst.end(); ++it)
|
|
|
|
pylst.append( python::make_tuple( it->get<0>(), it->get<1>() ) );
|
|
|
|
|
|
|
|
return pylst;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2013-12-17 15:49:24 +08:00
|
|
|
} // pykd namespace
|