github.com/kbinani/win@v0.3.0/win_windows.go (about) 1 package win 2 3 import ( 4 "fmt" 5 "math" 6 "syscall" 7 ) 8 9 func doLoadLibrary(name string) uintptr { 10 lib, _ := syscall.LoadLibrary(name) 11 return uintptr(lib) 12 } 13 14 func doGetProcAddress(lib uintptr, name string) uintptr { 15 addr, _ := syscall.GetProcAddress(syscall.Handle(lib), name) 16 return uintptr(addr) 17 } 18 19 func syscall3(trap, nargs, a1, a2, a3 uintptr) uintptr { 20 ret, _, _ := syscall.Syscall(trap, nargs, a1, a2, a3) 21 return ret 22 } 23 24 func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) uintptr { 25 ret, _, _ := syscall.Syscall6(trap, nargs, a1, a2, a3, a4, a5, a6) 26 return ret 27 } 28 29 func syscall9(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) uintptr { 30 ret, _, _ := syscall.Syscall9(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9) 31 return ret 32 } 33 34 func syscall12(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 uintptr) uintptr { 35 ret, _, _ := syscall.Syscall12(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) 36 return ret 37 } 38 39 func syscall15(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) uintptr { 40 ret, _, _ := syscall.Syscall15(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) 41 return ret 42 } 43 44 func syscallN(trap uintptr, args []uintptr) uintptr { 45 n := len(args) 46 num := int(math.Max(1.0, math.Ceil(float64(n)/3.0))) * 3 47 for i := n; i < num; i++ { 48 args = append(args, 0) 49 } 50 if num == 3 { 51 ret, _, _ := syscall.Syscall(trap, uintptr(n), 52 args[0], args[1], args[2]) 53 return ret 54 } else if num == 6 { 55 ret, _, _ := syscall.Syscall6(trap, uintptr(n), 56 args[0], args[1], args[2], 57 args[3], args[4], args[5]) 58 return ret 59 } else if num == 9 { 60 ret, _, _ := syscall.Syscall9(trap, uintptr(n), 61 args[0], args[1], args[2], 62 args[3], args[4], args[5], 63 args[6], args[7], args[8]) 64 return ret 65 } else if num == 12 { 66 ret, _, _ := syscall.Syscall12(trap, uintptr(n), 67 args[0], args[1], args[2], 68 args[3], args[4], args[5], 69 args[6], args[7], args[8], 70 args[9], args[10], args[11]) 71 return ret 72 } else if num == 15 { 73 ret, _, _ := syscall.Syscall15(trap, uintptr(n), 74 args[0], args[1], args[2], 75 args[3], args[4], args[5], 76 args[6], args[7], args[8], 77 args[9], args[10], args[11], 78 args[12], args[13], args[14]) 79 return ret 80 } else { 81 panic(fmt.Errorf("Too many syscall arguments: %d", n)) 82 } 83 } 84 85 func getUintptrFromBool(b bool) uintptr { 86 if b { 87 return 1 88 } else { 89 return 0 90 } 91 }