// 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;
}
