mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 03:23:23 +08:00
[0.3.x] added : setReg routine ( set a CPU register value by its name or its index )
[0.3.x] added : getRegisterName routine ( return register name by its index ) git-svn-id: https://pykd.svn.codeplex.com/svn@91031 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
18af73a962
commit
503c8fd747
@ -43,7 +43,25 @@ python::object getRegisterByIndex(unsigned long index)
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
std::wstring getRegisterNameByIndex(unsigned long index)
|
void setRegisterByName(const std::wstring& name, const python::object& value)
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
|
||||||
|
kdlib::setRegisterByName(name, NumVariantAdaptor::convertToVariant(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void setRegisterByIndex(unsigned long index, const python::object& value)
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
|
||||||
|
kdlib::setRegisterByIndex(index, NumVariantAdaptor::convertToVariant(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::wstring getRegisterName(unsigned long index)
|
||||||
{
|
{
|
||||||
AutoRestorePyState pystate;
|
AutoRestorePyState pystate;
|
||||||
return kdlib::getRegisterName(index);
|
return kdlib::getRegisterName(index);
|
||||||
|
@ -72,7 +72,11 @@ python::object getRegisterByName( const std::wstring &name );
|
|||||||
|
|
||||||
python::object getRegisterByIndex( unsigned long index );
|
python::object getRegisterByIndex( unsigned long index );
|
||||||
|
|
||||||
std::wstring getRegisterNameByIndex(unsigned long index);
|
std::wstring getRegisterName(unsigned long index);
|
||||||
|
|
||||||
|
void setRegisterByName(const std::wstring& name, const python::object& value);
|
||||||
|
|
||||||
|
void setRegisterByIndex(unsigned long index, const python::object& value);
|
||||||
|
|
||||||
inline unsigned long getNumberRegisters() {
|
inline unsigned long getNumberRegisters() {
|
||||||
AutoRestorePyState pystate;
|
AutoRestorePyState pystate;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define PYKD_VERSION_MAJOR 0
|
#define PYKD_VERSION_MAJOR 0
|
||||||
#define PYKD_VERSION_MINOR 3
|
#define PYKD_VERSION_MINOR 3
|
||||||
#define PYKD_VERSION_SUBVERSION 1
|
#define PYKD_VERSION_SUBVERSION 1
|
||||||
#define PYKD_VERSION_BUILDNO 5
|
#define PYKD_VERSION_BUILDNO 6
|
||||||
|
|
||||||
#define __VER_STR2__(x) #x
|
#define __VER_STR2__(x) #x
|
||||||
#define __VER_STR1__(x) __VER_STR2__(x)
|
#define __VER_STR1__(x) __VER_STR2__(x)
|
||||||
|
@ -411,8 +411,14 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
"Return a CPU regsiter value by the register's name" );
|
"Return a CPU regsiter value by the register's name" );
|
||||||
python::def( "reg", pykd::getRegisterByIndex,
|
python::def( "reg", pykd::getRegisterByIndex,
|
||||||
"Return a CPU register value by the register's number");
|
"Return a CPU register value by the register's number");
|
||||||
|
python::def( "setReg", pykd::setRegisterByName,
|
||||||
|
"Set a CPU register value by its name" );
|
||||||
|
python::def( "setReg", pykd::setRegisterByIndex,
|
||||||
|
"Set a CPU register value by its index" );
|
||||||
python::def( "getNumberRegisters", pykd::getNumberRegisters,
|
python::def( "getNumberRegisters", pykd::getNumberRegisters,
|
||||||
"Return a number of CPU registers");
|
"Return a number of CPU registers");
|
||||||
|
python::def( "getRegisterName", pykd::getRegisterName,
|
||||||
|
"Return register name by its index");
|
||||||
python::def("getIP", pykd::getIP,
|
python::def("getIP", pykd::getIP,
|
||||||
"Return instruction pointer");
|
"Return instruction pointer");
|
||||||
python::def("getSP", pykd::getSP,
|
python::def("getSP", pykd::getSP,
|
||||||
|
@ -13,23 +13,22 @@ class NumVariantAdaptor : public kdlib::NumBehavior
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
static kdlib::NumVariant NumVariantAdaptor::convertToVariant( const python::object &obj)
|
||||||
static kdlib::NumBehavior* NumVariantAdaptor::getVariant(const python::object &obj)
|
|
||||||
{
|
{
|
||||||
NumVariantAdaptor* var = new NumVariantAdaptor();
|
kdlib::NumVariant var;
|
||||||
|
|
||||||
if (PyBool_Check(obj.ptr()))
|
if (PyBool_Check(obj.ptr()))
|
||||||
{
|
{
|
||||||
if (obj.ptr() == Py_True)
|
if (obj.ptr() == Py_True)
|
||||||
var->m_variant.setBool(true);
|
var.setBool(true);
|
||||||
else
|
else
|
||||||
var->m_variant.setBool(false);
|
var.setBool(false);
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PyFloat_Check(obj.ptr()))
|
if (PyFloat_Check(obj.ptr()))
|
||||||
{
|
{
|
||||||
var->m_variant.setDouble(PyFloat_AsDouble(obj.ptr()));
|
var.setDouble(PyFloat_AsDouble(obj.ptr()));
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,7 +36,7 @@ public:
|
|||||||
|
|
||||||
if (PyInt_CheckExact(obj.ptr()))
|
if (PyInt_CheckExact(obj.ptr()))
|
||||||
{
|
{
|
||||||
var->m_variant.setLong(PyLong_AsLong(obj.ptr()));
|
var.setLong(PyLong_AsLong(obj.ptr()));
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -47,14 +46,14 @@ public:
|
|||||||
if (_PyLong_NumBits(obj.ptr()) > 64)
|
if (_PyLong_NumBits(obj.ptr()) > 64)
|
||||||
throw pykd::OverflowException("int too big to convert");
|
throw pykd::OverflowException("int too big to convert");
|
||||||
|
|
||||||
var->m_variant.setULongLong(PyLong_AsUnsignedLongLong(obj.ptr()));
|
var.setULongLong(PyLong_AsUnsignedLongLong(obj.ptr()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_PyLong_NumBits(obj.ptr()) > 63)
|
if (_PyLong_NumBits(obj.ptr()) > 63)
|
||||||
throw pykd::OverflowException("int too big to convert");
|
throw pykd::OverflowException("int too big to convert");
|
||||||
|
|
||||||
var->m_variant.setLongLong(PyLong_AsLongLong(obj.ptr()));
|
var.setLongLong(PyLong_AsLongLong(obj.ptr()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -102,6 +101,18 @@ public:
|
|||||||
return python::object( var.asInt() );
|
return python::object( var.asInt() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static kdlib::NumBehavior* NumVariantAdaptor::getVariant(const python::object &obj)
|
||||||
|
{
|
||||||
|
NumVariantAdaptor* var = new NumVariantAdaptor();
|
||||||
|
|
||||||
|
var->m_variant = NumVariantAdaptor::convertToVariant(obj);
|
||||||
|
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static python::object NumVariantAdaptor::convertToPython( kdlib::NumBehavior& num )
|
static python::object NumVariantAdaptor::convertToPython( kdlib::NumBehavior& num )
|
||||||
{
|
{
|
||||||
kdlib::NumVariant var = kdlib::NumVariant( num );
|
kdlib::NumVariant var = kdlib::NumVariant( num );
|
||||||
|
@ -54,7 +54,7 @@ def getTestSuite( singleName = "" ):
|
|||||||
unittest.TestLoader().loadTestsFromTestCase( memtest.MemoryTest ),
|
unittest.TestLoader().loadTestsFromTestCase( memtest.MemoryTest ),
|
||||||
unittest.TestLoader().loadTestsFromTestCase( typeinfo.TypeInfoTest ),
|
unittest.TestLoader().loadTestsFromTestCase( typeinfo.TypeInfoTest ),
|
||||||
unittest.TestLoader().loadTestsFromTestCase( typedvar.TypedVarTest ),
|
unittest.TestLoader().loadTestsFromTestCase( typedvar.TypedVarTest ),
|
||||||
#unittest.TestLoader().loadTestsFromTestCase( regtest.CpuRegTest ),
|
unittest.TestLoader().loadTestsFromTestCase( regtest.CpuRegTest ),
|
||||||
unittest.TestLoader().loadTestsFromTestCase( customtypestest.CustomTypesTest ),
|
unittest.TestLoader().loadTestsFromTestCase( customtypestest.CustomTypesTest ),
|
||||||
unittest.TestLoader().loadTestsFromTestCase( synsymtest.SynSymTest ),
|
unittest.TestLoader().loadTestsFromTestCase( synsymtest.SynSymTest ),
|
||||||
# ^^^
|
# ^^^
|
||||||
@ -88,7 +88,7 @@ if __name__ == "__main__":
|
|||||||
target.moduleName = os.path.splitext(os.path.basename(target.appPath))[0]
|
target.moduleName = os.path.splitext(os.path.basename(target.appPath))[0]
|
||||||
|
|
||||||
unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite() )
|
unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite() )
|
||||||
#unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite("typedvar.TypedVarTest.testCompare") )
|
#unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite("regtest.CpuRegTest.testSetRegValue") )
|
||||||
|
|
||||||
try: input = raw_input
|
try: input = raw_input
|
||||||
except NameError: pass
|
except NameError: pass
|
||||||
|
@ -5,16 +5,40 @@ import pykd
|
|||||||
|
|
||||||
class CpuRegTest( unittest.TestCase ):
|
class CpuRegTest( unittest.TestCase ):
|
||||||
|
|
||||||
def testCtor(self):
|
def testGetRegName(self):
|
||||||
currentcpu = pykd.cpu()
|
self.assertNotEqual(None, pykd.getRegisterName(10))
|
||||||
cpu0 = pykd.cpu(0)
|
|
||||||
|
def testGetRegValue(self):
|
||||||
|
for regIndex in xrange(pykd.getNumberRegisters()):
|
||||||
|
regName = pykd.getRegisterName(regIndex)
|
||||||
|
try:
|
||||||
|
self.assertEqual( pykd.reg(regIndex), pykd.reg(regName) )
|
||||||
|
except pykd.DbgException:
|
||||||
|
pass # pass exception unsupported register type
|
||||||
|
|
||||||
|
def testSetRegValue(self):
|
||||||
|
|
||||||
|
oldVal = pykd.reg(2)
|
||||||
|
pykd.setReg(2, 10)
|
||||||
|
self.assertEqual(pykd.reg(2), 10)
|
||||||
|
pykd.setReg( pykd.getRegisterName(2), oldVal )
|
||||||
|
self.assertEqual(pykd.reg(2), oldVal )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#def testCtor(self):
|
||||||
|
# currentcpu = pykd.cpu()
|
||||||
|
# cpu0 = pykd.cpu(0)
|
||||||
|
|
||||||
|
#def testIp(self):
|
||||||
|
# currentcpu = pykd.cpu()
|
||||||
|
# self.assertNotEqual( 0, currentcpu.ip )
|
||||||
|
# self.assertNotEqual( 0, currentcpu.sp )
|
||||||
|
# self.assertNotEqual( 0, currentcpu.fp )
|
||||||
|
|
||||||
|
#def testRegEnum(self):
|
||||||
|
# for r in pykd.cpu():
|
||||||
|
# pass
|
||||||
|
|
||||||
|
|
||||||
def testIp(self):
|
|
||||||
currentcpu = pykd.cpu()
|
|
||||||
self.assertNotEqual( 0, currentcpu.ip )
|
|
||||||
self.assertNotEqual( 0, currentcpu.sp )
|
|
||||||
self.assertNotEqual( 0, currentcpu.fp )
|
|
||||||
|
|
||||||
def testRegEnum(self):
|
|
||||||
for r in pykd.cpu():
|
|
||||||
pass
|
|
||||||
|
Loading…
Reference in New Issue
Block a user