|
|
@@ -7,6 +7,7 @@ package windows
|
|
|
import (
|
|
|
"sync"
|
|
|
"sync/atomic"
|
|
|
+ "syscall"
|
|
|
"unsafe"
|
|
|
)
|
|
|
|
|
|
@@ -19,14 +20,9 @@ type DLLError struct {
|
|
|
|
|
|
func (e *DLLError) Error() string { return e.Msg }
|
|
|
|
|
|
-// Implemented in runtime/syscall_windows.goc.
|
|
|
-func Syscall(trap, nargs, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
|
|
|
-func Syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
|
|
|
-func Syscall9(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
|
|
|
-func Syscall12(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 uintptr) (r1, r2 uintptr, err Errno)
|
|
|
-func Syscall15(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2 uintptr, err Errno)
|
|
|
-func loadlibrary(filename *uint16) (handle uintptr, err Errno) // TODO: must be exported.
|
|
|
-func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err Errno) // TODO: must be exported.
|
|
|
+// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file.
|
|
|
+func loadlibrary(filename *uint16) (handle uintptr, err Errno)
|
|
|
+func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err Errno)
|
|
|
|
|
|
// A DLL implements access to a single DLL.
|
|
|
type DLL struct {
|
|
|
@@ -124,37 +120,37 @@ func (p *Proc) Addr() uintptr {
|
|
|
func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
|
|
|
switch len(a) {
|
|
|
case 0:
|
|
|
- return Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0)
|
|
|
+ return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0)
|
|
|
case 1:
|
|
|
- return Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0)
|
|
|
+ return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0)
|
|
|
case 2:
|
|
|
- return Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0)
|
|
|
+ return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0)
|
|
|
case 3:
|
|
|
- return Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2])
|
|
|
+ return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2])
|
|
|
case 4:
|
|
|
- return Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0)
|
|
|
+ return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0)
|
|
|
case 5:
|
|
|
- return Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0)
|
|
|
+ return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0)
|
|
|
case 6:
|
|
|
- return Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5])
|
|
|
+ return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5])
|
|
|
case 7:
|
|
|
- return Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0)
|
|
|
+ return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0)
|
|
|
case 8:
|
|
|
- return Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0)
|
|
|
+ return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0)
|
|
|
case 9:
|
|
|
- return Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8])
|
|
|
+ return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8])
|
|
|
case 10:
|
|
|
- return Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0)
|
|
|
+ return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0)
|
|
|
case 11:
|
|
|
- return Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0)
|
|
|
+ return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0)
|
|
|
case 12:
|
|
|
- return Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11])
|
|
|
+ return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11])
|
|
|
case 13:
|
|
|
- return Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0)
|
|
|
+ return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0)
|
|
|
case 14:
|
|
|
- return Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0)
|
|
|
+ return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0)
|
|
|
case 15:
|
|
|
- return Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14])
|
|
|
+ return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14])
|
|
|
default:
|
|
|
panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".")
|
|
|
}
|