2010-07-06 22:49:02 +08:00
|
|
|
#include "stdafx.h"
|
|
|
|
|
2011-09-19 15:05:22 +08:00
|
|
|
#include "module.h"
|
2011-09-21 23:53:02 +08:00
|
|
|
#include "dbgclient.h"
|
|
|
|
#include "dbgmem.h"
|
2011-09-19 15:05:22 +08:00
|
|
|
|
2011-09-21 23:53:02 +08:00
|
|
|
namespace pykd {
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
Module loadModule( const std::string &moduleName ) {
|
|
|
|
return g_dbgClient->loadModule( moduleName );
|
|
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
Module findModule( ULONG64 offset ) {
|
|
|
|
return g_dbgClient->findModule( offset );
|
|
|
|
}
|
2011-09-19 15:05:22 +08:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-10-10 19:19:12 +08:00
|
|
|
Module::Module( IDebugClient4 *client, const std::string& moduleName ) : DbgObject( client )
|
2011-09-19 15:05:22 +08:00
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
m_name = moduleName;
|
|
|
|
|
|
|
|
hres = m_symbols->GetModuleByModuleName( moduleName.c_str(), 0, NULL, &m_base );
|
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugSymbol::GetModuleByModuleName failed" );
|
|
|
|
|
|
|
|
DEBUG_MODULE_PARAMETERS moduleParam = { 0 };
|
|
|
|
hres = m_symbols->GetModuleParameters( 1, &m_base, 0, &moduleParam );
|
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugSymbol::GetModuleParameters failed" );
|
|
|
|
|
|
|
|
m_size = moduleParam.Size;
|
2011-09-26 16:46:32 +08:00
|
|
|
|
|
|
|
char imageName[0x100];
|
|
|
|
|
|
|
|
hres = m_symbols->GetModuleNameString(
|
|
|
|
DEBUG_MODNAME_IMAGE,
|
|
|
|
DEBUG_ANY_ID,
|
|
|
|
m_base,
|
|
|
|
imageName,
|
|
|
|
sizeof( imageName ),
|
|
|
|
NULL );
|
|
|
|
|
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugSymbol::GetModuleNameString failed" );
|
|
|
|
|
|
|
|
m_imageName = std::string( imageName );
|
2011-09-19 15:05:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-10-10 19:19:12 +08:00
|
|
|
Module::Module( IDebugClient4 *client, ULONG64 offset ) : DbgObject( client )
|
2011-09-21 23:53:02 +08:00
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
offset = addr64( offset );
|
|
|
|
|
|
|
|
ULONG moduleIndex;
|
|
|
|
hres = m_symbols->GetModuleByOffset( offset, 0, &moduleIndex, &m_base );
|
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugSymbol::GetModuleByOffset failed" );
|
|
|
|
|
|
|
|
char moduleName[0x100];
|
|
|
|
|
|
|
|
hres = m_symbols->GetModuleNameString(
|
|
|
|
DEBUG_MODNAME_MODULE,
|
|
|
|
moduleIndex,
|
|
|
|
0,
|
|
|
|
moduleName,
|
|
|
|
sizeof( moduleName ),
|
|
|
|
NULL );
|
|
|
|
|
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugSymbol::GetModuleNameString failed" );
|
|
|
|
|
|
|
|
m_name = std::string( moduleName );
|
|
|
|
|
2011-09-26 16:46:32 +08:00
|
|
|
char imageName[0x100];
|
|
|
|
|
|
|
|
hres = m_symbols->GetModuleNameString(
|
|
|
|
DEBUG_MODNAME_IMAGE,
|
|
|
|
DEBUG_ANY_ID,
|
|
|
|
m_base,
|
|
|
|
imageName,
|
|
|
|
sizeof( imageName ),
|
|
|
|
NULL );
|
|
|
|
|
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugSymbol::GetModuleNameString failed" );
|
|
|
|
|
|
|
|
m_imageName = std::string( imageName );
|
|
|
|
|
2011-09-21 23:53:02 +08:00
|
|
|
DEBUG_MODULE_PARAMETERS moduleParam = { 0 };
|
|
|
|
hres = m_symbols->GetModuleParameters( 1, &m_base, 0, &moduleParam );
|
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugSymbol::GetModuleParameters failed" );
|
|
|
|
|
|
|
|
m_size = moduleParam.Size;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-09-26 16:46:32 +08:00
|
|
|
std::string
|
2011-09-21 23:53:02 +08:00
|
|
|
Module::getPdbName()
|
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
IMAGEHLP_MODULEW64 moduleInfo = {};
|
|
|
|
|
|
|
|
hres = m_advanced->GetSymbolInformation(
|
|
|
|
DEBUG_SYMINFO_IMAGEHLP_MODULEW64,
|
|
|
|
m_base,
|
|
|
|
0,
|
|
|
|
&moduleInfo,
|
|
|
|
sizeof(moduleInfo),
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
NULL );
|
|
|
|
|
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugAdvanced2::GetSymbolInformation failed" );
|
|
|
|
|
2011-11-08 18:53:07 +08:00
|
|
|
char pdbName[ 256 ];
|
2011-09-26 16:46:32 +08:00
|
|
|
WideCharToMultiByte( CP_ACP, 0, moduleInfo.LoadedPdbName, 256, pdbName, 256, NULL, NULL );
|
|
|
|
|
|
|
|
return std::string( pdbName );
|
2011-09-21 23:53:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
void
|
|
|
|
Module::reloadSymbols()
|
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
|
2011-09-26 16:46:32 +08:00
|
|
|
std::string param = "/f ";
|
|
|
|
param += m_imageName;
|
|
|
|
|
|
|
|
hres = m_symbols->Reload( param.c_str() );
|
2011-09-21 23:53:02 +08:00
|
|
|
if ( FAILED( hres ) )
|
2011-09-26 16:46:32 +08:00
|
|
|
throw DbgException("IDebugSymbols::Reload failed" );
|
2011-09-21 23:53:02 +08:00
|
|
|
|
2011-11-08 18:53:07 +08:00
|
|
|
m_dia.reset();
|
2011-09-26 16:46:32 +08:00
|
|
|
m_dia = pyDia::GlobalScope::loadPdb( getPdbName() );
|
2011-09-21 23:53:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-10-19 16:13:02 +08:00
|
|
|
TypedVar
|
2011-11-07 14:46:53 +08:00
|
|
|
Module::getTypedVarByTypeName( const std::string &typeName, ULONG64 addr )
|
2011-10-19 16:13:02 +08:00
|
|
|
{
|
2011-11-16 14:42:00 +08:00
|
|
|
return TypedVar( getTypeByName(typeName), addr );
|
2011-10-19 16:13:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-11-07 14:46:53 +08:00
|
|
|
TypedVar
|
2011-11-16 14:42:00 +08:00
|
|
|
Module::getTypedVarByType( const TypeInfoPtr &typeInfo, ULONG64 addr )
|
2011-11-07 14:46:53 +08:00
|
|
|
{
|
|
|
|
return TypedVar( typeInfo, addr );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-10-19 16:13:02 +08:00
|
|
|
TypedVar
|
|
|
|
Module::getTypedVarByName( const std::string &symName )
|
|
|
|
{
|
2011-11-08 18:53:07 +08:00
|
|
|
pyDia::SymbolPtr typeSym = getDia()->getChildByName( symName );
|
2011-10-03 15:40:27 +08:00
|
|
|
|
2011-11-16 14:42:00 +08:00
|
|
|
return TypedVar( TypeInfo::getTypeInfo( typeSym->getType() ), typeSym->getRva() + m_base );
|
2011-10-03 15:40:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-11-08 18:53:07 +08:00
|
|
|
TypedVar
|
|
|
|
Module::getTypedVarByAddr( ULONG64 addr )
|
|
|
|
{
|
|
|
|
addr = addr64(addr);
|
|
|
|
|
|
|
|
if ( addr < m_base || addr > getEnd() )
|
|
|
|
throw DbgException( "address is out of the module space" );
|
|
|
|
|
|
|
|
LONG displacement;
|
|
|
|
pyDia::SymbolPtr diaSym =
|
|
|
|
getDia()->findByRvaImpl((ULONG)(addr - m_base), SymTagData, displacement);
|
|
|
|
if (displacement)
|
|
|
|
throw DbgException( "not exactly match by RVA" );
|
|
|
|
|
2011-11-16 14:42:00 +08:00
|
|
|
return TypedVar( TypeInfo::getTypeInfo( diaSym->getType() ), addr );
|
2011-11-08 18:53:07 +08:00
|
|
|
}
|
2011-11-07 14:46:53 +08:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-09-21 23:53:02 +08:00
|
|
|
}; // end of namespace pykd
|
|
|
|
|