From b4898cff7eafeab4abb3e8da1410cc0c3b03d26d Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Mon, 17 Jan 2011 07:17:16 +0000 Subject: [PATCH] [+] added : __getattribute__ method for dbgModuleClass class to simplify access to module symbols's offsets git-svn-id: https://pykd.svn.codeplex.com/svn@60262 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgext.cpp | 3 ++- pykd/dbgmodule.cpp | 21 +++++++++++++++++++++ pykd/dbgmodule.h | 8 ++++++++ samples/proclist.py | 1 - 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index aa3a352..4f1b7ec 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -153,7 +153,8 @@ BOOST_PYTHON_MODULE( pykd ) .def("begin", &dbgModuleClass::getBegin ) .def("end", &dbgModuleClass::getEnd ) .def("name", &dbgModuleClass::getName ) - .def("contain", &dbgModuleClass::contain ); + .def("contain", &dbgModuleClass::contain ) + .def("__getattribute__", &dbgModuleClass::getOffset ); boost::python::class_( "ext", "windbg extension", diff --git a/pykd/dbgmodule.cpp b/pykd/dbgmodule.cpp index 4ff09f8..0764417 100644 --- a/pykd/dbgmodule.cpp +++ b/pykd/dbgmodule.cpp @@ -4,6 +4,7 @@ #include "dbgmodule.h" #include "dbgexcept.h" #include "dbgmem.h" +#include "dbgsym.h" ///////////////////////////////////////////////////////////////////////////////// @@ -127,3 +128,23 @@ dbgModuleClass::reloadSymbols() ///////////////////////////////////////////////////////////////////////////////// +ULONG64 +dbgModuleClass::getOffset( const std::string &symName ) +{ + OffsetMap::iterator offset = m_offsets.find( symName ); + if ( offset != m_offsets.end() ) + { + return offset->second; + } + + ULONG64 offsetVal = findAddressForSymbol( m_name, symName ); + if ( (ULONG64)~0 == offsetVal ) + return offsetVal; + + m_offsets.insert( std::make_pair( symName, offsetVal ) ); + + return offsetVal; +} + +///////////////////////////////////////////////////////////////////////////////// + diff --git a/pykd/dbgmodule.h b/pykd/dbgmodule.h index 6cc84b4..4d159fa 100644 --- a/pykd/dbgmodule.h +++ b/pykd/dbgmodule.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -48,6 +49,10 @@ public: void reloadSymbols(); + ULONG64 + getOffset( const std::string &symName ); + + private: ULONG64 m_base; @@ -55,6 +60,9 @@ private: ULONG64 m_end; std::string m_name; + + typedef std::map OffsetMap; + OffsetMap m_offsets; }; ///////////////////////////////////////////////////////////////////////////////// diff --git a/samples/proclist.py b/samples/proclist.py index ff0c2d4..eb1a2c4 100644 --- a/samples/proclist.py +++ b/samples/proclist.py @@ -7,7 +7,6 @@ def loadSymbols(): global nt nt = loadModule( "nt" ) - nt.PsActiveProcessHead = getOffset( "nt", "PsActiveProcessHead" ) def processInfo():