// 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"
#include "cgocall.h"

func loadlibraryex(filename uintptr) (handle uintptr) {
	uintptr args[3] = { filename };
	WinCall c;

	c.fn = runtime·LoadLibraryEx;
	c.n = 3;
	c.args = &args[0];
	runtime·cgocall(runtime·asmstdcall, &c);
	handle = c.r1;
}

func getprocaddress(handle uintptr, procname uintptr) (proc uintptr) {
	WinCall c;

	USED(procname);
	c.fn = runtime·GetProcAddress;
	c.n = 2;
	c.args = &handle;
	runtime·cgocall(runtime·asmstdcall, &c);
	proc = c.r1;
}

func NewCallback(fn Eface) (code uintptr) {
	code = (uintptr)runtime·compilecallback(fn, true);
}

func NewCallbackCDecl(fn Eface) (code uintptr) {
	code = (uintptr)runtime·compilecallback(fn, false);
}

func Syscall(fn uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err uintptr) {
	WinCall c;

	USED(a2);
	USED(a3);
	c.fn = (void*)fn;
	c.n = nargs;
	c.args = &a1;
	runtime·cgocall(runtime·asmstdcall, &c);
	err = c.err;
	r1 = c.r1;
	r2 = c.r2;
}

func Syscall6(fn uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr) (r1 uintptr, r2 uintptr, err uintptr) {
	WinCall c;

	USED(a2);
	USED(a3);
	USED(a4);
	USED(a5);
	USED(a6);
	c.fn = (void*)fn;
	c.n = nargs;
	c.args = &a1;
	runtime·cgocall(runtime·asmstdcall, &c);
	err = c.err;
	r1 = c.r1;
	r2 = c.r2;
}

func Syscall9(fn uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr, a7 uintptr, a8 uintptr, a9 uintptr) (r1 uintptr, r2 uintptr, err uintptr) {
	WinCall c;

	USED(a2);
	USED(a3);
	USED(a4);
	USED(a5);
	USED(a6);
	USED(a7);
	USED(a8);
	USED(a9);
	c.fn = (void*)fn;
	c.n = nargs;
	c.args = &a1;
	runtime·cgocall(runtime·asmstdcall, &c);
	err = c.err;
	r1 = c.r1;
	r2 = c.r2;
}

func Syscall12(fn uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr, a7 uintptr, a8 uintptr, a9 uintptr, a10 uintptr, a11 uintptr, a12 uintptr) (r1 uintptr, r2 uintptr, err uintptr) {
	WinCall c;

	USED(a2);
	USED(a3);
	USED(a4);
	USED(a5);
	USED(a6);
	USED(a7);
	USED(a8);
	USED(a9);
	USED(a10);
	USED(a11);
	USED(a12);
	c.fn = (void*)fn;
	c.n = nargs;
	c.args = &a1;
	runtime·cgocall(runtime·asmstdcall, &c);
	err = c.err;
	r1 = c.r1;
	r2 = c.r2;
}
