blob: b653a5a20e9e743982f584ef892fc1e546b0ce52 [file] [log] [blame]
// 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.
// Windows system calls.
package syscall
import "unsafe"
const OS = "mingw"
/*
small demo to detect version of windows you are running:
package main
import (
"syscall"
)
func print_version(v uint32) {
major := byte(v)
minor := uint8(v >> 8)
build := uint16(v >> 16)
print("windows version ", major, ".", minor, " (Build ", build, ")\n")
}
func main() {
h, err := syscall.LoadLibrary("kernel32.dll")
if err != 0 {
panic("failed to LoadLibrary #", err, "\n")
}
defer syscall.FreeLibrary(h)
proc, err := syscall.GetProcAddress(h, "GetVersion")
if err != 0 {
panic("could not GetProcAddress #", err, "\n")
}
r, _, e := syscall.Syscall(uintptr(proc), 0, 0, 0)
err = int(e)
if err != 0 {
panic("GetVersion failed #", err, "\n")
}
print_version(uint32(r))
}
*/
//sys GetLastError() (lasterrno int)
// TODO(brainman): probably should use LoadLibraryW here instead
//sys LoadLibraryA(libname string) (handle Module, errno int)
func LoadLibrary(libname string) (handle Module, errno int) {
h, e := LoadLibraryA(libname)
if int(h) != 0 {
return h, 0
}
return h, e
}
// TODO(brainman): should handle errors like in LoadLibrary, otherwise will be returning 'old' errors
//sys FreeLibrary(handle Module) (ok Bool, errno int)
//sys GetProcAddress(module Module, procname string) (proc uint32, errno int)
//sys GetVersion() (ver uint32, errno int)
// dll helpers
// implemented in ../pkg/runtime/mingw/syscall.cgo
func loadlibraryex(filename uintptr) (handle uint32)
func getprocaddress(handle uint32, procname uintptr) (proc uintptr)
func loadDll(fname string) Module {
m := loadlibraryex(uintptr(unsafe.Pointer(StringBytePtr(fname))))
if m == 0 {
panic("syscall: could not LoadLibraryEx ", fname)
}
return Module(m)
}
func getSysProcAddr(m Module, pname string) uintptr {
p := getprocaddress(uint32(m), uintptr(unsafe.Pointer(StringBytePtr(pname))))
if p == 0 {
panic("syscall: could not GetProcAddress for ", pname)
}
return p
}
// TODO(brainman): fix all this meaningless code, it is here to compile exec.go
func Pipe(p []int) (errno int) { return EMINGW }
//sys Close(fd int) (errno int)
//sys read(fd int, buf *byte, nbuf int) (n int, errno int)
func fcntl(fd, cmd, arg int) (val int, errno int) {
return 0, EMINGW
}
const (
F_SETFD = 1 + iota
FD_CLOEXEC
F_GETFL
F_SETFL
O_NONBLOCK
SYS_FORK
SYS_PTRACE
SYS_CHDIR
SYS_DUP2
SYS_FCNTL
SYS_EXECVE
PTRACE_TRACEME
SYS_CLOSE
SYS_WRITE
SYS_EXIT
SYS_READ
EPIPE
EINTR
)
type Rusage struct {
Utime Timeval
Stime Timeval
Maxrss int32
Ixrss int32
Idrss int32
Isrss int32
Minflt int32
Majflt int32
Nswap int32
Inblock int32
Oublock int32
Msgsnd int32
Msgrcv int32
Nsignals int32
Nvcsw int32
Nivcsw int32
}
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
return 0, EMINGW
}
type WaitStatus uint32
func (WaitStatus) Exited() bool { return false }
func (WaitStatus) ExitStatus() int { return -1 }
func (WaitStatus) Signal() int { return -1 }
func (WaitStatus) CoreDump() bool { return false }
func (WaitStatus) Stopped() bool { return false }
func (WaitStatus) Continued() bool { return false }
func (WaitStatus) StopSignal() int { return -1 }
func (WaitStatus) Signaled() bool { return false }
func (WaitStatus) TrapCause() int { return -1 }