From 8eb0ba0584cdb54220f442b45db569aece9ad0d1 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Tue, 18 Jun 2013 07:23:36 +0000 Subject: [PATCH] [0.3.x] added : findSymbol git-svn-id: https://pykd.svn.codeplex.com/svn@84103 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgengine.cpp | 10 ++++++++++ pykd/dbgengine.h | 2 ++ pykd/pymod.cpp | 21 ++++++++++----------- pykd/typeinfo.h | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/pykd/dbgengine.cpp b/pykd/dbgengine.cpp index bf2bdb5..c7dad89 100644 --- a/pykd/dbgengine.cpp +++ b/pykd/dbgengine.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "kdlib/dbgengine.h" +#include "kdlib/typeinfo.h" #include "dbgengine.h" @@ -77,4 +78,13 @@ python::tuple getSourceLine( kdlib::MEMOFFSET_64 offset ) /////////////////////////////////////////////////////////////////////////////// +python::tuple findSymbolAndDisp( ULONG64 offset ) +{ + kdlib::MEMDISPLACEMENT displacement = 0; + std::wstring symbolName = kdlib::findSymbol( offset, displacement ); + return python::make_tuple(symbolName,displacement); +} + +/////////////////////////////////////////////////////////////////////////////// + } //end namespace pykd diff --git a/pykd/dbgengine.h b/pykd/dbgengine.h index 3c69355..22c7c9e 100644 --- a/pykd/dbgengine.h +++ b/pykd/dbgengine.h @@ -16,6 +16,8 @@ kdlib::ExecutionStatus targetStepIn(); python::tuple getSourceLine( kdlib::MEMOFFSET_64 offset = 0 ); +python::tuple findSymbolAndDisp( ULONG64 offset ); + /////////////////////////////////////////////////////////////////////////////// } //end namespace pykd \ No newline at end of file diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 8439a26..5beb526 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -54,13 +54,13 @@ BOOST_PYTHON_FUNCTION_OVERLOADS( getSourceFile_, kdlib::getSourceFile, 0, 1 ); //BOOST_PYTHON_FUNCTION_OVERLOADS( setHardwareBp_, setHardwareBp, 3, 4 ); // -//BOOST_PYTHON_FUNCTION_OVERLOADS( findSymbol_, TypeInfo::findSymbol, 1, 2 ); -// //BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( TypeBuilder_createStruct, TypeBuilder::createStruct, 1, 2 ); // BOOST_PYTHON_FUNCTION_OVERLOADS( Module_enumSymbols, ModuleAdapter::enumSymbols, 1, 2 ); BOOST_PYTHON_FUNCTION_OVERLOADS( Module_findSymbol, ModuleAdapter::findSymbol, 2, 3 ); +BOOST_PYTHON_FUNCTION_OVERLOADS( findSymbol_, TypeInfoAdapter::findSymbol, 1, 2 ); + //BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( Module_findSymbol, Module::getSymbolNameByVa, 1, 2 ); @@ -223,10 +223,10 @@ BOOST_PYTHON_MODULE( pykd ) "Return source file name, line and displacement by the specified offset" ) ); python::def( "getOffset", &kdlib::getSymbolOffset, "Return traget virtual address for specified symbol" ); - // python::def( "findSymbol", &TypeInfo::findSymbol, findSymbol_( python::args( "offset", "showDisplacement"), - // "Find symbol by the target virtual memory offset" ) ); - // python::def("findSymbolAndDisp", &pysupport::findSymbolAndDisp, - // "Return tuple(symbol_name, displacement) by virtual address" ); + python::def( "findSymbol", &TypeInfoAdapter::findSymbol, findSymbol_( python::args( "offset", "showDisplacement"), + "Find symbol by the target virtual memory offset" ) ); + python::def("findSymbolAndDisp", &findSymbolAndDisp, + "Return tuple(symbol_name, displacement) by virtual address" ); python::def( "sizeof", &kdlib::getSymbolSize, "Return a size of the type or variable" ); python::def("typedVarList", &TypedVarAdapter::getTypedVarListByTypeName, @@ -294,10 +294,10 @@ BOOST_PYTHON_MODULE( pykd ) // "Set implicit thread for current process" ); // python::def( "getProcessThreads", &pysupport::getProcessThreads, // "Get all process's threads ( user mode only )" ); - // python::def( "getCurrentProcessId", &getCurrentProcessId, - // "Return PID of the current process ( user mode only )" ); - // python::def( "getCurrentThreadId", &getCurrentThreadId, - // "Return TID of the current thread ( user mode only )" ); + python::def( "getCurrentProcessId", &kdlib::getCurrentProcessId, + "Return PID of the current process ( user mode only )" ); + python::def( "getCurrentThreadId", &kdlib::getCurrentThreadId, + "Return TID of the current thread ( user mode only )" ); // python::def( "getCurrentProcessExeName", &getCurrentProcessExecutableName, // "Return name of executable file loaded in the current process"); @@ -579,7 +579,6 @@ BOOST_PYTHON_MODULE( pykd ) // "Return object as a string"); - // python::enum_("eventType", "Type of debug event") // .value("Breakpoint", EventTypeBreakpoint) // .value("Exception", EventTypeException) diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h index e5b6c08..831d091 100644 --- a/pykd/typeinfo.h +++ b/pykd/typeinfo.h @@ -11,6 +11,25 @@ struct TypeInfoAdapter : public kdlib::TypeInfo { return kdlib::loadType( name ); } + static std::wstring findSymbol( kdlib::MEMOFFSET_64 offset, bool showDisplacement = true ) + { + kdlib::MEMDISPLACEMENT displacement = 0; + std::wstring symbolName = kdlib::findSymbol( offset, displacement ); + if ( !showDisplacement || displacement == 0 ) + return symbolName; + + std::wstringstream wsstr; + + wsstr << symbolName; + + if ( displacement > 0 ) + wsstr << L'+' << std::hex << displacement; + else + wsstr << L'-' << std::hex << -displacement; + + return wsstr.str(); + } + static kdlib::MEMOFFSET_32 getElementOffset( kdlib::TypeInfo &typeInfo, const std::wstring &name ) { return typeInfo.getElementOffset( name ); }