# 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