[pykd] added : cpuReg constructor with index parameter

git-svn-id: https://pykd.svn.codeplex.com/svn@69075 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2011-08-17 16:13:04 +00:00
parent 3c2903218b
commit 2234c675e9
4 changed files with 224 additions and 26 deletions

View File

@ -486,8 +486,10 @@ BOOST_PYTHON_MODULE( pykd )
"CPU regsiter class", "CPU regsiter class",
boost::python::no_init ) boost::python::no_init )
.def( boost::python::init<std::string>(boost::python::args("name"), "constructor" ) ) .def( boost::python::init<std::string>(boost::python::args("name"), "constructor" ) )
.def( boost::python::init<ULONG>(boost::python::args("index"), "constructor" ) )
.def( "name", &cpuReg::name, "The name of the regsiter" ) .def( "name", &cpuReg::name, "The name of the regsiter" )
.def( "beLive", &cpuReg::beLive, "Turn the object to live: its value will be following thr target register value" ); .def( "index", &cpuReg::index, "The index of thr register" )
.def( "beLive", &cpuReg::beLive, "Turn the object to live: its value will be following the target register value" );
// debug status // debug status

View File

@ -10,8 +10,54 @@ using namespace std;
cpuReg::cpuReg( std::string regName ) cpuReg::cpuReg( std::string regName )
{ {
HRESULT hres;
m_name = regName; m_name = regName;
m_lived = false; m_lived = false;
hres = dbgExt->registers->GetIndexByName( m_name.c_str(), &m_index );
if ( FAILED( hres ) )
throw DbgException( "IDebugRegister::GetIndexByName failed" );
reloadValue();
}
///////////////////////////////////////////////////////////////////////////////////
cpuReg::cpuReg( ULONG index )
{
HRESULT hres;
m_index = index;
m_lived = false;
ULONG nameSize = 0;
hres =
dbgExt->registers->GetDescription(
m_index,
NULL,
0,
&nameSize,
NULL );
if ( FAILED( hres ) )
throw DbgException( "IDebugRegister::GetDescription failed" );
std::vector<char> nameBuffer(nameSize);
hres =
dbgExt->registers->GetDescription(
m_index,
&nameBuffer[0],
nameSize,
NULL,
NULL );
if ( FAILED( hres ) )
throw DbgException( "IDebugRegister::GetDescription failed" );
m_name = std::string( &nameBuffer[0] );
reloadValue(); reloadValue();
} }
@ -21,14 +67,9 @@ cpuReg::cpuReg( std::string regName )
void cpuReg::reloadValue() const void cpuReg::reloadValue() const
{ {
HRESULT hres; HRESULT hres;
ULONG registerIndex = 0;
hres = dbgExt->registers->GetIndexByName( m_name.c_str(), &registerIndex );
if ( FAILED( hres ) )
throw DbgException( "IDebugRegister::GetIndexByName failed" );
DEBUG_VALUE debugValue; DEBUG_VALUE debugValue;
hres = dbgExt->registers->GetValue( registerIndex, &debugValue ); hres = dbgExt->registers->GetValue( m_index, &debugValue );
if ( FAILED( hres ) ) if ( FAILED( hres ) )
throw DbgException( "IDebugRegister::GetValue failed" ); throw DbgException( "IDebugRegister::GetValue failed" );

View File

@ -12,11 +12,18 @@ class cpuReg : public intBase {
public : public :
cpuReg( std::string regName ); cpuReg( std::string regName );
cpuReg( ULONG index );
std::string std::string
name() const { name() const {
return m_name; return m_name;
} }
ULONG
index() const {
return m_index;
}
void beLive() { void beLive() {
m_lived = true; m_lived = true;
@ -35,6 +42,8 @@ private:
void reloadValue() const; void reloadValue() const;
std::string m_name; std::string m_name;
ULONG m_index;
bool m_lived; bool m_lived;
}; };

View File

@ -3,66 +3,212 @@
# #
from PySide.QtCore import * from PySide.QtCore import *
from PySide.QtGui import * from PySide.QtGui import *
import pykd import pykd
class DbgThread( QThread ): class UpdateEvent( QEvent ):
def __init__(self): def __init__(self):
QEvent.__init__(self, QEvent.Type(QEvent.User + 1))
class GoThread( QThread ):
def __init__(self, func):
QThread.__init__(self) QThread.__init__(self)
self.start()
self.func = func
def run(self): def run(self):
pykd.startProcess( self.processName ) self.func()
pykd.go() app.postEvent( mainForm, UpdateEvent() )
# pass
while True:
self.sleep(100)
self.exit() self.exit()
class DisasmWidget( QDockWidget ):
def __init__( self ):
QDockWidget.__init__( self )
self.setWindowTitle( "Disassembler" )
self.textArea = QTextEdit()
self.textArea.setReadOnly( True )
self.setWidget( self.textArea )
def onUpdate( self ):
disasm = pykd.disasm()
disasmStr = disasm.instruction() + "\n"
for i in xrange(50):
disasmStr += disasm.next() + "\n"
self.textArea.setPlainText( disasmStr )
class RegistersWidget( QDockWidget ):
def __init__( self ):
QDockWidget.__init__( self )
self.setWindowTitle( "Registers" )
self.textArea = QTextEdit()
self.setWidget( self.textArea )
def onUpdate( self ):
s = ""
for reg in self.getRegisterSet():
s += "%s %x ( %d )\r\n" % ( reg.name(), reg.value(), reg.value() )
self.textArea.setPlainText( s )
def getRegisterSet(self):
regSet=[]
try:
i = 0
while True:
reg = pykd.cpuReg(i)
regSet.append(reg)
i += 1
except pykd.BaseException:
pass
return regSet
class StackWidget( QDockWidget ):
def __init__( self ):
QDockWidget.__init__( self )
self.setWindowTitle( "Stack" )
self.textArea = QTextEdit()
self.setWidget( self.textArea )
def onUpdate( self ):
s = ""
stackFrames = pykd.getCurrentStack()
for frame in stackFrames:
s += pykd.findSymbol( frame.instructionOffset ) + " (%x)" % frame.instructionOffset + "\n"
self.textArea.setPlainText( s )
class MainForm( QMainWindow ): class MainForm( QMainWindow ):
updated = Signal()
def __init__( self ): def __init__( self ):
QMainWindow.__init__( self, None ) QMainWindow.__init__( self, None )
self.setWindowTitle("Pykd Debugger Sample") self.setWindowTitle("Pykd Debugger Sample")
self.setDockNestingEnabled( True )
self.goThread = None
fileMenu = QMenu( "&File" ) fileMenu = QMenu( "&File" )
fileMenu.addAction( "Open process...", self.onOpenProcess ) fileMenu.addAction( "Open process...", self.onOpenProcess )
fileMenu.addAction( "Exit", self.onExit ) fileMenu.addAction( "Exit", self.onExit )
self.menuBar().addMenu( fileMenu ) self.menuBar().addMenu( fileMenu )
debugMenu = QMenu( "Debug" )
debugMenu.addAction( "Break", self.onBreak )
debugMenu.addAction( "Go", self.onGo )
debugMenu.addAction( "Step", self.onStep )
self.menuBar().addMenu( debugMenu )
viewMenu = QMenu( "View" )
viewMenu.addAction( "Disasm", self.onDisasmShow )
viewMenu.addAction( "Regsiters", self.onRegistersShow )
viewMenu.addAction( "Stack", self.onStackShow )
self.menuBar().addMenu( viewMenu )
self.disasmWidget = DisasmWidget()
self.disasmWidget.setVisible( False )
self.addDockWidget( Qt.LeftDockWidgetArea, self.disasmWidget )
self.updated.connect(self.disasmWidget.onUpdate )
self.registersWidget = RegistersWidget()
self.registersWidget.setVisible( False )
self.addDockWidget( Qt.LeftDockWidgetArea, self.registersWidget )
self.updated.connect(self.registersWidget.onUpdate )
self.stackWidget = StackWidget()
self.stackWidget.setVisible( False )
self.addDockWidget( Qt.LeftDockWidgetArea, self.stackWidget )
self.updated.connect(self.stackWidget.onUpdate )
self.resize( 800, 600 ) self.resize( 800, 600 )
def __del__( self ):
if self.debugger.isRunning(): def stopGoThread( self ):
self.debugger.quit()
self.debugger.wait(1000) if self.goThread != None and self.goThread.isRunning():
self.debugger.terminate() self.goThread.quit()
self.goThread.wait(10000)
def event( self, ev ):
if ev.type() == QEvent.User + 1:
self.onUpdate()
return True
else:
return QMainWindow.event( self, ev )
def onOpenProcess( self ): def onOpenProcess( self ):
fileDlg = QFileDialog( self ) fileDlg = QFileDialog( self )
fileDlg.setNameFilter( self.tr("Executable (*.exe)" ) ) fileDlg.setNameFilter( self.tr("Executable (*.exe)" ) )
self.debugger = DbgThread() pykd.startProcess( fileDlg.getOpenFileName()[0] )
self.debugger.processName = fileDlg.getOpenFileName()[0]
self.debugger.start()
self.goThread = GoThread( pykd.go )
def onBreak( self ):
pykd.breakin()
def onGo( self ):
self.stopGoThread()
self.goThread = GoThread( pykd.go )
def onStep( self ):
self.stopGoThread()
self.goThread = GoThread( pykd.step )
def onExit( self ): def onExit( self ):
self.close() self.close()
def onDisasmShow( self ):
self.disasmWidget.setVisible( not self.disasmWidget.isVisible() )
def onRegistersShow( self ):
self.registersWidget.setVisible( not self.registersWidget.isVisible() )
def onStackShow( self ):
self.stackWidget.setVisible( not self.stackWidget.isVisible() )
def onUpdate( self ):
self.updated.emit()
def main(): def main():
global app
global mainForm
app = QApplication( [] ) app = QApplication( [] )
mainForm = MainForm() mainForm = MainForm()
mainForm.show() mainForm.show()