1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 """
29 CONTEXT structure for i386.
30 """
31
32 __revision__ = "$Id: context_i386.py 655 2010-03-30 17:00:27Z qvasimodo $"
33
34 from defines import *
35
36
37
38
39 EXCEPTION_READ_FAULT = 0
40 EXCEPTION_WRITE_FAULT = 1
41 EXCEPTION_EXECUTE_FAULT = 8
42
43 CONTEXT_i386 = 0x00010000
44 CONTEXT_i486 = 0x00010000
45
46 CONTEXT_CONTROL = (CONTEXT_i386 | 0x00000001L)
47 CONTEXT_INTEGER = (CONTEXT_i386 | 0x00000002L)
48 CONTEXT_SEGMENTS = (CONTEXT_i386 | 0x00000004L)
49 CONTEXT_FLOATING_POINT = (CONTEXT_i386 | 0x00000008L)
50 CONTEXT_DEBUG_REGISTERS = (CONTEXT_i386 | 0x00000010L)
51 CONTEXT_EXTENDED_REGISTERS = (CONTEXT_i386 | 0x00000020L)
52
53 CONTEXT_FULL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
54
55 CONTEXT_ALL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
56 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
57 CONTEXT_EXTENDED_REGISTERS)
58
59 SIZE_OF_80387_REGISTERS = 80
60 MAXIMUM_SUPPORTED_EXTENSION = 512
74 _pack_ = 1
75 _fields_ = [
76 ('ControlWord', DWORD),
77 ('StatusWord', DWORD),
78 ('TagWord', DWORD),
79 ('ErrorOffset', DWORD),
80 ('ErrorSelector', DWORD),
81 ('DataOffset', DWORD),
82 ('DataSelector', DWORD),
83 ('RegisterArea', BYTE * SIZE_OF_80387_REGISTERS),
84 ('Cr0NpxState', DWORD),
85 ]
86
87 _integer_members = ('ControlWord', 'StatusWord', 'TagWord', 'ErrorOffset', 'ErrorSelector', 'DataOffset', 'DataSelector', 'Cr0NpxState')
88
89 @classmethod
101
111
112 PFLOATING_SAVE_AREA = POINTER(FLOATING_SAVE_AREA)
113 LPFLOATING_SAVE_AREA = PFLOATING_SAVE_AREA
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 -class CONTEXT(Structure):
143 arch = 'i386'
144
145 _pack_ = 1
146
147
148
149
150
151
152
153
154
155 _fields_ = [
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 ('ContextFlags', DWORD),
174
175
176
177
178
179 ('Dr0', DWORD),
180 ('Dr1', DWORD),
181 ('Dr2', DWORD),
182 ('Dr3', DWORD),
183 ('Dr6', DWORD),
184 ('Dr7', DWORD),
185
186
187
188
189 ('FloatSave', FLOATING_SAVE_AREA),
190
191
192
193
194 ('SegGs', DWORD),
195 ('SegFs', DWORD),
196 ('SegEs', DWORD),
197 ('SegDs', DWORD),
198
199
200
201
202 ('Edi', DWORD),
203 ('Esi', DWORD),
204 ('Ebx', DWORD),
205 ('Edx', DWORD),
206 ('Ecx', DWORD),
207 ('Eax', DWORD),
208
209
210
211
212 ('Ebp', DWORD),
213 ('Eip', DWORD),
214 ('SegCs', DWORD),
215 ('EFlags', DWORD),
216 ('Esp', DWORD),
217 ('SegSs', DWORD),
218
219
220
221
222
223 ('ExtendedRegisters', BYTE * MAXIMUM_SUPPORTED_EXTENSION),
224 ]
225
226 _ctx_debug = ('Dr0', 'Dr1', 'Dr2', 'Dr3', 'Dr6', 'Dr7')
227 _ctx_segs = ('SegGs', 'SegFs', 'SegEs', 'SegDs', )
228 _ctx_int = ('Edi', 'Esi', 'Ebx', 'Edx', 'Ecx', 'Eax')
229 _ctx_ctrl = ('Ebp', 'Eip', 'SegCs', 'EFlags', 'Esp', 'SegSs')
230
231 @classmethod
232 - def from_dict(cls, ctx):
233 'Instance a new structure from a Python dictionary.'
234 ctx = Context(ctx)
235 s = cls()
236 ContextFlags = ctx['ContextFlags']
237 setattr(s, 'ContextFlags', ContextFlags)
238 if (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS:
239 for key in s._ctx_debug:
240 setattr(s, key, ctx[key])
241 if (ContextFlags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT:
242 fsa = ctx['FloatSave']
243 s.FloatSave = FLOATING_SAVE_AREA.from_dict(fsa)
244 if (ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS:
245 for key in s._ctx_segs:
246 setattr(s, key, ctx[key])
247 if (ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER:
248 for key in s._ctx_int:
249 setattr(s, key, ctx[key])
250 if (ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL:
251 for key in s._ctx_ctrl:
252 setattr(s, key, ctx[key])
253 if (ContextFlags & CONTEXT_EXTENDED_REGISTERS) == CONTEXT_EXTENDED_REGISTERS:
254 er = ctx['ExtendedRegisters']
255 for index in xrange(0, MAXIMUM_SUPPORTED_EXTENSION):
256 s.ExtendedRegisters[index] = er[index]
257 return s
258
260 'Convert a structure into a Python dictionary.'
261 ctx = Context()
262 ContextFlags = self.ContextFlags
263 ctx['ContextFlags'] = ContextFlags
264 if (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS:
265 for key in self._ctx_debug:
266 ctx[key] = getattr(self, key)
267 if (ContextFlags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT:
268 ctx['FloatSave'] = self.FloatSave.to_dict()
269 if (ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS:
270 for key in self._ctx_segs:
271 ctx[key] = getattr(self, key)
272 if (ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER:
273 for key in self._ctx_int:
274 ctx[key] = getattr(self, key)
275 if (ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL:
276 for key in self._ctx_ctrl:
277 ctx[key] = getattr(self, key)
278 if (ContextFlags & CONTEXT_EXTENDED_REGISTERS) == CONTEXT_EXTENDED_REGISTERS:
279 er = [ self.ExtendedRegisters[index] for index in xrange(0, MAXIMUM_SUPPORTED_EXTENSION) ]
280 er = tuple(er)
281 ctx['ExtendedRegisters'] = er
282 return ctx
283
284 PCONTEXT = POINTER(CONTEXT)
285 LPCONTEXT = PCONTEXT
286
287 -class Context(dict):
288 """
289 Register context dictionary for the %s architecture.
290 """ % CONTEXT.arch
291 arch = CONTEXT.arch
292
293 - def __get_pc(self):
295 - def __set_pc(self, value):
297 pc = property(__get_pc, __set_pc)
298
299 - def __get_sp(self):
301 - def __set_sp(self, value):
303 sp = property(__get_sp, __set_sp)
304
305 - def __get_fp(self):
307 - def __set_fp(self, value):
309 fp = property(__get_fp, __set_fp)
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339 -class _LDT_ENTRY_BYTES_(Structure):
340 _pack_ = 1
341 _fields_ = [
342 ('BaseMid', BYTE),
343 ('Flags1', BYTE),
344 ('Flags2', BYTE),
345 ('BaseHi', BYTE),
346 ]
347
348 -class _LDT_ENTRY_BITS_(Structure):
349 _pack_ = 1
350 _fields_ = [
351 ('BaseMid', DWORD, 8),
352 ('Type', DWORD, 5),
353 ('Dpl', DWORD, 2),
354 ('Pres', DWORD, 1),
355 ('LimitHi', DWORD, 4),
356 ('Sys', DWORD, 1),
357 ('Reserved_0', DWORD, 1),
358 ('Default_Big', DWORD, 1),
359 ('Granularity', DWORD, 1),
360 ('BaseHi', DWORD, 8),
361 ]
362
364 _pack_ = 1
365 _fields_ = [
366 ('Bytes', _LDT_ENTRY_BYTES_),
367 ('Bits', _LDT_ENTRY_BITS_),
368 ]
369
370 -class LDT_ENTRY(Structure):
371 _pack_ = 1
372 _fields_ = [
373 ('LimitLow', WORD),
374 ('BaseLow', WORD),
375 ('HighWord', _LDT_ENTRY_HIGHWORD_),
376 ]
377
378 PLDT_ENTRY = POINTER(LDT_ENTRY)
379 LPLDT_ENTRY = PLDT_ENTRY
380
381
382
383
384
385
386
387
388 -def GetThreadSelectorEntry(hThread, dwSelector):
389 _GetThreadSelectorEntry = windll.kernel32.GetThreadSelectorEntry
390 _GetThreadSelectorEntry.argtypes = [HANDLE, DWORD, LPLDT_ENTRY]
391 _GetThreadSelectorEntry.restype = bool
392 _GetThreadSelectorEntry.errcheck = RaiseIfZero
393
394 ldt = LDT_ENTRY()
395 _GetThreadSelectorEntry(hThread, dwSelector, ctypes.byref(ldt))
396 return ldt
397
398
399
400
401
402 -def GetThreadContext(hThread, ContextFlags = None):
403 _GetThreadContext = windll.kernel32.GetThreadContext
404 _GetThreadContext.argtypes = [HANDLE, LPCONTEXT]
405 _GetThreadContext.restype = bool
406 _GetThreadContext.errcheck = RaiseIfZero
407
408 if ContextFlags is None:
409 ContextFlags = CONTEXT_ALL
410 lpContext = CONTEXT()
411 lpContext.ContextFlags = ContextFlags
412 _GetThreadContext(hThread, ctypes.byref(lpContext))
413 return lpContext.to_dict()
414
415
416
417
418
419 -def SetThreadContext(hThread, lpContext):
420 _SetThreadContext = windll.kernel32.SetThreadContext
421 _SetThreadContext.argtypes = [HANDLE, LPCONTEXT]
422 _SetThreadContext.restype = bool
423 _SetThreadContext.errcheck = RaiseIfZero
424
425 if isinstance(lpContext, dict):
426 lpContext = CONTEXT.from_dict(lpContext)
427 _SetThreadContext(hThread, ctypes.byref(lpContext))
428