| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package syscall |
| #include "runtime.h" |
| #include "os.h" |
| |
| func loadlibraryex(filename uintptr) (handle uint32) { |
| StdcallParams p; |
| p.fn = (void*)LoadLibraryEx; |
| p.args[0] = filename; |
| p.args[1] = 0; |
| p.args[2] = 0; |
| ·entersyscall(); |
| syscall(&p); |
| ·exitsyscall(); |
| handle = p.r; |
| } |
| |
| func getprocaddress(handle uint32, procname uintptr) (proc uintptr) { |
| StdcallParams p; |
| p.fn = (void*)GetProcAddress; |
| p.args[0] = handle; |
| p.args[1] = procname; |
| ·entersyscall(); |
| syscall(&p); |
| ·exitsyscall(); |
| proc = p.r; |
| } |
| |
| func Syscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err uintptr) { |
| StdcallParams p; |
| p.fn = (void*)trap; |
| p.args[0] = a1; |
| p.args[1] = a2; |
| p.args[2] = a3; |
| ·entersyscall(); |
| syscall(&p); |
| ·exitsyscall(); |
| r1 = p.r; |
| r2 = 0; |
| err = p.err; |
| } |
| |
| func Syscall6(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr) (r1 uintptr, r2 uintptr, err uintptr) { |
| StdcallParams p; |
| p.fn = (void*)trap; |
| p.args[0] = a1; |
| p.args[1] = a2; |
| p.args[2] = a3; |
| p.args[3] = a4; |
| p.args[4] = a5; |
| p.args[5] = a6; |
| ·entersyscall(); |
| syscall(&p); |
| ·exitsyscall(); |
| r1 = p.r; |
| r2 = 0; |
| err = p.err; |
| } |
| |
| func Syscall9(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr, a7 uintptr, a8 uintptr, a9 uintptr) (r1 uintptr, r2 uintptr, lasterr uintptr) { |
| StdcallParams p; |
| p.fn = (void*)trap; |
| p.args[0] = a1; |
| p.args[1] = a2; |
| p.args[2] = a3; |
| p.args[3] = a4; |
| p.args[4] = a5; |
| p.args[5] = a6; |
| p.args[6] = a7; |
| p.args[7] = a8; |
| p.args[8] = a9; |
| ·entersyscall(); |
| syscall(&p); |
| ·exitsyscall(); |
| r1 = p.r; |
| r2 = 0; |
| lasterr = p.err; |
| } |
| |
| func RawSyscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err uintptr) { |
| StdcallParams p; |
| p.fn = (void*)trap; |
| p.args[0] = a1; |
| p.args[1] = a2; |
| p.args[2] = a3; |
| syscall(&p); |
| r1 = p.r; |
| r2 = 0; |
| err = p.err; |
| } |