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 )
+ 
+
+