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  }