From 67901c6c49e9f50a8ce4b7a0823ca841a9861585 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Tue, 22 Mar 2011 16:26:17 +0000 Subject: [PATCH] [pykd] updated: typedVarList can parse two type of linked list [pykd] updated: typedVar builds array as python list git-svn-id: https://pykd.svn.codeplex.com/svn@62996 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgtype.cpp | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/pykd/dbgtype.cpp b/pykd/dbgtype.cpp index 91706fd..66c0f64 100644 --- a/pykd/dbgtype.cpp +++ b/pykd/dbgtype.cpp @@ -112,17 +112,34 @@ getTypeClass( const std::string &moduleName, const std::string &typeName ) boost::python::object loadTypedVarList( ULONG64 address, const std::string &moduleName, const std::string &typeName, const std::string &listEntryName ) { - ULONG64 entryAddress = 0; + address = addr64(address); - boost::python::list objList; + ULONG64 entryAddress = 0; - address = addr64(address); - for( entryAddress = loadPtrByPtr( address ); entryAddress != address && entryAddress != NULL; entryAddress = loadPtrByPtr( entryAddress ) ) + const TypeInfo& typeInfo = TypeInfo::get( moduleName, typeName ); + + boost::python::list objList; + + for ( TypeInfo::TypeFieldList::const_iterator field = typeInfo.getFields().begin(); field != typeInfo.getFields().end(); field++ ) { - objList.append( containingRecord( entryAddress, moduleName, typeName, listEntryName ) ); + if ( field->name == listEntryName ) + { + if ( field->type.name() == ( typeName + "*" ) ) + { + for( entryAddress = loadPtrByPtr( address ); entryAddress != address && entryAddress != NULL; entryAddress = loadPtrByPtr( entryAddress + field->offset ) ) + objList.append( loadTypedVar( moduleName, typeName, entryAddress ) ); + } + else + { + for( entryAddress = loadPtrByPtr( address ); entryAddress != address && entryAddress != NULL; entryAddress = loadPtrByPtr( entryAddress ) ) + objList.append( containingRecord( entryAddress, moduleName, typeName, listEntryName ) ); + } + + return objList; + } } - return objList; + return boost::python::object(); } ///////////////////////////////////////////////////////////////////////////////// @@ -130,14 +147,14 @@ loadTypedVarList( ULONG64 address, const std::string &moduleName, const std::str boost::python::object loadTypedVarArray( ULONG64 address, const std::string &moduleName, const std::string &typeName, long number ) { - boost::python::dict objArr; + boost::python::list objList; const TypeInfo& typeInfo = TypeInfo::get( moduleName, typeName ); for( long i = 0; i < number; ++i ) - objArr[i] = loadTypedVar( moduleName, typeName, address + i * typeInfo.size() ); + objList.append( loadTypedVar( moduleName, typeName, address + i * typeInfo.size() ) ); - return objArr; + return objList; } ///////////////////////////////////////////////////////////////////////////////// @@ -396,12 +413,12 @@ TypeInfo::load( ULONG64 addr, ULONG offset /* = 0 */ ) const } else { - boost::python::dict arr; + boost::python::list arr; for ( unsigned int i = 0; i < field->size / field->type.size(); ++i ) { const ULONG locOffset = field->offset + i * (ULONG)field->type.size(); - arr[i] = field->type.load( addr + locOffset, offset + locOffset ); + arr.append( field->type.load( addr + locOffset, offset + locOffset ) ); } var.attr( field->name.c_str() ) = arr;