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