mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-29 11:53:23 +08:00
[0.1.x] added : disasm class
git-svn-id: https://pykd.svn.codeplex.com/svn@70760 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
d722dd73df
commit
95c135ed38
@ -12,6 +12,7 @@
|
|||||||
#include "dbgio.h"
|
#include "dbgio.h"
|
||||||
#include "dbgcmd.h"
|
#include "dbgcmd.h"
|
||||||
#include "pyaux.h"
|
#include "pyaux.h"
|
||||||
|
#include "disasm.h"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -59,6 +60,18 @@ public:
|
|||||||
|
|
||||||
void attachKernel( const std::wstring ¶m );
|
void attachKernel( const std::wstring ¶m );
|
||||||
|
|
||||||
|
Disasm disasm( ULONG offset = 0 ) {
|
||||||
|
return Disasm( m_client, offset );
|
||||||
|
}
|
||||||
|
|
||||||
|
void dprint( const std::wstring &str, bool dml = false );
|
||||||
|
|
||||||
|
void dprintln( const std::wstring &str, bool dml = false );
|
||||||
|
|
||||||
|
void eprint( const std::wstring &str );
|
||||||
|
|
||||||
|
void eprintln( const std::wstring &str );
|
||||||
|
|
||||||
ULONG64 evaluate( const std::wstring &expression );
|
ULONG64 evaluate( const std::wstring &expression );
|
||||||
|
|
||||||
python::tuple getDebuggeeType();
|
python::tuple getDebuggeeType();
|
||||||
@ -98,14 +111,6 @@ public:
|
|||||||
|
|
||||||
std::wstring loadWChars( ULONG64 offset, ULONG count, bool phyAddr = FALSE );
|
std::wstring loadWChars( ULONG64 offset, ULONG count, bool phyAddr = FALSE );
|
||||||
|
|
||||||
void dprint( const std::wstring &str, bool dml = false );
|
|
||||||
|
|
||||||
void dprintln( const std::wstring &str, bool dml = false );
|
|
||||||
|
|
||||||
void eprint( const std::wstring &str );
|
|
||||||
|
|
||||||
void eprintln( const std::wstring &str );
|
|
||||||
|
|
||||||
void readMemory( ULONG64 address, PVOID buffer, ULONG length, bool phyAddr = FALSE );
|
void readMemory( ULONG64 address, PVOID buffer, ULONG length, bool phyAddr = FALSE );
|
||||||
|
|
||||||
void setExecutionStatus( ULONG status );
|
void setExecutionStatus( ULONG status );
|
||||||
|
@ -266,6 +266,17 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
"Unload module event. Parameter is instance of dbgModuleClass.\n"
|
"Unload module event. Parameter is instance of dbgModuleClass.\n"
|
||||||
"For ignore event method must return DEBUG_STATUS_NO_CHANGE value" );
|
"For ignore event method must return DEBUG_STATUS_NO_CHANGE value" );
|
||||||
|
|
||||||
|
python::class_<Disasm>("disasm", "Class disassemble a processor instructions" )
|
||||||
|
.def( python::init<>( "constructor" ) )
|
||||||
|
.def( python::init<ULONG64>( boost::python::args("offset"), "constructor" ) )
|
||||||
|
.def( "disasm", &Disasm::disassemble, "Disassemble next instruction" )
|
||||||
|
.def( "asm", &Disasm::assembly, "Insert assemblied instuction to current offset" )
|
||||||
|
.def( "begin", &Disasm::begin, "Return begin offset" )
|
||||||
|
.def( "current", &Disasm::current, "Return current offset" )
|
||||||
|
.def( "length", &Disasm::length, "Return current instruction length" )
|
||||||
|
.def( "instruction", &Disasm::instruction, "Returm current disassembled instruction" )
|
||||||
|
.def( "ea", &Disasm::ea, "Return effective address for last disassembled instruction or 0" )
|
||||||
|
.def( "reset", &Disasm::reset, "Reset current offset to begin" );
|
||||||
|
|
||||||
python::def( "diaLoadPdb", &pyDia::GlobalScope::loadPdb,
|
python::def( "diaLoadPdb", &pyDia::GlobalScope::loadPdb,
|
||||||
"Open pdb file for quering debug symbols. Return DiaSymbol of global scope");
|
"Open pdb file for quering debug symbols. Return DiaSymbol of global scope");
|
||||||
|
@ -35,6 +35,10 @@ protected:
|
|||||||
hres = client->QueryInterface( __uuidof(IDebugDataSpaces), (void**)&m_dataSpaces );
|
hres = client->QueryInterface( __uuidof(IDebugDataSpaces), (void**)&m_dataSpaces );
|
||||||
if ( FAILED( hres ) )
|
if ( FAILED( hres ) )
|
||||||
throw DbgException("QueryInterface IDebugDataSpaces failed");
|
throw DbgException("QueryInterface IDebugDataSpaces failed");
|
||||||
|
|
||||||
|
hres = client->QueryInterface( __uuidof(IDebugRegisters), (void**)&m_registers );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException("QueryInterface IDebugDataSpaces failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~DbgObject() {};
|
virtual ~DbgObject() {};
|
||||||
@ -45,6 +49,7 @@ protected:
|
|||||||
CComPtr<IDebugSymbols3> m_symbols;
|
CComPtr<IDebugSymbols3> m_symbols;
|
||||||
CComPtr<IDebugAdvanced2> m_advanced;
|
CComPtr<IDebugAdvanced2> m_advanced;
|
||||||
CComPtr<IDebugDataSpaces> m_dataSpaces;
|
CComPtr<IDebugDataSpaces> m_dataSpaces;
|
||||||
|
CComPtr<IDebugRegisters> m_registers;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "dbgext.h"
|
|
||||||
#include "disasm.h"
|
#include "disasm.h"
|
||||||
#include "dbgexcept.h"
|
#include "dbgexcept.h"
|
||||||
|
#include "dbgmem.h"
|
||||||
|
#include "dbgclient.h"
|
||||||
|
|
||||||
|
namespace pykd {
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
disasm::disasm( ULONG64 offset )
|
Disasm::Disasm( IDebugClient4 *client, ULONG64 offset ) :
|
||||||
|
DbgObject( client )
|
||||||
{
|
{
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
@ -13,7 +17,7 @@ disasm::disasm( ULONG64 offset )
|
|||||||
|
|
||||||
if ( m_beginOffset == 0 )
|
if ( m_beginOffset == 0 )
|
||||||
{
|
{
|
||||||
hres = dbgExt->registers->GetInstructionOffset( &m_beginOffset );
|
hres = m_registers->GetInstructionOffset( &m_beginOffset );
|
||||||
if ( FAILED( hres ) )
|
if ( FAILED( hres ) )
|
||||||
throw DbgException( "IDebugRegisters::GetInstructionOffset failed" );
|
throw DbgException( "IDebugRegisters::GetInstructionOffset failed" );
|
||||||
}
|
}
|
||||||
@ -25,7 +29,28 @@ disasm::disasm( ULONG64 offset )
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void disasm::doDisasm()
|
Disasm::Disasm( ULONG64 offset ) :
|
||||||
|
DbgObject( g_dbgClient->client() )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
m_beginOffset = addr64(offset);
|
||||||
|
|
||||||
|
if ( m_beginOffset == 0 )
|
||||||
|
{
|
||||||
|
hres = m_registers->GetInstructionOffset( &m_beginOffset );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugRegisters::GetInstructionOffset failed" );
|
||||||
|
}
|
||||||
|
|
||||||
|
m_currentOffset = m_beginOffset;
|
||||||
|
|
||||||
|
doDisasm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void Disasm::doDisasm()
|
||||||
{
|
{
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
char buffer[0x100];
|
char buffer[0x100];
|
||||||
@ -33,7 +58,7 @@ void disasm::doDisasm()
|
|||||||
ULONG64 endOffset = 0;
|
ULONG64 endOffset = 0;
|
||||||
|
|
||||||
hres =
|
hres =
|
||||||
dbgExt->control->Disassemble(
|
m_control->Disassemble(
|
||||||
m_currentOffset,
|
m_currentOffset,
|
||||||
DEBUG_DISASM_EFFECTIVE_ADDRESS,
|
DEBUG_DISASM_EFFECTIVE_ADDRESS,
|
||||||
buffer,
|
buffer,
|
||||||
@ -44,7 +69,7 @@ void disasm::doDisasm()
|
|||||||
if ( FAILED( hres ) )
|
if ( FAILED( hres ) )
|
||||||
throw DbgException( "IDebugControl::Disassemble failed" );
|
throw DbgException( "IDebugControl::Disassemble failed" );
|
||||||
|
|
||||||
hres = dbgExt->control->GetDisassembleEffectiveOffset( &m_ea );
|
hres = m_control->GetDisassembleEffectiveOffset( &m_ea );
|
||||||
if ( FAILED( hres ) )
|
if ( FAILED( hres ) )
|
||||||
m_ea = 0;
|
m_ea = 0;
|
||||||
|
|
||||||
@ -56,12 +81,12 @@ void disasm::doDisasm()
|
|||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
disasm::assembly( const std::string &instr )
|
Disasm::assembly( const std::string &instr )
|
||||||
{
|
{
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
ULONG64 endOffset = 0;
|
ULONG64 endOffset = 0;
|
||||||
hres = dbgExt->control->Assemble( m_currentOffset, instr.c_str(), &endOffset );
|
hres = m_control->Assemble( m_currentOffset, instr.c_str(), &endOffset );
|
||||||
if ( FAILED( hres ) )
|
if ( FAILED( hres ) )
|
||||||
throw DbgException( "IDebugControl::Assemble failed" );
|
throw DbgException( "IDebugControl::Assemble failed" );
|
||||||
|
|
||||||
@ -74,3 +99,4 @@ disasm::assembly( const std::string &instr )
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
}; // end pykd namespace
|
||||||
|
@ -1,14 +1,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "dbgmem.h"
|
#include "dbgobj.h"
|
||||||
|
|
||||||
|
namespace pykd {
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class disasm {
|
class Disasm : private DbgObject {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
disasm( ULONG64 offset = 0);
|
Disasm( IDebugClient4 *client, ULONG64 offset = 0 );
|
||||||
|
|
||||||
|
Disasm( ULONG64 offset = 0);
|
||||||
|
|
||||||
std::string disassemble() {
|
std::string disassemble() {
|
||||||
std::string s = m_disasm;
|
std::string s = m_disasm;
|
||||||
@ -60,3 +64,6 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
} ; // end pykd namespace
|
||||||
|
|
||||||
|
@ -80,8 +80,6 @@ private:
|
|||||||
ULONG64 m_base;
|
ULONG64 m_base;
|
||||||
ULONG m_size;
|
ULONG m_size;
|
||||||
pyDia::GlobalScopePtr m_dia;
|
pyDia::GlobalScopePtr m_dia;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -393,6 +393,10 @@
|
|||||||
RelativePath=".\diawrapper.cpp"
|
RelativePath=".\diawrapper.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\disasm.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\module.cpp"
|
RelativePath=".\module.cpp"
|
||||||
>
|
>
|
||||||
@ -487,6 +491,10 @@
|
|||||||
RelativePath=".\diawrapper.h"
|
RelativePath=".\diawrapper.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\disasm.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\intbase.h"
|
RelativePath=".\intbase.h"
|
||||||
>
|
>
|
||||||
|
Loading…
Reference in New Issue
Block a user