mirror of
https://github.com/golang/go
synced 2024-10-05 00:21:21 -06:00
164 lines
3.4 KiB
Go
164 lines
3.4 KiB
Go
|
// 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 }
|