From 641741e0e538f73cd6603d705f79fba35bbeae0f Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Mon, 19 Mar 2012 08:45:58 +0000 Subject: [PATCH] [0.1.x] added : new API : typedVar class can be created directly ( creation through module calss will be depriceted ) git-svn-id: https://pykd.svn.codeplex.com/svn@74964 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgclient.h | 18 ++++++++++++++++++ pykd/dbgext.cpp | 12 ++++++++++-- pykd/typedvar.cpp | 17 +++++++++++++++++ pykd/typedvar.h | 8 +++++++- test/scripts/typedvar.py | 9 +++++++++ 5 files changed, 61 insertions(+), 3 deletions(-) diff --git a/pykd/dbgclient.h b/pykd/dbgclient.h index e9c5f88..3394db7 100644 --- a/pykd/dbgclient.h +++ b/pykd/dbgclient.h @@ -273,6 +273,10 @@ public: return m_control; } + CComPtr< IDebugDataSpaces4>& + dataSpace() { + return m_dataSpaces; + } PyThreadStateSaver& getThreadState() { @@ -321,6 +325,20 @@ public: void removeBp(BPOINT_ID Id); void removeAllBp(); + TypedVarPtr getTypedVarByName( const std::string &varName ) + { + throw DbgException( "not implemented" ); + } + + TypedVarPtr getTypedVarByTypeName( const std::string &typeName, ULONG64 addr ) + { + throw DbgException( "not implemented" ); + } + + TypedVarPtr getTypedVarByTypeInfo( const TypeInfoPtr &typeInfo, ULONG64 addr ) { + return TypedVar::getTypedVar( m_client, typeInfo, VarDataMemory::factory(m_dataSpaces, addr) ); + } + private: template python::list diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index e75644a..55ae0f2 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -264,6 +264,12 @@ BOOST_PYTHON_MODULE( pykd ) "Read an signed mashine's word wide integer from the target memory" ) .def( "ptrPtr", &DebugClient::ptrPtr, "Read an pointer value from the target memory" ) + .def("typedVar",&DebugClient::getTypedVarByName, + "Return a typedVar class instance" ) + .def("typedVar",&DebugClient::getTypedVarByTypeInfo, + "Return a typedVar class instance" ) + .def("typedVar",&DebugClient::getTypedVarByTypeName, + "Return a typedVar class instance" ) .def( "loadExt", &pykd::DebugClient::loadExtension, "Load a debuger extension" ) .def( "loadModule", &pykd::DebugClient::loadModuleByName, @@ -519,8 +525,10 @@ BOOST_PYTHON_MODULE( pykd ) .def( "__getattr__", &TypeInfo::getField ); python::class_, boost::noncopyable >("typedVar", - "Class of non-primitive type object, child class of typeClass. Data from target is copied into object instance", - python::no_init ) + "Class of non-primitive type object, child class of typeClass. Data from target is copied into object instance", python::no_init ) + .def("__init__", python::make_constructor(TypedVar::getTypedVarByName) ) + .def("__init__", python::make_constructor(TypedVar::getTypedVarByTypeName) ) + .def("__init__", python::make_constructor(TypedVar::getTypedVarByTypeInfo) ) .def("getAddress", &TypedVar::getAddress, "Return virtual address" ) .def("sizeof", &TypedVar::getSize, diff --git a/pykd/typedvar.cpp b/pykd/typedvar.cpp index d75a61f..c91e1e7 100644 --- a/pykd/typedvar.cpp +++ b/pykd/typedvar.cpp @@ -57,6 +57,23 @@ TypedVarPtr TypedVar::getTypedVar( IDebugClient4 *client, const TypeInfoPtr& t /////////////////////////////////////////////////////////////////////////////////// +TypedVarPtr TypedVar::getTypedVarByName( const std::string &varName ) +{ + return g_dbgClient->getTypedVarByName( varName ); +} + +TypedVarPtr TypedVar::getTypedVarByTypeName( const std::string &typeName, ULONG64 addr ) +{ + return g_dbgClient->getTypedVarByTypeName( typeName, addr ); +} + +TypedVarPtr TypedVar::getTypedVarByTypeInfo( const TypeInfoPtr &typeInfo, ULONG64 addr ) +{ + return g_dbgClient->getTypedVarByTypeInfo( typeInfo, addr ); +} + +/////////////////////////////////////////////////////////////////////////////////// + TypedVar::TypedVar ( IDebugClient4 *client, const TypeInfoPtr& typeInfo, VarDataPtr varData ) : DbgObject( client ), m_typeInfo( typeInfo ), diff --git a/pykd/typedvar.h b/pykd/typedvar.h index 6b06c9a..3226543 100644 --- a/pykd/typedvar.h +++ b/pykd/typedvar.h @@ -19,7 +19,13 @@ class TypedVar : public intBase, protected DbgObject { public: - static TypedVarPtr getTypedVar( IDebugClient4 *client, const TypeInfoPtr& typeInfo, VarDataPtr varData ); + static TypedVarPtr getTypedVar( IDebugClient4 *client, const TypeInfoPtr& typeInfo, VarDataPtr varData ); + + static TypedVarPtr getTypedVarByName( const std::string &varName ); + + static TypedVarPtr getTypedVarByTypeName( const std::string &typeName, ULONG64 addr ); + + static TypedVarPtr getTypedVarByTypeInfo( const TypeInfoPtr &typeInfo, ULONG64 addr ); ULONG64 getAddress() const { return m_varData->getAddr(); diff --git a/test/scripts/typedvar.py b/test/scripts/typedvar.py index b93a214..4833bd4 100644 --- a/test/scripts/typedvar.py +++ b/test/scripts/typedvar.py @@ -11,6 +11,15 @@ class TypedVarTest( unittest.TestCase ): def testCtor( self ): tv = target.module.typedVar( "structTest", target.module.g_structTest ) tv = target.module.typedVar( "g_structTest" ) + + tv = pykd.typedVar( "structTest", target.module.g_structTest ) + tv = pykd.typedVar( target.moduleName + "!structTest", target.module.g_structTest ) + + structTest = target.module.type( "structTest" ) + tv = pykd.typedVar( structTest, target.module.g_structTest ) + + tv = pykd.typedVar( "g_structTest" ) + tv = pykd.typedVar( target.moduleName + "!g_structTest" ) def testBaseTypes(self): self.assertEqual( 1, target.module.typedVar( "g_ucharValue" ) )