[pykd] added : class disasm

git-svn-id: https://pykd.svn.codeplex.com/svn@68358 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2011-07-28 08:10:10 +00:00
parent 9545cf5df0
commit 89c524741a
5 changed files with 136 additions and 5 deletions

View File

@ -28,6 +28,7 @@
#include "dbgbreak.h" #include "dbgbreak.h"
#include "dbgio.h" #include "dbgio.h"
#include "intbase.h" #include "intbase.h"
#include "disasm.h"
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
@ -346,6 +347,17 @@ BOOST_PYTHON_MODULE( pykd )
"Unload module event. Parameter is instance of dbgModuleClass. " "Unload module event. Parameter is instance of dbgModuleClass. "
"For ignore event method must return DEBUG_STATUS_NO_CHANGE value" ); "For ignore event method must return DEBUG_STATUS_NO_CHANGE value" );
boost::python::class_<disasm>("disasm", "Class disassemble a processor instructions", boost::python::no_init )
.def( boost::python::init<>( "constructor" ) )
.def( boost::python::init<ULONG64>( boost::python::args("offset"), "constructor" ) )
.def( "next", &disasm::next, "Disassemble next instruction" )
.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" );
// èñêëþ÷åíèÿ // èñêëþ÷åíèÿ
boost::python::class_<DbgException> dbgExceptionClass( "BaseException", boost::python::class_<DbgException> dbgExceptionClass( "BaseException",
"Pykd base exception class", "Pykd base exception class",

49
pykd/disasm.cpp Normal file
View File

@ -0,0 +1,49 @@
#include "stdafx.h"
#include "dbgext.h"
#include "disasm.h"
#include "dbgexcept.h"
#include "dbgmem.h"
/////////////////////////////////////////////////////////////////////////////////
void disasm::doDisasm()
{
HRESULT hres;
char buffer[0x100];
ULONG disasmSize = 0;
ULONG64 offset = addr64(m_currentOffset);
ULONG64 endOffset = 0;
if ( m_beginOffset == 0 )
{
ULONG64 currentOffset = 0;
hres = dbgExt->registers->GetInstructionOffset( &currentOffset );
if ( FAILED( hres ) )
throw DbgException( "IDebugRegisters::GetInstructionOffset failed" );
offset += currentOffset;
}
hres =
dbgExt->control->Disassemble(
offset,
DEBUG_DISASM_EFFECTIVE_ADDRESS,
buffer,
sizeof(buffer),
&disasmSize,
&endOffset );
if ( FAILED( hres ) )
throw DbgException( "IDebugControl::Disassemble failed" );
hres = dbgExt->control->GetDisassembleEffectiveOffset( &m_ea );
if ( FAILED( hres ) )
m_ea = 0;
m_length = (ULONG)(endOffset - offset);
m_disasm = std::string( buffer, disasmSize - 2);
}
/////////////////////////////////////////////////////////////////////////////////

54
pykd/disasm.h Normal file
View File

@ -0,0 +1,54 @@
#pragma once
/////////////////////////////////////////////////////////////////////////////////
class disasm {
public:
disasm( ULONG64 offset = 0) :
m_beginOffset( offset ),
m_currentOffset( offset ) {
doDisasm();
}
std::string next() {
m_currentOffset += m_length;
doDisasm();
return m_disasm;
}
std::string instruction() const {
return m_disasm;
}
ULONG64 begin() const {
return m_beginOffset;
}
ULONG64 current() const {
return m_currentOffset;
}
ULONG length() const {
return m_length;
}
ULONG64 ea() const {
return m_ea;
}
private:
void doDisasm();
ULONG64 m_beginOffset;
ULONG64 m_currentOffset;
ULONG64 m_ea;
ULONG m_length;
std::string m_disasm;
};
/////////////////////////////////////////////////////////////////////////////////

View File

@ -424,6 +424,10 @@
RelativePath=".\dbgtype.cpp" RelativePath=".\dbgtype.cpp"
> >
</File> </File>
<File
RelativePath=".\disasm.cpp"
>
</File>
<File <File
RelativePath=".\pykd.def" RelativePath=".\pykd.def"
> >
@ -550,6 +554,10 @@
RelativePath=".\dbgtype.h" RelativePath=".\dbgtype.h"
> >
</File> </File>
<File
RelativePath=".\disasm.h"
>
</File>
<File <File
RelativePath=".\intbase.h" RelativePath=".\intbase.h"
> >

View File

@ -1,14 +1,10 @@
<?xml version="1.0" encoding="windows-1251"?> <?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="9.00" Version="9,00"
Name="pykd" Name="pykd"
ProjectGUID="{FE961905-666F-4908-A212-961465F46F13}" ProjectGUID="{FE961905-666F-4908-A212-961465F46F13}"
RootNamespace="pykd" RootNamespace="pykd"
SccProjectName="SAK"
SccAuxPath="SAK"
SccLocalPath="SAK"
SccProvider="SAK"
Keyword="Win32Proj" Keyword="Win32Proj"
TargetFrameworkVersion="0" TargetFrameworkVersion="0"
> >
@ -417,6 +413,10 @@
RelativePath=".\dbgtype.cpp" RelativePath=".\dbgtype.cpp"
> >
</File> </File>
<File
RelativePath=".\disasm.cpp"
>
</File>
<File <File
RelativePath=".\pykd.cpp" RelativePath=".\pykd.cpp"
> >
@ -539,6 +539,14 @@
RelativePath=".\dbgtype.h" RelativePath=".\dbgtype.h"
> >
</File> </File>
<File
RelativePath=".\disasm.h"
>
</File>
<File
RelativePath=".\intbase.h"
>
</File>
<File <File
RelativePath=".\resource.h" RelativePath=".\resource.h"
> >