From d5e95624d7b5b4ad12e49cb813a92a16ca03a281 Mon Sep 17 00:00:00 2001
From: "SND\\kernelnet_cp"
 <SND\kernelnet_cp@9b283d60-5439-405e-af05-b73fd8c4d996>
Date: Thu, 25 Sep 2014 07:04:58 +0000
Subject: [PATCH] [0.3.x] added : class "cpu" for working with CPU registers
 come back

git-svn-id: https://pykd.svn.codeplex.com/svn@89119 9b283d60-5439-405e-af05-b73fd8c4d996
---
 pykd/pycpucontext.cpp | 199 ++++++++----------------------------------
 pykd/pycpucontext.h   | 165 +++++++++-------------------------
 pykd/pymod.cpp        |  25 +++---
 3 files changed, 86 insertions(+), 303 deletions(-)

diff --git a/pykd/pycpucontext.cpp b/pykd/pycpucontext.cpp
index 6c26bac..89de9c6 100644
--- a/pykd/pycpucontext.cpp
+++ b/pykd/pycpucontext.cpp
@@ -177,176 +177,45 @@ python::dict StackFrameAdapter::getLocalsDict(kdlib::StackFramePtr& frame)
 
 ///////////////////////////////////////////////////////////////////////////////
 
+python::object CPUContextAdapter::getRegisterByName( kdlib::CPUContextPtr& cpu, const std::wstring &name )
+{
 
+    kdlib::NumVariant var;
 
+    do {
 
+        AutoRestorePyState  pystate;
 
-//python::object CPUContextAdapter::getRegisterByIndex( kdlib::CPUContextPtr& cpu, unsigned long  index )
-//{
-//    kdlib::NumVariant var;
-//    std::wstring name;
-//
-//    do {
-//        AutoRestorePyState  pystate;
-//        var = cpu->getRegisterByIndex(index);
-//        name = cpu->getRegisterName(index);
-//    }while(false);
-//
-//    return python::make_tuple( name, NumVariantAdaptor::convertToPython( var ) );
-//}
-//
-/////////////////////////////////////////////////////////////////////////////////
-//
-//python::list  CPUContextAdapter::getStack( kdlib::CPUContextPtr& cpu )
-//{
-//    kdlib::StackPtr  stack;
-//    unsigned long  numberFrames;
-//
-//    do {
-//        AutoRestorePyState  pystate;
-//        stack = kdlib::getStack(cpu);
-//        numberFrames = stack->getFrameCount();
-//    } while(false);
-//
-//    python::list  lst;
-//    for ( unsigned long  i = 0; i < numberFrames; ++i )
-//        lst.append( stack->getFrame(i) );
-//
-//    return lst;
-//}
-//
-/////////////////////////////////////////////////////////////////////////////////
-//
-//std::wstring StackFrameAdapter::print( kdlib::StackFramePtr& frame )
-//{
-//    AutoRestorePyState  pystate;
-//
-//    std::wstringstream sstr;
-//    sstr << L"Frame: ";
-//    sstr << L"IP=" << std::hex << frame->getIP() << L"  ";
-//    sstr << L"Return=" << std::hex << frame->getRET() << L"  ";
-//    sstr << L"Frame Offset=" << std::hex << frame->getFP() << L"  ";
-//    sstr << L"Stack Offset=" << std::hex << frame->getSP();
-//
-//    return sstr.str();
-//}
-//
-/////////////////////////////////////////////////////////////////////////////////
-//
-//python::list StackFrameAdapter::getParamsList( kdlib::StackFramePtr&  frame)
-//{
-//    typedef std::vector< std::pair< std::wstring, kdlib::TypedVarPtr> >  FuncParamList;
-//
-//    FuncParamList  paramLst;
-//    unsigned long  paramCount;
-//
-//    do {
-//        AutoRestorePyState  pystate;
-//        paramCount = frame->getTypedParamCount();
-//        for ( unsigned long i = 0; i < paramCount; ++i )
-//        {
-//            kdlib::TypedVarPtr  param = frame->getTypedParam(i);
-//            std::wstring  paramName =   frame->getTypedParamName(i);
-//
-//            paramLst.push_back( std::make_pair( paramName, param) );
-//        }
-//    } while(false);
-//
-//    python::list  pyLst;
-//
-//    for ( unsigned long i = 0; i < paramCount; ++i )
-//        pyLst.append( python::make_tuple( paramLst[i].first, paramLst[i].second ) );
-//
-//    return pyLst;
-//}
-//
-/////////////////////////////////////////////////////////////////////////////////
-//
-//python::dict StackFrameAdapter::getParamsDict( kdlib::StackFramePtr&  frame)
-//{
-//    typedef std::vector< std::pair< std::wstring, kdlib::TypedVarPtr> >  FuncParamList;
-//
-//    FuncParamList  paramLst;
-//    unsigned long  paramCount;
-//
-//    do {
-//        AutoRestorePyState  pystate;
-//        paramCount = frame->getTypedParamCount();
-//        for ( unsigned long i = 0; i < paramCount; ++i )
-//        {
-//            kdlib::TypedVarPtr  param = frame->getTypedParam(i);
-//            std::wstring  paramName =   frame->getTypedParamName(i);
-//
-//            paramLst.push_back( std::make_pair( paramName, param) );
-//        }
-//    } while(false);
-//
-//    python::dict  pyLst;
-//
-//    for ( unsigned long i = 0; i < paramCount; ++i )
-//        pyLst[paramLst[i].first] = paramLst[i].second;
-//
-//    return pyLst;
-//}
-//
-/////////////////////////////////////////////////////////////////////////////////
-//
-//python::list StackFrameAdapter::getLocalsList(kdlib::StackFramePtr& frame)
-//{
-//    typedef std::vector< std::pair< std::wstring, kdlib::TypedVarPtr> >  LocalVarList;
-//
-//    LocalVarList  localLst;
-//    unsigned long  localCount;
-//
-//    do {
-//        AutoRestorePyState  pystate;
-//        localCount = frame->getLocalVarCount();
-//        for ( unsigned long i = 0; i < localCount; ++i )
-//        {
-//            kdlib::TypedVarPtr  param = frame->getLocalVar(i);
-//            std::wstring  paramName =  frame->getLocalVarName(i);
-//
-//            localLst.push_back( std::make_pair( paramName, param) );
-//        }
-//    } while(false);
-//
-//    python::list  pyLst;
-//
-//    for ( unsigned long i = 0; i < localCount; ++i )
-//        pyLst.append( python::make_tuple( localLst[i].first, localLst[i].second ) );
-//
-//    return pyLst;
-//}
-//
-/////////////////////////////////////////////////////////////////////////////////
-//
-//python::dict StackFrameAdapter::getLocalsDict(kdlib::StackFramePtr& frame)
-//{
-//    typedef std::vector< std::pair< std::wstring, kdlib::TypedVarPtr> >  LocalVarList;
-//
-//    LocalVarList  localLst;
-//    unsigned long  localCount;
-//
-//    do {
-//        AutoRestorePyState  pystate;
-//        localCount = frame->getLocalVarCount();
-//        for ( unsigned long i = 0; i < localCount; ++i )
-//        {
-//            kdlib::TypedVarPtr  param = frame->getLocalVar(i);
-//            std::wstring  paramName =  frame->getLocalVarName(i);
-//
-//            localLst.push_back( std::make_pair( paramName, param) );
-//        }
-//    } while(false);
-//
-//    python::dict  pyLst;
-//
-//    for ( unsigned long i = 0; i < localCount; ++i )
-//        pyLst[localLst[i].first] = localLst[i].second;
-//
-//    return pyLst;
-//}
+        var = cpu->getRegisterByName(name);
+    
+    } while(false);
+
+    return NumVariantAdaptor::convertToPython( var );
+}
 
 ///////////////////////////////////////////////////////////////////////////////
 
