From 2decf9abc727044fd384281334b5f9ad12eeca29 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" <SND\kernelnet_cp@9b283d60-5439-405e-af05-b73fd8c4d996> Date: Thu, 16 Aug 2012 15:54:06 +0000 Subject: [PATCH] [0.2.x] added : getOffset routine git-svn-id: https://pykd.svn.codeplex.com/svn@78888 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/pymod.cpp | 2 ++ pykd/typeinfo.cpp | 14 ++++++++++++++ pykd/typeinfo.h | 3 +++ test/scripts/moduletest.py | 1 + 4 files changed, 20 insertions(+) diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 2c00bb4..af57a49 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -162,6 +162,8 @@ BOOST_PYTHON_MODULE( pykd ) "Read the block of the target's memory and return it as a list of pointers" ); // types and vaiables + python::def( "getOffset", &TypeInfo::getOffset, + "Return traget virtual address for specified symbol" ); python::def( "findSymbol", &TypeInfo::findSymbol, "Find symbol by the target virtual memory offset" ); python::def( "sizeof", &TypeInfo::getSymbolSize, diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index 6c9c334..f2bb71a 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -83,6 +83,20 @@ std::string TypeInfo::findSymbol( ULONG64 offset ) ///////////////////////////////////////////////////////////////////////////////////// +ULONG64 TypeInfo::getOffset( const std::string &fullName ) +{ + std::string moduleName; + std::string symName; + + splitSymName( fullName, moduleName, symName ); + + ModulePtr module = Module::loadModuleByName( moduleName ); + + return module->getSymbolOffset( symName ); +} + +///////////////////////////////////////////////////////////////////////////////////// + TypeInfoPtr TypeInfo::getTypeInfo( SymbolPtr &typeSym ) { ULONG symTag = typeSym->getSymTag(); diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h index 83551e4..74d374a 100644 --- a/pykd/typeinfo.h +++ b/pykd/typeinfo.h @@ -31,6 +31,9 @@ public: static std::string findSymbol( ULONG64 offset ); + static + ULONG64 getOffset( const std::string &symbolName ); + static TypeInfoPtr getTypeInfo( SymbolPtr &symScope, const std::string &symName ); diff --git a/test/scripts/moduletest.py b/test/scripts/moduletest.py index a1be47e..6a68e7e 100644 --- a/test/scripts/moduletest.py +++ b/test/scripts/moduletest.py @@ -46,6 +46,7 @@ class ModuleTest( unittest.TestCase ): def testSymbol( self ): self.assertEqual( target.module.rva("FuncWithName0"), target.module.offset("FuncWithName0") - target.module.begin() ) self.assertEqual( target.module.rva("FuncWithName0"), target.module.FuncWithName0 - target.module.begin() ) + self.assertEqual( target.module.rva("FuncWithName0"), pykd.getOffset( target.module.name() + "!FuncWithName0") - target.module.begin() ) def testType( self ): self.assertEqual( "structTest", target.module.type("structTest").name() );