pykd

Форк
0
/
avl.py 
64 строки · 1.8 Кб
1
#
2
#
3
#
4

5
import sys
6
import re
7

8
from pykd import isWindbgExt
9
from pykd import dprintln
10
from pykd import expr
11
from pykd import typedVar
12
from pykd import typeInfo
13
from pykd import addr64
14
from pykd import sizeof
15

16

17
def addTableChilds( table, links ):
18
   
19
    table.append( links.getAddress() + sizeof( "nt!_RTL_BALANCED_LINKS" ) )
20

21
    if links.LeftChild != 0:
22
        addTableChilds( table, typedVar("nt!_RTL_BALANCED_LINKS", links.LeftChild) )
23
    if links.RightChild != 0:
24
        addTableChilds( table, typedVar("nt!_RTL_BALANCED_LINKS", links.RightChild) )       
25

26

27
def getAVLTable( addr ):
28

29
    table = []
30
    avl = typedVar( "nt!_RTL_AVL_TABLE", addr )
31
    addTableChilds( table, avl.BalancedRoot )
32
    return table
33

34

35
def printUsage():
36
    dprintln( "!py avl [addr] (type)")
37

38

39
if __name__ == "__main__":
40

41
    if len( sys.argv ) < 2:
42
        printUsage()
43
        quit(0)
44
   
45
    showAll = False
46
    args = sys.argv
47
    if '-a' in args:
48
        args.remove('-a')
49
        showAll = True
50
        
51
    items = getAVLTable( addr64( expr( sys.argv[1] ) ) )       
52
        
53
    if showAll:
54
        if len( sys.argv ) == 2:
55
            dprintln( "\n".join( [ "<link cmd=\"db 0x%x\">db 0x%x</link>" % (  entry, entry ) for entry in items ] ), True )
56
        else:
57
            ti = typeInfo(sys.argv[2])
58
            dprintln( "\n".join( [ "<link cmd=\"dt %s 0x%x\">dt %s</link>\n%s" % ( sys.argv[2], entry, sys.argv[2], typedVar(ti, entry) ) for entry in items ] ), True )  
59
    
60
    else:
61
        if len( sys.argv ) == 2:
62
            dprintln( "\n".join( [ "<link cmd=\"db 0x%x\">db 0x%x</link>" % (  entry, entry ) for entry in items ] ), True )
63
        else:
64
            dprintln( "\n".join( [ "<link cmd=\"dt %s 0x%x\">dt %s</link>" % ( sys.argv[2], entry, sys.argv[2] ) for entry in items ] ), True )
65
 
66

67

68

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.