xref: /llvm-project/cross-project-tests/debuginfo-tests/dexter/dex/debugger/dbgeng/utils.py (revision f98ee40f4b5d7474fc67e82824bf6abbaedb7b1c)
1# DExTer : Debugging Experience Tester
2# ~~~~~~   ~         ~~         ~   ~~
3#
4# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5# See https://llvm.org/LICENSE.txt for license information.
6# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7
8from ctypes import *
9
10# Error codes are negative when received by python, but are typically
11# represented by unsigned hex elsewhere. Subtract 2^32 from the unsigned
12# hex to produce negative error codes.
13E_NOINTERFACE = 0x80004002 - 0x100000000
14E_FAIL = 0x80004005 - 0x100000000
15E_EINVAL = 0x80070057 - 0x100000000
16E_INTERNALEXCEPTION = 0x80040205 - 0x100000000
17S_FALSE = 1
18
19# This doesn't fit into any convenient category
20DEBUG_ANY_ID = 0xFFFFFFFF
21
22
23class WinError(Exception):
24    def __init__(self, msg, hstatus):
25        self.hstatus = hstatus
26        super(WinError, self).__init__(msg)
27
28
29def aborter(res, msg, ignore=[]):
30    if res != 0 and res not in ignore:
31        # Convert a negative error code to a positive unsigned one, which is
32        # now NTSTATUSes appear in documentation.
33        if res < 0:
34            res += 0x100000000
35        msg = "{:08X} : {}".format(res, msg)
36        raise WinError(msg, res)
37
38
39IID_Data4_Type = c_ubyte * 8
40
41
42class IID(Structure):
43    _fields_ = [
44        ("Data1", c_uint),
45        ("Data2", c_ushort),
46        ("Data3", c_ushort),
47        ("Data4", IID_Data4_Type),
48    ]
49
50
51c_ulong_p = POINTER(c_ulong)
52c_ulong64_p = POINTER(c_ulonglong)
53