1
2 import os
3 import vwidget
4 import vwidget.windows as vw_windows
5 import vwidget.util as vw_util
6 import vtrace.tools.win32heap as win32heap
7
8 import vdb
9 import vdb.gui
10
11 import envi.memcanvas as e_canvas
12 import vwidget.memview as vw_memview
13
14 import gtk
15 import pango
16
17 busy_color = (0xff, 0, 0)
18 def_color = (0, 0xff, 0)
19
21 """
22 A renderer which knows how to show heap chunks
23 (only to be used on aligned addresses, our parent window
24 takes care of that)
25 """
28
30 return " " * (size-len(buf))
31
33 for b in buf:
34 v = ord(b)
35 if v == 0:
36 continue
37 if v < 0x20 or v >= 0x7f:
38 return False
39 return True
40
42 chunk = win32heap.Win32Chunk(self.trace, va)
43 size = len(chunk)
44 canvas.addVaText("0x%.8x" % va, va=va)
45 canvas.addText(": ")
46 sizestr = str(len(chunk))
47 sizepad = self.getPad(sizestr, 7)
48 canvas.addText("CHUNK:%s" % sizepad)
49 canvas.addNameText(sizestr, name="chunk:%d" % size)
50 canvas.addText(" %s" % chunk.reprFlags())
51 canvas.addText("\n")
52
53 dva = chunk.getDataAddress()
54 dsize = chunk.getDataSize()
55
56 canvas.addVaText("0x%.8x" % dva, va=dva)
57 dsizestr = str(dsize)
58 dsizepad = self.getPad(dsizestr, 7)
59 canvas.addText(": %s" % dsizepad)
60 canvas.addNameText(dsizestr, name="data:%d" % dsize)
61 canvas.addText(": ")
62
63 bytes = self.trace.readMemory(dva, dsize)
64
65 if not chunk.isBusy():
66 flink, blink = self.trace.readMemoryFormat(dva, "PP")
67 canvas.addText("FLINK: ")
68 canvas.addVaText("0x%.8x" % flink, va=flink)
69 canvas.addText(" BLINK: ")
70 canvas.addVaText("0x%.8x" % blink, va=blink)
71 canvas.addText(" leftovers: %s" % bytes[8:8+32].encode('hex'))
72
73 else:
74 if self.isAscii(bytes):
75 canvas.addText(bytes[:128].replace("\x00",""))
76 else:
77 canvas.addText("%s" % bytes[:32].encode('hex'))
78
79 canvas.addText("\n")
80
81 return size
82
84
85 - def render(self, va, size, rend=None):
95
96
106
107
109 if active:
110 self.vbox.set_sensitive(True)
111 self.updateMemoryView()
112 else:
113 self.vbox.set_sensitive(False)
114
122
135
137 model = tree.get_model()
138 iter = model.get_iter(path)
139 chunk = model.get_value(iter, 0)
140 vdb.gui.MemoryWindow(self.vdb, "0x%.8x" % chunk.address, len_expr=str(len(chunk)))
141
153
156
158 tree = self.getWidget("Win32ChunkList")
159 tree.modify_font(self.font)
160 col1 = vw_util.makeColumn("Chunkaddr", 1)
161 col2 = vw_util.makeColumn("Size", 2)
162 col3 = vw_util.makeColumn("Busy", 3)
163 col4 = vw_util.makeColumn("Bytes", 4)
164 tree.append_column(col1)
165 tree.append_column(col2)
166 tree.append_column(col3)
167 tree.append_column(col4)
168 store = gtk.ListStore(object,str,str,str,str)
169 tree.set_model(store)
170
172 """
173 Because this is already parsing chunks, we'll have this update
174 the segment view as well.
175 """
176 tree = self.getWidget("Win32ChunkList")
177 model = tree.get_model()
178 model.clear()
179
180 spaces = []
181 for c in seg.getChunks():
182
183 if c.isBusy():
184 color = busy_color
185 bstr = "X"
186 else:
187 color = def_color
188 bstr = ""
189
190 bytes = c.getDataBytes(maxsize=10)
191 r = ""
192 for b in bytes:
193 ob = ord(b)
194 if ob >= 0x20 and ob < 0x7f:
195 r += b
196 else:
197 r += "."
198
199 spaces.append((c.address, len(c), color, r))
200 model.append((c, "0x%.8x" % c.address, len(c), bstr, r))
201
202 self.spaceview.updateSpaces(spaces)
203
214
230
232 """
233 Open a Win32 Heap View window.
234
235 Usage: heapview
236 """
237 Win32HeapWindow(db)
238
242