-
Notifications
You must be signed in to change notification settings - Fork 5
/
Structs.nim
80 lines (75 loc) · 2.5 KB
/
Structs.nim
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#define MAX_STACK_SIZE 12000
#define RBP_OP_INFO 0x5
const MAX_STACK_SIZE* = 12000
const RBP_OP_INFO* = 0x5
type
HelperStackFrame* {.bycopy,packed.} = object
dllName*:string
offset*:uint64
totalStackSize*:uint64
requiresLoadLibrary*:bool
setsFramePointer*:bool
returnAddress*:uint64
pushRbp*:bool
countOfCodes*:int
pushRbpIndex*:int
#[
typedef union _UNWIND_CODE {
struct {
unsigned char CodeOffset;
unsigned char UnwindOp : 4;
unsigned char OpInfo : 4;
};
unsigned short FrameOffset;
} UNWIND_CODE, *PUNWIND_CODE;
]#
INNER_UNWIND_CODESTRUCT {.bycopy, packed.} = object
codeOffset*: uint8
unwindOp* {.bitsize: 4.}: uint8
opInfo* {.bitsize: 4.}: uint8
UNWIND_CODE* {.bycopy,packed, union.} = object
innerStruct*: INNER_UNWIND_CODESTRUCT
frameOffset*: cushort
#[
typedef struct _UNWIND_INFO {
unsigned char Version : 3;
unsigned char Flags : 5;
unsigned char SizeOfProlog;
unsigned char CountOfCodes;
unsigned char FrameRegister : 4;
unsigned char FrameOffset : 4;
UNWIND_CODE UnwindCode[1];
} UNWIND_INFO, * PUNWIND_INFO;
]#
UNWIND_INFO* {.bycopy,packed.} = object
version* {.bitsize: 3.}: uint8
flags* {.bitsize: 5.}: uint8
sizeOfProlog*: uint8
countOfCodes*: uint8
frameRegister* {.bitsize: 4.}: uint8
frameOffset* {.bitsize: 4.}: uint8
#unwindCode*: ptr UNWIND_CODE
unwindCode*:array[1,UNWIND_CODE]
#[
typedef enum _UNWIND_OP_CODES {
UWOP_PUSH_NONVOL = 0, /* info == register number */
UWOP_ALLOC_LARGE, /* no info, alloc size in next 2 slots */
UWOP_ALLOC_SMALL, /* info == size of allocation / 8 - 1 */
UWOP_SET_FPREG, /* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */
UWOP_SAVE_NONVOL, /* info == register number, offset in next slot */
UWOP_SAVE_NONVOL_FAR, /* info == register number, offset in next 2 slots */
UWOP_SAVE_XMM128 = 8, /* info == XMM reg number, offset in next slot */
UWOP_SAVE_XMM128_FAR, /* info == XMM reg number, offset in next 2 slots */
UWOP_PUSH_MACHFRAME /* info == 0: no error-code, 1: error-code */
} UNWIND_CODE_OPS;
]#
UNWIND_CODE_OPS* = enum
UWOP_PUSH_NONVOL = 0,
UWOP_ALLOC_LARGE,
UWOP_ALLOC_SMALL,
UWOP_SET_FPREG,
UWOP_SAVE_NONVOL,
UWOP_SAVE_NONVOL_FAR,
UWOP_SAVE_XMM128 = 8,
UWOP_SAVE_XMM128_FAR,
UWOP_PUSH_MACHFRAME