You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.7 KiB
89 lines
2.7 KiB
4 months ago
|
# DExTer : Debugging Experience Tester
|
||
|
# ~~~~~~ ~ ~~ ~ ~~
|
||
|
#
|
||
|
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
|
# See https://llvm.org/LICENSE.txt for license information.
|
||
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
|
||
|
from ctypes import *
|
||
|
from enum import *
|
||
|
from functools import partial
|
||
|
|
||
|
from .utils import *
|
||
|
|
||
|
class BreakpointTypes(IntEnum):
|
||
|
DEBUG_BREAKPOINT_CODE = 0
|
||
|
DEBUG_BREAKPOINT_DATA = 1
|
||
|
DEBUG_BREAKPOINT_TIME = 2
|
||
|
DEBUG_BREAKPOINT_INLINE = 3
|
||
|
|
||
|
class BreakpointFlags(IntFlag):
|
||
|
DEBUG_BREAKPOINT_GO_ONLY = 0x00000001
|
||
|
DEBUG_BREAKPOINT_DEFERRED = 0x00000002
|
||
|
DEBUG_BREAKPOINT_ENABLED = 0x00000004
|
||
|
DEBUG_BREAKPOINT_ADDER_ONLY = 0x00000008
|
||
|
DEBUG_BREAKPOINT_ONE_SHOT = 0x00000010
|
||
|
|
||
|
DebugBreakpoint2IID = IID(0x1b278d20, 0x79f2, 0x426e, IID_Data4_Type(0xa3, 0xf9, 0xc1, 0xdd, 0xf3, 0x75, 0xd4, 0x8e))
|
||
|
|
||
|
class DebugBreakpoint2(Structure):
|
||
|
pass
|
||
|
|
||
|
class DebugBreakpoint2Vtbl(Structure):
|
||
|
wrp = partial(WINFUNCTYPE, c_long, POINTER(DebugBreakpoint2))
|
||
|
idb_setoffset = wrp(c_ulonglong)
|
||
|
idb_setflags = wrp(c_ulong)
|
||
|
_fields_ = [
|
||
|
("QueryInterface", c_void_p),
|
||
|
("AddRef", c_void_p),
|
||
|
("Release", c_void_p),
|
||
|
("GetId", c_void_p),
|
||
|
("GetType", c_void_p),
|
||
|
("GetAdder", c_void_p),
|
||
|
("GetFlags", c_void_p),
|
||
|
("AddFlags", c_void_p),
|
||
|
("RemoveFlags", c_void_p),
|
||
|
("SetFlags", idb_setflags),
|
||
|
("GetOffset", c_void_p),
|
||
|
("SetOffset", idb_setoffset),
|
||
|
("GetDataParameters", c_void_p),
|
||
|
("SetDataParameters", c_void_p),
|
||
|
("GetPassCount", c_void_p),
|
||
|
("SetPassCount", c_void_p),
|
||
|
("GetCurrentPassCount", c_void_p),
|
||
|
("GetMatchThreadId", c_void_p),
|
||
|
("SetMatchThreadId", c_void_p),
|
||
|
("GetCommand", c_void_p),
|
||
|
("SetCommand", c_void_p),
|
||
|
("GetOffsetExpression", c_void_p),
|
||
|
("SetOffsetExpression", c_void_p),
|
||
|
("GetParameters", c_void_p),
|
||
|
("GetCommandWide", c_void_p),
|
||
|
("SetCommandWide", c_void_p),
|
||
|
("GetOffsetExpressionWide", c_void_p),
|
||
|
("SetOffsetExpressionWide", c_void_p)
|
||
|
]
|
||
|
|
||
|
DebugBreakpoint2._fields_ = [("lpVtbl", POINTER(DebugBreakpoint2Vtbl))]
|
||
|
|
||
|
class Breakpoint(object):
|
||
|
def __init__(self, breakpoint):
|
||
|
self.breakpoint = breakpoint.contents
|
||
|
self.vt = self.breakpoint.lpVtbl.contents
|
||
|
|
||
|
def SetFlags(self, flags):
|
||
|
res = self.vt.SetFlags(self.breakpoint, flags)
|
||
|
aborter(res, "Breakpoint SetFlags")
|
||
|
|
||
|
def SetOffset(self, offs):
|
||
|
res = self.vt.SetOffset(self.breakpoint, offs)
|
||
|
aborter(res, "Breakpoint SetOffset")
|
||
|
|
||
|
def RemoveFlags(self, flags):
|
||
|
res = self.vt.RemoveFlags(self.breakpoint, flags)
|
||
|
aborter(res, "Breakpoint RemoveFlags")
|
||
|
|
||
|
def die(self):
|
||
|
self.breakpoint = None
|
||
|
self.vt = None
|