MCPcopy Create free account
hub / github.com/Binject/universal / Call

Method Call

loader_windows.go:147–205  ·  view source on GitHub ↗

Call - call a function in a loaded library cribbed from: https://golang.org/src/Syscall/dll_windows.go On amd64, Call can pass and return floating-point values. To pass an argument x with C type "float", use uintptr(math.Float32bits(x)). To pass an argument with C type "double", use uintptr(math.F

(functionName string, args ...uintptr)

Source from the content-addressed store, hash-verified

145// math.Float32frombits(uint32(r2)). For C type "double", it is
146// math.Float64frombits(uint64(r2)).
147func (l *Library) Call(functionName string, args ...uintptr) (uintptr, error) {
148
149 proc, ok := l.FindProc(functionName)
150 if !ok {
151 return 0, errors.New("Call did not find export " + functionName)
152 }
153 var r uintptr
154 var errno syscall.Errno
155 var err error
156 switch len(args) {
157 case 0:
158 r, _, errno = syscall.Syscall(proc, uintptr(len(args)), 0, 0, 0)
159 case 1:
160 r, _, errno = syscall.Syscall(proc, uintptr(len(args)), args[0], 0, 0)
161 case 2:
162 r, _, errno = syscall.Syscall(proc, uintptr(len(args)), args[0], args[1], 0)
163 case 3:
164 r, _, errno = syscall.Syscall(proc, uintptr(len(args)), args[0], args[1], args[2])
165 case 4:
166 r, _, errno = syscall.Syscall6(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], 0, 0)
167 case 5:
168 r, _, errno = syscall.Syscall6(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], 0)
169 case 6:
170 r, _, errno = syscall.Syscall6(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5])
171 case 7:
172 r, _, errno = syscall.Syscall9(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], 0, 0)
173 case 8:
174 r, _, errno = syscall.Syscall9(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], 0)
175 case 9:
176 r, _, errno = syscall.Syscall9(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8])
177 case 10:
178 r, _, errno = syscall.Syscall12(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], 0, 0)
179 case 11:
180 r, _, errno = syscall.Syscall12(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], 0)
181 case 12:
182 r, _, errno = syscall.Syscall12(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11])
183 case 13:
184 r, _, errno = syscall.Syscall15(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], 0, 0)
185 case 14:
186 r, _, errno = syscall.Syscall15(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], 0)
187 case 15:
188 r, _, errno = syscall.Syscall15(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14])
189 case 16:
190 r, _, errno = syscall.Syscall18(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], 0, 0)
191 case 17:
192 r, _, errno = syscall.Syscall18(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], args[16], 0)
193 case 18:
194 r, _, errno = syscall.Syscall18(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], args[16], args[17])
195 default:
196 return 0, errors.New("Call " + functionName + " with too many arguments " + strconv.Itoa(len(args)) + ".")
197 }
198 if errno != 0 {
199 errString := errno.Error()
200 if errString != "" {
201 err = errors.New(errString)
202 }
203 }
204 return r, err

Callers 1

virtualAllocFunction · 0.45

Calls 1

FindProcMethod · 0.95

Tested by

no test coverage detected