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_<dbgExtensionClass>( "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 <string> +#include <map> #include <boost/python.hpp> #include <boost/python/object.hpp> @@ -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<std::string, ULONG64> 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():