+python::tuple CPUContextAdapter::getRegisterByIndex( kdlib::CPUContextPtr& cpu, unsigned long index )
+{
+
+    kdlib::NumVariant var;
+
+    std::wstring  name;
+
+    do {
+
+        AutoRestorePyState  pystate;
+
+        var = cpu->getRegisterByIndex(index);
+
+        name = cpu->getRegisterName(index);
+    
+    } while(false);
+
+    return python::make_tuple( name, NumVariantAdaptor::convertToPython( var ) );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+
 } // end namespace pykd
diff --git a/pykd/pycpucontext.h b/pykd/pycpucontext.h
index c9d115b..d94e053 100644
--- a/pykd/pycpucontext.h
+++ b/pykd/pycpucontext.h
@@ -125,139 +125,56 @@ inline python::list getLocals() {
 }
 
 
+class CPUContextAdapter
+{
+public:
 
+    static  kdlib::CPUContextPtr getCPUContext() {
+        AutoRestorePyState  pystate;
+        return kdlib::loadCPUContext();
+    }
 
+    static python::object getRegisterByName( kdlib::CPUContextPtr& cpu, const std::wstring &name );
 
+    static python::tuple getRegisterByIndex( kdlib::CPUContextPtr& cpu, unsigned long index );
 
+    static unsigned long getRegisterNumber( kdlib::CPUContextPtr& cpu) 
+    {
+        AutoRestorePyState  pystate;
+        return cpu->getRegisterNumber();
+    }
 
+    static kdlib::MEMOFFSET_64 getIP( kdlib::CPUContextPtr& cpu ) 
+    {
+        AutoRestorePyState  pystate;
+        return cpu->getIP();
+    }
+    
+    static kdlib::MEMOFFSET_64 getSP( kdlib::CPUContextPtr& cpu )
+    {
+        AutoRestorePyState  pystate;
+        return cpu->getSP();
+    }
 
+    static kdlib::MEMOFFSET_64 getFP( kdlib::CPUContextPtr& cpu )
+    {
+        AutoRestorePyState  pystate;
+        return cpu->getFP();
+    }
 
+    static kdlib::CPUType getCPUType( kdlib::CPUContextPtr& cpu )
+    {
+        AutoRestorePyState  pystate;
+        return cpu->getCPUType();
+    }
 
+    static kdlib::CPUType getCPUMode( kdlib::CPUContextPtr& cpu )
+    {
+        AutoRestorePyState  pystate;
+        return cpu->getCPUMode();
+    }
 
-//
-//
-//inline kdlib::CPUContextPtr loadCPUCurrentContext() {
-//    AutoRestorePyState  pystate;
-//    return kdlib::loadCPUCurrentContext();
-//}
-//
-//inline kdlib::CPUContextPtr loadCPUContextByIndex( unsigned long index ) {
-//    AutoRestorePyState  pystate;
-//    return kdlib::loadCPUContextByIndex(index);
-//}
-//
-//inline unsigned long long loadMSR( unsigned long  msrIndex ) 
-//{
-//    AutoRestorePyState  pystate;
-//    return kdlib::loadCPUCurrentContext()->loadMSR( msrIndex );
-//}
-//
-//inline void setMSR( unsigned long  msrIndex, unsigned long long value )
-//{  
-//    AutoRestorePyState  pystate;
-//    return kdlib::loadCPUCurrentContext()->setMSR( msrIndex, value );
-//}
-//
-//inline kdlib::CPUType getProcessorMode() {
-//    AutoRestorePyState  pystate;
-//    return kdlib::loadCPUCurrentContext()->getCPUMode();
-//}
-//
-//inline kdlib::CPUType getProcessorType() {
-//    AutoRestorePyState  pystate;
-//    return kdlib::loadCPUCurrentContext()->getCPUType();
-//}
-//
-//inline void setProcessorMode( kdlib::CPUType mode ) {
-//    AutoRestorePyState  pystate;
-//    kdlib::loadCPUCurrentContext()->setCPUMode(mode);
-//}
-//
-//inline void switchProcessorMode() {
-//    AutoRestorePyState  pystate;
-//    kdlib::loadCPUCurrentContext()->switchCPUMode();
-//}
-//
-//inline kdlib::StackFramePtr getCurrentFrame() {
-//    AutoRestorePyState  pystate;
-//    return kdlib::getStack()->getFrame(0);
-//}
-//
-//inline python::list getParams() {
-//    return StackFrameAdapter::getParamsList( getCurrentFrame() );
-//}
-//
-//inline kdlib::TypedVarPtr getParam( const std::wstring &name ) {
-//    return StackFrameAdapter::getParam( getCurrentFrame(), name );
-//}
-//
-//inline python::list getLocals() {
-//    return StackFrameAdapter::getLocalsList( getCurrentFrame() );
-//}
-//
-//inline kdlib::TypedVarPtr getLocal( const std::wstring &name ) {
-//    return StackFrameAdapter::getLocal( getCurrentFrame(), name );
-//}
-//
-//
-//class CPUContextAdapter
-//{
-//public:
-//    static python::object getRegisterByName( kdlib::CPUContextPtr& cpu, const std::wstring &name );
-//    static python::object getRegisterByIndex( kdlib::CPUContextPtr& cpu, unsigned long index );
-//    static python::list getStack( kdlib::CPUContextPtr& cpu );
-//    
-//    static kdlib::MEMOFFSET_64 getIP( kdlib::CPUContextPtr& cpu ) 
-//    {
-//        AutoRestorePyState  pystate;
-//        return cpu->getIP();
-//    }
-//    
-//    static kdlib::MEMOFFSET_64 getSP( kdlib::CPUContextPtr& cpu )
-//    {
-//        AutoRestorePyState  pystate;
-//        return cpu->getSP();
-//    }
-//
-//    static kdlib::MEMOFFSET_64 getFP( kdlib::CPUContextPtr& cpu )
-//    {
-//        AutoRestorePyState  pystate;
-//        return cpu->getFP();
-//    }
-//
-//    static kdlib::CPUType getCPUType( kdlib::CPUContextPtr& cpu )
-//    {
-//        AutoRestorePyState  pystate;
-//        return cpu->getCPUType();
-//    }
-//
-//    static kdlib::CPUType getCPUMode( kdlib::CPUContextPtr& cpu )
-//    {
-//        AutoRestorePyState  pystate;
-//        return cpu->getCPUMode();
-//    }
-//
-//    static void setCPUMode( kdlib::CPUContextPtr& cpu, kdlib::CPUType mode )
-//    {
-//        AutoRestorePyState  pystate;
-//        cpu->setCPUMode(mode);
-//    }
-//
-//    static void switchCPUMode( kdlib::CPUContextPtr& cpu )
-//    {
-//        AutoRestorePyState  pystate;
-//        cpu->switchCPUMode();
-//    }
-//};
-//
-//inline python::object getRegisterByName( const std::wstring &name )
-//{
-//    return CPUContextAdapter::getRegisterByName( kdlib::loadCPUCurrentContext(), name );
-//}
-//
-//inline python::list getCurrentStack() {
-//    return CPUContextAdapter::getStack( kdlib::loadCPUCurrentContext() );
-//}
+};
 
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp
index f21ae1f..69b5c06 100644
--- a/pykd/pymod.cpp
+++ b/pykd/pymod.cpp
@@ -682,20 +682,17 @@ BOOST_PYTHON_MODULE( pykd )
             "return the function's local variable  by it's name")
         .def( "__str__", StackFrameAdapter::print );
 
