1
2
3
4
5 package windows
6
7 import (
8 "internal/goarch"
9 "unsafe"
10 )
11
12 const CONTEXT_CONTROL = 0x100001
13
14 type M128 struct {
15 Low uint64
16 High int64
17 }
18
19 type Context struct {
20 P1Home uint64
21 P2Home uint64
22 P3Home uint64
23 P4Home uint64
24 P5Home uint64
25 P6Home uint64
26 ContextFlags uint32
27 MxCsr uint32
28 SegCs uint16
29 SegDs uint16
30 SegEs uint16
31 SegFs uint16
32 SegGs uint16
33 SegSs uint16
34 EFlags uint32
35 DR0 uint64
36 DR1 uint64
37 DR2 uint64
38 DR3 uint64
39 DR6 uint64
40 DR7 uint64
41 Rax uint64
42 Rcx uint64
43 Rdx uint64
44 Rbx uint64
45 Rsp uint64
46 Rbp uint64
47 Rsi uint64
48 Rdi uint64
49 R8 uint64
50 R9 uint64
51 R10 uint64
52 R11 uint64
53 R12 uint64
54 R13 uint64
55 R14 uint64
56 R15 uint64
57 Rip uint64
58 _ [512]byte
59 VectorRegister [26]M128
60 VectorControl uint64
61 DebugControl uint64
62 LastBranchToRip uint64
63 LastBranchFromRip uint64
64 LastExceptionToRip uint64
65 LastExceptionFromRip uint64
66 }
67
68 func (c *Context) PC() uintptr { return uintptr(c.Rip) }
69 func (c *Context) SP() uintptr { return uintptr(c.Rsp) }
70
71
72 func (c *Context) LR() uintptr { return 0 }
73 func (c *Context) SetLR(x uintptr) {}
74
75 func (c *Context) SetPC(x uintptr) { c.Rip = uint64(x) }
76 func (c *Context) SetSP(x uintptr) { c.Rsp = uint64(x) }
77 func (c *Context) SetFP(x uintptr) { c.Rbp = uint64(x) }
78
79 func (c *Context) PushCall(targetPC, resumePC uintptr) {
80 sp := c.SP() - goarch.StackAlign
81 *(*uintptr)(unsafe.Pointer(sp)) = resumePC
82 c.SetSP(sp)
83 c.SetPC(targetPC)
84 }
85
86 type DISPATCHER_CONTEXT struct {
87 ControlPc uint64
88 ImageBase uint64
89 FunctionEntry uintptr
90 EstablisherFrame uint64
91 TargetIp uint64
92 Context *Context
93 LanguageHandler uintptr
94 HandlerData uintptr
95 }
96
97 func (c *DISPATCHER_CONTEXT) Ctx() *Context {
98 return c.Context
99 }
100
View as plain text