From ebdd06f6bd3347da89e68daba4f68d544d97cca0 Mon Sep 17 00:00:00 2001
From: "SND\\ussrhero_cp"
 <SND\ussrhero_cp@9b283d60-5439-405e-af05-b73fd8c4d996>
Date: Tue, 20 Jan 2015 21:14:17 +0000
Subject: [PATCH] [0.3.x] updated : targetProcess and targetThread classes

git-svn-id: https://pykd.svn.codeplex.com/svn@89661 9b283d60-5439-405e-af05-b73fd8c4d996
---
 pykd/pymod.cpp                | 14 ++++++++++----
 pykd/pyprocess.h              | 24 +++++++++++++++++++++---
 test/scripts/targetprocess.py | 21 +++++++++++++++------
 3 files changed, 46 insertions(+), 13 deletions(-)

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()
+