-    //python::class_<kdlib::CPUContext, kdlib::CPUContextPtr, boost::noncopyable>( "cpu",
-    //    "class for CPU context representation", python::no_init  )
-    //     .def("__init__", python::make_constructor(pykd::loadCPUCurrentContext) )
-    //     .def("__init__", python::make_constructor(pykd::loadCPUContextByIndex) )
-    //     .add_property("ip", CPUContextAdapter::getIP )
-    //     .add_property("sp", CPUContextAdapter::getSP )
-    //     .add_property("fp", CPUContextAdapter::getSP )
-    //     .def("getCPUType", CPUContextAdapter::getCPUType )
-    //     .def("getCPUMode",  CPUContextAdapter::getCPUMode )
-    //     .def("setCPUMode", CPUContextAdapter::setCPUMode )
-    //     .def("switchCPUMode", CPUContextAdapter::switchCPUMode )
-    //     .def("getStack",  CPUContextAdapter::getStack )
-    //     .def("__getattr__",  CPUContextAdapter::getRegisterByName )
-    //     .def("__getitem__",  CPUContextAdapter::getRegisterByIndex );
+    python::class_<kdlib::CPUContext, kdlib::CPUContextPtr, boost::noncopyable>( "cpu",
+         "class for CPU context representation", python::no_init  )
+         .def("__init__", python::make_constructor(CPUContextAdapter::getCPUContext) )
+         .add_property("ip", CPUContextAdapter::getIP )
+         .add_property("sp", CPUContextAdapter::getSP )
+         .add_property("fp", CPUContextAdapter::getSP )
+         .def("getCPUType", CPUContextAdapter::getCPUType )
+         .def("getCPUMode",  CPUContextAdapter::getCPUMode )
+         .def("__getattr__",  CPUContextAdapter::getRegisterByName )
+         .def("__getitem__",  CPUContextAdapter::getRegisterByIndex )
+         .def("__len__", CPUContextAdapter::getRegisterNumber );
 
     python::class_<kdlib::SystemInfo>(
         "systemVersion", "Operation system version", python::no_init)