lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// created by cgo -cdefs and then converted to Go
// cgo -cdefs defs_windows.go
 
package runtime
 
const (
   _PROT_NONE  = 0
   _PROT_READ  = 1
   _PROT_WRITE = 2
   _PROT_EXEC  = 4
 
   _MAP_ANON    = 1
   _MAP_PRIVATE = 2
 
   _DUPLICATE_SAME_ACCESS   = 0x2
   _THREAD_PRIORITY_HIGHEST = 0x2
 
   _SIGINT           = 0x2
   _CTRL_C_EVENT     = 0x0
   _CTRL_BREAK_EVENT = 0x1
 
   _CONTEXT_CONTROL = 0x10001
   _CONTEXT_FULL    = 0x10007
 
   _EXCEPTION_ACCESS_VIOLATION     = 0xc0000005
   _EXCEPTION_BREAKPOINT           = 0x80000003
   _EXCEPTION_FLT_DENORMAL_OPERAND = 0xc000008d
   _EXCEPTION_FLT_DIVIDE_BY_ZERO   = 0xc000008e
   _EXCEPTION_FLT_INEXACT_RESULT   = 0xc000008f
   _EXCEPTION_FLT_OVERFLOW         = 0xc0000091
   _EXCEPTION_FLT_UNDERFLOW        = 0xc0000093
   _EXCEPTION_INT_DIVIDE_BY_ZERO   = 0xc0000094
   _EXCEPTION_INT_OVERFLOW         = 0xc0000095
 
   _INFINITE     = 0xffffffff
   _WAIT_TIMEOUT = 0x102
 
   _EXCEPTION_CONTINUE_EXECUTION = -0x1
   _EXCEPTION_CONTINUE_SEARCH    = 0x0
)
 
type systeminfo struct {
   anon0                       [4]byte
   dwpagesize                  uint32
   lpminimumapplicationaddress *byte
   lpmaximumapplicationaddress *byte
   dwactiveprocessormask       uint32
   dwnumberofprocessors        uint32
   dwprocessortype             uint32
   dwallocationgranularity     uint32
   wprocessorlevel             uint16
   wprocessorrevision          uint16
}
 
type exceptionrecord struct {
   exceptioncode        uint32
   exceptionflags       uint32
   exceptionrecord      *exceptionrecord
   exceptionaddress     *byte
   numberparameters     uint32
   exceptioninformation [15]uint32
}
 
type floatingsavearea struct {
   controlword   uint32
   statusword    uint32
   tagword       uint32
   erroroffset   uint32
   errorselector uint32
   dataoffset    uint32
   dataselector  uint32
   registerarea  [80]uint8
   cr0npxstate   uint32
}
 
type context struct {
   contextflags      uint32
   dr0               uint32
   dr1               uint32
   dr2               uint32
   dr3               uint32
   dr6               uint32
   dr7               uint32
   floatsave         floatingsavearea
   seggs             uint32
   segfs             uint32
   seges             uint32
   segds             uint32
   edi               uint32
   esi               uint32
   ebx               uint32
   edx               uint32
   ecx               uint32
   eax               uint32
   ebp               uint32
   eip               uint32
   segcs             uint32
   eflags            uint32
   esp               uint32
   segss             uint32
   extendedregisters [512]uint8
}
 
func (c *context) ip() uintptr { return uintptr(c.eip) }
func (c *context) sp() uintptr { return uintptr(c.esp) }
 
// 386 does not have link register, so this returns 0.
func (c *context) lr() uintptr      { return 0 }
func (c *context) set_lr(x uintptr) {}
 
func (c *context) set_ip(x uintptr) { c.eip = uint32(x) }
func (c *context) set_sp(x uintptr) { c.esp = uint32(x) }
 
func dumpregs(r *context) {
   print("eax     ", hex(r.eax), "\n")
   print("ebx     ", hex(r.ebx), "\n")
   print("ecx     ", hex(r.ecx), "\n")
   print("edx     ", hex(r.edx), "\n")
   print("edi     ", hex(r.edi), "\n")
   print("esi     ", hex(r.esi), "\n")
   print("ebp     ", hex(r.ebp), "\n")
   print("esp     ", hex(r.esp), "\n")
   print("eip     ", hex(r.eip), "\n")
   print("eflags  ", hex(r.eflags), "\n")
   print("cs      ", hex(r.segcs), "\n")
   print("fs      ", hex(r.segfs), "\n")
   print("gs      ", hex(r.seggs), "\n")
}
 
type overlapped struct {
   internal     uint32
   internalhigh uint32
   anon0        [8]byte
   hevent       *byte
}
 
type memoryBasicInformation struct {
   baseAddress       uintptr
   allocationBase    uintptr
   allocationProtect uint32
   regionSize        uintptr
   state             uint32
   protect           uint32
   type_             uint32
}