2013-12-17 15:49:24 +08:00
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
#include "pymodule.h"
|
|
|
|
|
|
|
|
namespace pykd {
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2014-01-27 18:38:29 +08:00
|
|
|
FixedFileInfoPtr ModuleAdapter::getFixedFileInfo( kdlib::Module& module )
|
|
|
|
{
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
|
|
|
|
kdlib::FixedFileInfo fixedFileInfo;
|
|
|
|
module.getFixedFileInfo(fixedFileInfo);
|
|
|
|
|
|
|
|
return FixedFileInfoPtr( new kdlib::FixedFileInfo(fixedFileInfo) );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2013-12-17 15:49:24 +08:00
|
|
|
std::wstring ModuleAdapter::print( kdlib::Module& module )
|
|
|
|
{
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
|
|
|
|
std::wstringstream sstr;
|
|
|
|
|
|
|
|
//prepareSymbolFile();
|
|
|
|
|
|
|
|
sstr << L"Module: " << module.getName() << std::endl;
|
|
|
|
sstr << L"Start: " << std::hex << module.getBase() << L" End: " << module.getEnd() << L" Size: " << module.getSize() << std::endl;
|
|
|
|
//sstr << (m_unloaded ? ", UNLOADED!" : "") << std::endl;
|
|
|
|
sstr << L"Image: " << module.getImageName() << std::endl;
|
|
|
|
sstr << L"Symbols: " << module.getSymFile() << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
//if ( m_symSession )
|
|
|
|
//{
|
|
|
|
// sstr << "Symbols: " << m_symSession->getSymbolFileName() << std::endl;
|
|
|
|
// std::string buildDesc = m_symSession->getBuildDescription();
|
|
|
|
// if (!buildDesc.empty())
|
|
|
|
// sstr << "\t" << buildDesc << std::endl;
|
|
|
|
//}
|
|
|
|
//else
|
|
|
|
//{
|
|
|
|
// sstr << "Symbols: not found" << std::endl;
|
|
|
|
//}
|
|
|
|
|
|
|
|
sstr << L"Timestamp: " << module.getTimeDataStamp() << std::endl;
|
|
|
|
sstr << L"Check Sum: " << module.getCheckSum() << std::endl;
|
|
|
|
|
|
|
|
return sstr.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
python::list ModuleAdapter::enumSymbols( kdlib::Module& module, const std::wstring &mask )
|
|
|
|
{
|
|
|
|
kdlib::SymbolOffsetList offsetLst;
|
|
|
|
|
|
|
|
do {
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
offsetLst = module.enumSymbols( mask );
|
|
|
|
} while(false);
|
|
|
|
|
|
|
|
python::list pyLst;
|
|
|
|
for ( kdlib::SymbolOffsetList::const_iterator it = offsetLst.begin(); it != offsetLst.end(); ++it )
|
|
|
|
pyLst.append( python::make_tuple( it->first, it->second ) );
|
|
|
|
return pyLst;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring ModuleAdapter::findSymbol( kdlib::Module& module, kdlib::MEMOFFSET_64 offset, bool showDisplacement )
|
|
|
|
{
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
|
|
|
|
kdlib::MEMDISPLACEMENT displacement = 0;
|
|
|
|
|
|
|
|
std::wstring symbolName = module.findSymbol( offset, displacement );
|
|
|
|
if ( !showDisplacement || displacement == 0 )
|
|
|
|
return symbolName;
|
|
|
|
|
|
|
|
std::wstringstream wsstr;
|
|
|
|
|
|
|
|
wsstr << symbolName;
|
|
|
|
|
|
|
|
if ( displacement > 0 )
|
|
|
|
wsstr << L'+' << std::hex << displacement;
|
|
|
|
else
|
|
|
|
wsstr << L'-' << std::hex << -displacement;
|
|
|
|
|
|
|
|
return wsstr.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
python::tuple ModuleAdapter::findSymbolAndDisp( kdlib::Module& module, kdlib::MEMOFFSET_64 offset )
|
|
|
|
{
|
|
|
|
kdlib::MEMDISPLACEMENT displacement = 0;
|
|
|
|
std::wstring symbolName;
|
|
|
|
|
|
|
|
do {
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
symbolName = module.findSymbol( offset, displacement );
|
|
|
|
} while(false);
|
|
|
|
|
|
|
|
return python::make_tuple( symbolName, displacement );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
python::list ModuleAdapter::getTypedVarListByTypeName( kdlib::Module& module, kdlib::MEMOFFSET_64 offset, const std::wstring &typeName, const std::wstring &fieldName )
|
|
|
|
{
|
|
|
|
kdlib::TypedVarList lst;
|
|
|
|
|
|
|
|
do {
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
lst = module.loadTypedVarList( offset, typeName, fieldName );
|
|
|
|
} while(false);
|
|
|
|
|
|
|
|
return vectorToList( lst );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
python::list ModuleAdapter::getTypedVarArrayByTypeName( kdlib::Module& module, kdlib::MEMOFFSET_64 offset, const std::wstring &typeName, size_t number )
|
|
|
|
{
|
|
|
|
kdlib::TypedVarList lst;
|
|
|
|
|
|
|
|
do {
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
lst = module.loadTypedVarArray( offset, typeName, number );
|
|
|
|
} while(false);
|
|
|
|
|
|
|
|
return vectorToList( lst );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
} // namespace pykd
|