diff --git a/pykd/pykd_vc110.vcxproj b/pykd/pykd_vc110.vcxproj index cbce213..ddba87d 100644 --- a/pykd/pykd_vc110.vcxproj +++ b/pykd/pykd_vc110.vcxproj @@ -178,6 +178,7 @@ + diff --git a/pykd/pykd_vc110.vcxproj.filters b/pykd/pykd_vc110.vcxproj.filters index a5dbeca..268443f 100644 --- a/pykd/pykd_vc110.vcxproj.filters +++ b/pykd/pykd_vc110.vcxproj.filters @@ -75,6 +75,9 @@ Header Files + + Header Files + diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 42b15bf..e76e090 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -20,6 +20,7 @@ #include "pytypedvar.h" #include "pytypeinfo.h" #include "pycpucontext.h" +#include "pyprocess.h" using namespace pykd; @@ -499,6 +500,30 @@ BOOST_PYTHON_MODULE( pykd ) NumVariantAdaptor::registerNumConvertion(); + python::class_("targetProcess", "Class representing process in the target system", python::no_init ) + .def("getNumber", TargetProcessAdapter::getNumberProcesses, + "Return number of processes" ).staticmethod("getNumber") + .def("getCurrent", TargetProcessAdapter::getCurrent, + "Return a current process" ).staticmethod("getCurrent") + .def("getProcess", TargetProcessAdapter::getProcess, + "Return process by index").staticmethod("getProcess") + .def("systemID", TargetProcessAdapter::getSystemId, + "Retrun system process ID ( PID )" ) + .def("peb", TargetProcessAdapter::getPebOffset, + "Return PEB address" ) + .def("getNumberThreads", TargetProcessAdapter::getNumberThreads, + "Return number of threads for this process" ) + .def("thread", TargetProcessAdapter::getThreadByIndex, + "Return thread by its index" ) + ; + + python::class_("targetThread", "Class representing process in the target system", python::no_init ) + .def("systemID", TargetThreadAdapter::getSystemId, + "Retrun system thread ID ( TID )" ) + .def("teb", TargetThreadAdapter::getTebOffset, + "Return TEB address" ) + ; + python::class_, boost::noncopyable>("module", "Class representing executable module", python::no_init ) .def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByName ) ) .def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByOffset) ) @@ -559,7 +584,6 @@ BOOST_PYTHON_MODULE( pykd ) "Return address of the symbol" ) .def( "__str__", &ModuleAdapter::print ); - python::class_, boost::noncopyable >("typeInfo", "Class representing typeInfo", python::no_init ) .def("__init__", python::make_constructor( pykd::getTypeInfoByName ) ) .def( "name", TypeInfoAdapter::getName, diff --git a/pykd/pyprocess.h b/pykd/pyprocess.h new file mode 100644 index 0000000..4226eb4 --- /dev/null +++ b/pykd/pyprocess.h @@ -0,0 +1,71 @@ +#pragma once + +#include + +#include "pythreadstate.h" + +namespace pykd { + +struct TargetProcessAdapter { + + static kdlib::TargetProcessPtr getCurrent() + { + AutoRestorePyState pystate; + return kdlib::TargetProcess::getCurrent(); + } + + static kdlib::TargetProcessPtr getProcess(unsigned long index) + { + AutoRestorePyState pystate; + return kdlib::TargetProcess::getByIndex(index); + } + + static unsigned long getNumberProcesses() + { + AutoRestorePyState pystate; + return kdlib::TargetProcess::getNumber(); + } + + static kdlib::PROCESS_ID getSystemId(kdlib::TargetProcess& process ) + { + AutoRestorePyState pystate; + return process.getSystemId(); + } + + static kdlib::MEMOFFSET_64 getPebOffset(kdlib::TargetProcess& process ) + { + AutoRestorePyState pystate; + return process.getPebOffset(); + } + + static unsigned long getNumberThreads(kdlib::TargetProcess& process ) + { + AutoRestorePyState pystate; + return process.getNumberThreads(); + } + + static kdlib::TargetThreadPtr getThreadByIndex(kdlib::TargetProcess& process, unsigned long index) + { + AutoRestorePyState pystate; + return process.getThreadByIndex(index); + } +}; + + +struct TargetThreadAdapter { + + static kdlib::THREAD_ID getSystemId(kdlib::TargetThread& thread ) + { + AutoRestorePyState pystate; + return thread.getSystemId(); + } + + static kdlib::MEMOFFSET_64 getTebOffset(kdlib::TargetThread& thread ) + { + AutoRestorePyState pystate; + return thread.getTebOffset(); + } +}; + +} // pykd namespace + diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py index 67c4a92..54d3d82 100644 --- a/test/scripts/pykdtest.py +++ b/test/scripts/pykdtest.py @@ -24,6 +24,7 @@ import stacktest import customtypestest import mspdbtest import excepttest +import targetprocess pykd.initialize() @@ -59,6 +60,8 @@ def getTestSuite( singleName = "" ): unittest.TestLoader().loadTestsFromTestCase( breakpoint.BreakpointTest ), unittest.TestLoader().loadTestsFromTestCase( stacktest.StackTest ), unittest.TestLoader().loadTestsFromTestCase( mspdbtest.MsPdbTest ), + unittest.TestLoader().loadTestsFromTestCase( targetprocess.ProcessTest ), + #unittest.TestLoader().loadTestsFromTestCase( excepttest.ExceptionTest ), ] ) else: diff --git a/test/scripts/pykdtest.pyproj b/test/scripts/pykdtest.pyproj index 0ef356f..3647e4e 100644 --- a/test/scripts/pykdtest.pyproj +++ b/test/scripts/pykdtest.pyproj @@ -53,6 +53,7 @@ + diff --git a/test/scripts/targetprocess.py b/test/scripts/targetprocess.py new file mode 100644 index 0000000..e01203c --- /dev/null +++ b/test/scripts/targetprocess.py @@ -0,0 +1,40 @@ +import unittest +import pykd +import target +import time + +class ProcessTest(unittest.TestCase): + + def setUp(self): + pykd.startProcess( target.appPath ) + pykd.startProcess( target.appPath ) + pykd.startProcess( target.appPath ) + + def tearDown(self): + pykd.killAllProcesses() + + def testGetCurrentProcess(self): + proc = pykd.targetProcess.getCurrent() + self.assertNotEqual(0, proc.systemID() ) + self.assertNotEqual(0, proc.peb() ) + + def testEnumThreads(self): + proc = pykd.targetProcess.getCurrent() + threadNumber = proc.getNumberThreads() + self.assertLess(0, threadNumber) + for i in xrange(threadNumber): + thread = proc.thread(i) + self.assertNotEqual(0, thread.systemID() ) + self.assertNotEqual(0, thread.teb() ) + + def testEnumProcesses(self): + processNumber = pykd.targetProcess.getNumber() + for i in xrange(processNumber): + proc = pykd.targetProcess.getProcess(i) + self.assertNotEqual(0, proc.systemID() ) + self.assertNotEqual(0, proc.peb() ) + + + + +