From 27f26f4c769792e2a354ab35a017769b82e85f29 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" <SND\kernelnet_cp@9b283d60-5439-405e-af05-b73fd8c4d996> Date: Fri, 8 Apr 2011 16:03:04 +0000 Subject: [PATCH] [snippets] added: !py avl command for retreiving AVL tree git-svn-id: https://pykd.svn.codeplex.com/svn@63654 9b283d60-5439-405e-af05-b73fd8c4d996 --- snippets/avl.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 snippets/avl.py diff --git a/snippets/avl.py b/snippets/avl.py new file mode 100644 index 0000000..fcb4913 --- /dev/null +++ b/snippets/avl.py @@ -0,0 +1,55 @@ +# +# +# + +import sys +import re + +from pykd import isWindbgExt +from pykd import dprintln +from pykd import expr +from pykd import typedVar +from pykd import addr64 +from pykd import sizeof + + +def addTableChilds( table, links ): + + table.append( links.getAddress() + sizeof( "nt", "_RTL_BALANCED_LINKS" ) ) + + if links.LeftChild != 0: + addTableChilds( table, typedVar("nt", "_RTL_BALANCED_LINKS", links.LeftChild) ) + if links.RightChild != 0: + addTableChilds( table, typedVar("nt", "_RTL_BALANCED_LINKS", links.RightChild) ) + + +def getAVLTable( addr ): + + table = [] + avl = typedVar( "nt", "_RTL_AVL_TABLE", addr ) + addTableChilds( table, avl.BalancedRoot ) + return table + + +def printUsage(): + dprintln( "!py avl [addr] (type)") + + +if __name__ == "__main__": + + if not isWindbgExt(): + print "this script should be run within windbg" + quit(0) + + if len( sys.argv ) < 2: + printUsage() + + if len( sys.argv ) == 2: + items = getAVLTable( addr64( expr( sys.argv[1] ) ) ) + dprintln( "\n".join( [ "<link cmd=\"db 0x%x\">db 0x%x</link>" % ( entry, entry ) for entry in items ] ), True ) + else: + items = getAVLTable( addr64( expr( sys.argv[1] ) ) ) + dprintln( "\n".join( [ "<link cmd=\"dt %s 0x%x\">dt %s</link>" % ( sys.argv[2], entry, sys.argv[2] ) for entry in items ] ), True ) + + +