diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index e76e090..f7b527d 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -507,21 +507,27 @@ BOOST_PYTHON_MODULE( pykd ) "Return a current process" ).staticmethod("getCurrent") .def("getProcess", TargetProcessAdapter::getProcess, "Return process by index").staticmethod("getProcess") - .def("systemID", TargetProcessAdapter::getSystemId, + .add_property("systemID", TargetProcessAdapter::getSystemId, "Retrun system process ID ( PID )" ) - .def("peb", TargetProcessAdapter::getPebOffset, + .add_property("peb", TargetProcessAdapter::getPebOffset, "Return PEB address" ) + .add_property("exeName", TargetProcessAdapter::getExeName, + "Return the process executbakle file name") .def("getNumberThreads", TargetProcessAdapter::getNumberThreads, "Return number of threads for this process" ) .def("thread", TargetProcessAdapter::getThreadByIndex, "Return thread by its index" ) + .def("currentThread", TargetProcessAdapter::getCurrentThread, + "Return current thread" ) ; python::class_<kdlib::TargetThread, kdlib::TargetThreadPtr, boost::noncopyable>("targetThread", "Class representing process in the target system", python::no_init ) - .def("systemID", TargetThreadAdapter::getSystemId, + .add_property("systemID", TargetThreadAdapter::getSystemId, "Retrun system thread ID ( TID )" ) - .def("teb", TargetThreadAdapter::getTebOffset, + .add_property("teb", TargetThreadAdapter::getTebOffset, "Return TEB address" ) + .def("setCurrent", TargetThreadAdapter::setCurrent, + "Set this thread current") ; python::class_<kdlib::Module, kdlib::ModulePtr, python::bases<kdlib::NumBehavior>, boost::noncopyable>("module", "Class representing executable module", python::no_init ) diff --git a/pykd/pyprocess.h b/pykd/pyprocess.h index 4226eb4..2ed4239 100644 --- a/pykd/pyprocess.h +++ b/pykd/pyprocess.h @@ -20,24 +20,30 @@ struct TargetProcessAdapter { return kdlib::TargetProcess::getByIndex(index); } - static unsigned long getNumberProcesses() + static unsigned long getNumberProcesses() { AutoRestorePyState pystate; return kdlib::TargetProcess::getNumber(); } - static kdlib::PROCESS_ID getSystemId(kdlib::TargetProcess& process ) + static kdlib::PROCESS_ID getSystemId(kdlib::TargetProcess& process) { AutoRestorePyState pystate; return process.getSystemId(); } - static kdlib::MEMOFFSET_64 getPebOffset(kdlib::TargetProcess& process ) + static kdlib::MEMOFFSET_64 getPebOffset(kdlib::TargetProcess& process) { AutoRestorePyState pystate; return process.getPebOffset(); } + static std::wstring getExeName(kdlib::TargetProcess& process) + { + AutoRestorePyState pystate; + return process.getExecutableName(); + } + static unsigned long getNumberThreads(kdlib::TargetProcess& process ) { AutoRestorePyState pystate; @@ -49,6 +55,12 @@ struct TargetProcessAdapter { AutoRestorePyState pystate; return process.getThreadByIndex(index); } + + static kdlib::TargetThreadPtr getCurrentThread(kdlib::TargetProcess& process) + { + AutoRestorePyState pystate; + return process.getCurrentThread(); + } }; @@ -65,6 +77,12 @@ struct TargetThreadAdapter { AutoRestorePyState pystate; return thread.getTebOffset(); } + + static void setCurrent(kdlib::TargetThread& thread) + { + AutoRestorePyState pystate; + return thread.setCurrent(); + } }; } // pykd namespace diff --git a/test/scripts/targetprocess.py b/test/scripts/targetprocess.py index e01203c..f7fd8d8 100644 --- a/test/scripts/targetprocess.py +++ b/test/scripts/targetprocess.py @@ -15,8 +15,8 @@ class ProcessTest(unittest.TestCase): def testGetCurrentProcess(self): proc = pykd.targetProcess.getCurrent() - self.assertNotEqual(0, proc.systemID() ) - self.assertNotEqual(0, proc.peb() ) + self.assertNotEqual(0, proc.systemID ) + self.assertNotEqual(0, proc.peb ) def testEnumThreads(self): proc = pykd.targetProcess.getCurrent() @@ -24,15 +24,24 @@ class ProcessTest(unittest.TestCase): self.assertLess(0, threadNumber) for i in xrange(threadNumber): thread = proc.thread(i) - self.assertNotEqual(0, thread.systemID() ) - self.assertNotEqual(0, thread.teb() ) + 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() ) + self.assertNotEqual(0, proc.systemID) + self.assertNotEqual(0, proc.peb) + + def testSetCurrentThread(self): + proc = pykd.targetProcess.getCurrent() + threadNumber = proc.getNumberThreads() + self.assertLess(0, threadNumber) + for i in xrange(threadNumber): + thread = proc.thread(i) + thread.setCurrent() +