diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index 47a698a..21bd08b 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -42,6 +42,7 @@ BOOST_PYTHON_MODULE( pykd ) boost::python::def( "is64bitSystem", is64bitSystem ); boost::python::def( "reg", &loadRegister ); boost::python::def( "typedVar", &loadTypedVar ); + boost::python::def( "typedVarList", &loadTypedVarList ); boost::python::def( "containingRecord", &containingRecord ); boost::python::def( "loadModule", &loadModule ); boost::python::def( "findSymbol", &findSymbolForAddress ); diff --git a/pykd/dbgmem.cpp b/pykd/dbgmem.cpp index 0959280..35a0525 100644 --- a/pykd/dbgmem.cpp +++ b/pykd/dbgmem.cpp @@ -137,27 +137,20 @@ loadPtrArray( ULONG64 address, ULONG number ) /////////////////////////////////////////////////////////////////////////////////// -boost::python::object +ULONG64 loadPtrByPtr( ULONG64 address ) { + ULONG64 value = 0; + if ( is64bitSystem() ) - { - ULONG64 value; - - if ( loadMemory( address, &value, sizeof(ULONG64) ) ) - return boost::python::object( value ); - - return boost::python::object(); - } + loadMemory( address, &value, sizeof(ULONG64) ); else { - ULONG value; - if ( loadMemory( address, &value, sizeof(ULONG) ) ) - return boost::python::object( addr64( value ) ); - - return boost::python::object(); + value = addr64( value ); } + + return value; } /////////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/dbgmem.h b/pykd/dbgmem.h index 6a6b35b..11cca1e 100644 --- a/pykd/dbgmem.h +++ b/pykd/dbgmem.h @@ -9,6 +9,10 @@ bool loadMemory( ULONG64 address, PVOID dest, ULONG length ); +ULONG64 +loadPtrByPtr( ULONG64 address ); + + template boost::python::object loadArray( ULONG64 address, ULONG number ) @@ -46,9 +50,6 @@ loadByPtr( ULONG64 address ) return boost::python::object(); } -boost::python::object -loadPtrByPtr( ULONG64 address ); - boost::python::object loadPtrArray( ULONG64 address, ULONG number ); diff --git a/pykd/dbgtype.cpp b/pykd/dbgtype.cpp index d0600e4..b8611c9 100644 --- a/pykd/dbgtype.cpp +++ b/pykd/dbgtype.cpp @@ -47,9 +47,13 @@ basicTypeNames[] = { "short", "unsigned long", "long", + "int", + "unsigned int", "", "void", - "double" + "double", + "int64", + "unsigned int64" }; basicTypeLoader basicTypeLoaders[] = { @@ -59,9 +63,14 @@ basicTypeLoader basicTypeLoaders[] = { valueLoader, valueLoader, valueLoader, + valueLoader, + valueLoader, valueLoader, voidLoader, - valueLoader }; + valueLoader, + valueLoader<__int64>, + valueLoader + }; /////////////////////////////////////////////////////////////////////////////////// // @@ -104,6 +113,10 @@ loadTypedVar( const std::string &moduleName, const std::string &typeName, ULONG6 char fieldTypeName[100]; hres = dbgExt->symbols->GetTypeName( moduleBase, fieldTypeId, fieldTypeName, sizeof(fieldTypeName), NULL ); + std::string fieldTypeNameStr( fieldTypeName ); + if ( fieldTypeNameStr == "__unnamed" || fieldTypeNameStr == "" ) + continue; + ULONG fieldSize; hres = dbgExt->symbols->GetTypeSize( moduleBase, fieldTypeId, &fieldSize ); @@ -183,6 +196,23 @@ containingRecord( ULONG64 address, const std::string &moduleName, const std::str return boost::python::str( "VAR_ERR" ); } +/////////////////////////////////////////////////////////////////////////////////// + +boost::python::object +loadTypedVarList( ULONG64 address, const std::string &moduleName, const std::string &typeName, const std::string &listEntryName ) +{ + ULONG64 entryAddress = 0; + + boost::python::list objList; + + for( entryAddress = loadPtrByPtr( address ); entryAddress != address; entryAddress = loadPtrByPtr( entryAddress ) ) + { + objList.append( containingRecord( entryAddress, moduleName, typeName, listEntryName ) ); + } + + return objList; +} + /////////////////////////////////////////////////////////////////////////////////// bool diff --git a/pykd/dbgtype.h b/pykd/dbgtype.h index 631e1ab..359898c 100644 --- a/pykd/dbgtype.h +++ b/pykd/dbgtype.h @@ -34,6 +34,9 @@ private: boost::python::object loadTypedVar( const std::string &moduleName, const std::string &typeName, ULONG64 address ); +boost::python::object +loadTypedVarList( ULONG64 address, const std::string &moduleName, const std::string &typeName, const std::string &listEntryName ); + boost::python::object containingRecord( ULONG64 address, const std::string &moduleName, const std::string &typeName, const std::string &fieldName );