Vendor golang.org/x/sys/windows
authorBrian Brazil <brian.brazil@robustperception.io>
Mon, 3 Jul 2017 13:54:41 +0000 (14:54 +0100)
committerBrian Brazil <brian.brazil@robustperception.io>
Mon, 3 Jul 2017 13:54:41 +0000 (14:54 +0100)
27 files changed:
vendor/golang.org/x/sys/windows/asm_windows_386.s [new file with mode: 0644]
vendor/golang.org/x/sys/windows/asm_windows_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/windows/dll_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/env_unset.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/env_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/eventlog.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/exec_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/mksyscall.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/race.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/race0.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/registry/key.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/registry/mksyscall.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/registry/syscall.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/registry/value.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/security_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/service.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/str.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/svc/eventlog/install.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/svc/eventlog/log.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/syscall.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/syscall_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/zsyscall_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/ztypes_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/ztypes_windows_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/ztypes_windows_amd64.go [new file with mode: 0644]
vendor/vendor.json

diff --git a/vendor/golang.org/x/sys/windows/asm_windows_386.s b/vendor/golang.org/x/sys/windows/asm_windows_386.s
new file mode 100644 (file)
index 0000000..1c20dd2
--- /dev/null
@@ -0,0 +1,13 @@
+// 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.
+
+//
+// System calls for 386, Windows are implemented in runtime/syscall_windows.goc
+//
+
+TEXT ·getprocaddress(SB), 7, $0-8
+       JMP     syscall·getprocaddress(SB)
+
+TEXT ·loadlibrary(SB), 7, $0-4
+       JMP     syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s
new file mode 100644 (file)
index 0000000..4d025ab
--- /dev/null
@@ -0,0 +1,13 @@
+// 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.
+
+//
+// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc
+//
+
+TEXT ·getprocaddress(SB), 7, $0-32
+       JMP     syscall·getprocaddress(SB)
+
+TEXT ·loadlibrary(SB), 7, $0-8
+       JMP     syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/golang.org/x/sys/windows/dll_windows.go
new file mode 100644 (file)
index 0000000..0f62046
--- /dev/null
@@ -0,0 +1,378 @@
+// Copyright 2011 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 windows
+
+import (
+       "sync"
+       "sync/atomic"
+       "syscall"
+       "unsafe"
+)
+
+// DLLError describes reasons for DLL load failures.
+type DLLError struct {
+       Err     error
+       ObjName string
+       Msg     string
+}
+
+func (e *DLLError) Error() string { return e.Msg }
+
+// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file.
+func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno)
+func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno)
+
+// A DLL implements access to a single DLL.
+type DLL struct {
+       Name   string
+       Handle Handle
+}
+
+// LoadDLL loads DLL file into memory.
+//
+// Warning: using LoadDLL without an absolute path name is subject to
+// DLL preloading attacks. To safely load a system DLL, use LazyDLL
+// with System set to true, or use LoadLibraryEx directly.
+func LoadDLL(name string) (dll *DLL, err error) {
+       namep, err := UTF16PtrFromString(name)
+       if err != nil {
+               return nil, err
+       }
+       h, e := loadlibrary(namep)
+       if e != 0 {
+               return nil, &DLLError{
+                       Err:     e,
+                       ObjName: name,
+                       Msg:     "Failed to load " + name + ": " + e.Error(),
+               }
+       }
+       d := &DLL{
+               Name:   name,
+               Handle: Handle(h),
+       }
+       return d, nil
+}
+
+// MustLoadDLL is like LoadDLL but panics if load operation failes.
+func MustLoadDLL(name string) *DLL {
+       d, e := LoadDLL(name)
+       if e != nil {
+               panic(e)
+       }
+       return d
+}
+
+// FindProc searches DLL d for procedure named name and returns *Proc
+// if found. It returns an error if search fails.
+func (d *DLL) FindProc(name string) (proc *Proc, err error) {
+       namep, err := BytePtrFromString(name)
+       if err != nil {
+               return nil, err
+       }
+       a, e := getprocaddress(uintptr(d.Handle), namep)
+       if e != 0 {
+               return nil, &DLLError{
+                       Err:     e,
+                       ObjName: name,
+                       Msg:     "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(),
+               }
+       }
+       p := &Proc{
+               Dll:  d,
+               Name: name,
+               addr: a,
+       }
+       return p, nil
+}
+
+// MustFindProc is like FindProc but panics if search fails.
+func (d *DLL) MustFindProc(name string) *Proc {
+       p, e := d.FindProc(name)
+       if e != nil {
+               panic(e)
+       }
+       return p
+}
+
+// Release unloads DLL d from memory.
+func (d *DLL) Release() (err error) {
+       return FreeLibrary(d.Handle)
+}
+
+// A Proc implements access to a procedure inside a DLL.
+type Proc struct {
+       Dll  *DLL
+       Name string
+       addr uintptr
+}
+
+// Addr returns the address of the procedure represented by p.
+// The return value can be passed to Syscall to run the procedure.
+func (p *Proc) Addr() uintptr {
+       return p.addr
+}
+
+//go:uintptrescapes
+
+// Call executes procedure p with arguments a. It will panic, if more then 15 arguments
+// are supplied.
+//
+// The returned error is always non-nil, constructed from the result of GetLastError.
+// Callers must inspect the primary return value to decide whether an error occurred
+// (according to the semantics of the specific function being called) before consulting
+// the error. The error will be guaranteed to contain windows.Errno.
+func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
+       switch len(a) {
+       case 0:
+               return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0)
+       case 1:
+               return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0)
+       case 2:
+               return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0)
+       case 3:
+               return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2])
+       case 4:
+               return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0)
+       case 5:
+               return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0)
+       case 6:
+               return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5])
+       case 7:
+               return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0)
+       case 8:
+               return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0)
+       case 9:
+               return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8])
+       case 10:
+               return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0)
+       case 11:
+               return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0)
+       case 12:
+               return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11])
+       case 13:
+               return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0)
+       case 14:
+               return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0)
+       case 15:
+               return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14])
+       default:
+               panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".")
+       }
+       return
+}
+
+// A LazyDLL implements access to a single DLL.
+// It will delay the load of the DLL until the first
+// call to its Handle method or to one of its
+// LazyProc's Addr method.
+type LazyDLL struct {
+       Name string
+
+       // System determines whether the DLL must be loaded from the
+       // Windows System directory, bypassing the normal DLL search
+       // path.
+       System bool
+
+       mu  sync.Mutex
+       dll *DLL // non nil once DLL is loaded
+}
+
+// Load loads DLL file d.Name into memory. It returns an error if fails.
+// Load will not try to load DLL, if it is already loaded into memory.
+func (d *LazyDLL) Load() error {
+       // Non-racy version of:
+       // if d.dll != nil {
+       if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil {
+               return nil
+       }
+       d.mu.Lock()
+       defer d.mu.Unlock()
+       if d.dll != nil {
+               return nil
+       }
+
+       // kernel32.dll is special, since it's where LoadLibraryEx comes from.
+       // The kernel already special-cases its name, so it's always
+       // loaded from system32.
+       var dll *DLL
+       var err error
+       if d.Name == "kernel32.dll" {
+               dll, err = LoadDLL(d.Name)
+       } else {
+               dll, err = loadLibraryEx(d.Name, d.System)
+       }
+       if err != nil {
+               return err
+       }
+
+       // Non-racy version of:
+       // d.dll = dll
+       atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll))
+       return nil
+}
+
+// mustLoad is like Load but panics if search fails.
+func (d *LazyDLL) mustLoad() {
+       e := d.Load()
+       if e != nil {
+               panic(e)
+       }
+}
+
+// Handle returns d's module handle.
+func (d *LazyDLL) Handle() uintptr {
+       d.mustLoad()
+       return uintptr(d.dll.Handle)
+}
+
+// NewProc returns a LazyProc for accessing the named procedure in the DLL d.
+func (d *LazyDLL) NewProc(name string) *LazyProc {
+       return &LazyProc{l: d, Name: name}
+}
+
+// NewLazyDLL creates new LazyDLL associated with DLL file.
+func NewLazyDLL(name string) *LazyDLL {
+       return &LazyDLL{Name: name}
+}
+
+// NewLazySystemDLL is like NewLazyDLL, but will only
+// search Windows System directory for the DLL if name is
+// a base name (like "advapi32.dll").
+func NewLazySystemDLL(name string) *LazyDLL {
+       return &LazyDLL{Name: name, System: true}
+}
+
+// A LazyProc implements access to a procedure inside a LazyDLL.
+// It delays the lookup until the Addr method is called.
+type LazyProc struct {
+       Name string
+
+       mu   sync.Mutex
+       l    *LazyDLL
+       proc *Proc
+}
+
+// Find searches DLL for procedure named p.Name. It returns
+// an error if search fails. Find will not search procedure,
+// if it is already found and loaded into memory.
+func (p *LazyProc) Find() error {
+       // Non-racy version of:
+       // if p.proc == nil {
+       if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil {
+               p.mu.Lock()
+               defer p.mu.Unlock()
+               if p.proc == nil {
+                       e := p.l.Load()
+                       if e != nil {
+                               return e
+                       }
+                       proc, e := p.l.dll.FindProc(p.Name)
+                       if e != nil {
+                               return e
+                       }
+                       // Non-racy version of:
+                       // p.proc = proc
+                       atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc))
+               }
+       }
+       return nil
+}
+
+// mustFind is like Find but panics if search fails.
+func (p *LazyProc) mustFind() {
+       e := p.Find()
+       if e != nil {
+               panic(e)
+       }
+}
+
+// Addr returns the address of the procedure represented by p.
+// The return value can be passed to Syscall to run the procedure.
+func (p *LazyProc) Addr() uintptr {
+       p.mustFind()
+       return p.proc.Addr()
+}
+
+//go:uintptrescapes
+
+// Call executes procedure p with arguments a. It will panic, if more then 15 arguments
+// are supplied.
+//
+// The returned error is always non-nil, constructed from the result of GetLastError.
+// Callers must inspect the primary return value to decide whether an error occurred
+// (according to the semantics of the specific function being called) before consulting
+// the error. The error will be guaranteed to contain windows.Errno.
+func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
+       p.mustFind()
+       return p.proc.Call(a...)
+}
+
+var canDoSearchSystem32Once struct {
+       sync.Once
+       v bool
+}
+
+func initCanDoSearchSystem32() {
+       // https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says:
+       // "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows
+       // Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on
+       // systems that have KB2533623 installed. To determine whether the
+       // flags are available, use GetProcAddress to get the address of the
+       // AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories
+       // function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_*
+       // flags can be used with LoadLibraryEx."
+       canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil)
+}
+
+func canDoSearchSystem32() bool {
+       canDoSearchSystem32Once.Do(initCanDoSearchSystem32)
+       return canDoSearchSystem32Once.v
+}
+
+func isBaseName(name string) bool {
+       for _, c := range name {
+               if c == ':' || c == '/' || c == '\\' {
+                       return false
+               }
+       }
+       return true
+}
+
+// loadLibraryEx wraps the Windows LoadLibraryEx function.
+//
+// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
+//
+// If name is not an absolute path, LoadLibraryEx searches for the DLL
+// in a variety of automatic locations unless constrained by flags.
+// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx
+func loadLibraryEx(name string, system bool) (*DLL, error) {
+       loadDLL := name
+       var flags uintptr
+       if system {
+               if canDoSearchSystem32() {
+                       const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800
+                       flags = LOAD_LIBRARY_SEARCH_SYSTEM32
+               } else if isBaseName(name) {
+                       // WindowsXP or unpatched Windows machine
+                       // trying to load "foo.dll" out of the system
+                       // folder, but LoadLibraryEx doesn't support
+                       // that yet on their system, so emulate it.
+                       windir, _ := Getenv("WINDIR") // old var; apparently works on XP
+                       if windir == "" {
+                               return nil, errString("%WINDIR% not defined")
+                       }
+                       loadDLL = windir + "\\System32\\" + name
+               }
+       }
+       h, err := LoadLibraryEx(loadDLL, 0, flags)
+       if err != nil {
+               return nil, err
+       }
+       return &DLL{Name: name, Handle: h}, nil
+}
+
+type errString string
+
+func (s errString) Error() string { return string(s) }
diff --git a/vendor/golang.org/x/sys/windows/env_unset.go b/vendor/golang.org/x/sys/windows/env_unset.go
new file mode 100644 (file)
index 0000000..4ed03ae
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2014 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.
+
+// +build windows
+// +build go1.4
+
+package windows
+
+import "syscall"
+
+func Unsetenv(key string) error {
+       // This was added in Go 1.4.
+       return syscall.Unsetenv(key)
+}
diff --git a/vendor/golang.org/x/sys/windows/env_windows.go b/vendor/golang.org/x/sys/windows/env_windows.go
new file mode 100644 (file)
index 0000000..a9d8ef4
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2010 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 environment variables.
+
+package windows
+
+import "syscall"
+
+func Getenv(key string) (value string, found bool) {
+       return syscall.Getenv(key)
+}
+
+func Setenv(key, value string) error {
+       return syscall.Setenv(key, value)
+}
+
+func Clearenv() {
+       syscall.Clearenv()
+}
+
+func Environ() []string {
+       return syscall.Environ()
+}
diff --git a/vendor/golang.org/x/sys/windows/eventlog.go b/vendor/golang.org/x/sys/windows/eventlog.go
new file mode 100644 (file)
index 0000000..40af946
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2012 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.
+
+// +build windows
+
+package windows
+
+const (
+       EVENTLOG_SUCCESS          = 0
+       EVENTLOG_ERROR_TYPE       = 1
+       EVENTLOG_WARNING_TYPE     = 2
+       EVENTLOG_INFORMATION_TYPE = 4
+       EVENTLOG_AUDIT_SUCCESS    = 8
+       EVENTLOG_AUDIT_FAILURE    = 16
+)
+
+//sys  RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW
+//sys  DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource
+//sys  ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW
diff --git a/vendor/golang.org/x/sys/windows/exec_windows.go b/vendor/golang.org/x/sys/windows/exec_windows.go
new file mode 100644 (file)
index 0000000..3606c3a
--- /dev/null
@@ -0,0 +1,97 @@
+// 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.
+
+// Fork, exec, wait, etc.
+
+package windows
+
+// EscapeArg rewrites command line argument s as prescribed
+// in http://msdn.microsoft.com/en-us/library/ms880421.
+// This function returns "" (2 double quotes) if s is empty.
+// Alternatively, these transformations are done:
+// - every back slash (\) is doubled, but only if immediately
+//   followed by double quote (");
+// - every double quote (") is escaped by back slash (\);
+// - finally, s is wrapped with double quotes (arg -> "arg"),
+//   but only if there is space or tab inside s.
+func EscapeArg(s string) string {
+       if len(s) == 0 {
+               return "\"\""
+       }
+       n := len(s)
+       hasSpace := false
+       for i := 0; i < len(s); i++ {
+               switch s[i] {
+               case '"', '\\':
+                       n++
+               case ' ', '\t':
+                       hasSpace = true
+               }
+       }
+       if hasSpace {
+               n += 2
+       }
+       if n == len(s) {
+               return s
+       }
+
+       qs := make([]byte, n)
+       j := 0
+       if hasSpace {
+               qs[j] = '"'
+               j++
+       }
+       slashes := 0
+       for i := 0; i < len(s); i++ {
+               switch s[i] {
+               default:
+                       slashes = 0
+                       qs[j] = s[i]
+               case '\\':
+                       slashes++
+                       qs[j] = s[i]
+               case '"':
+                       for ; slashes > 0; slashes-- {
+                               qs[j] = '\\'
+                               j++
+                       }
+                       qs[j] = '\\'
+                       j++
+                       qs[j] = s[i]
+               }
+               j++
+       }
+       if hasSpace {
+               for ; slashes > 0; slashes-- {
+                       qs[j] = '\\'
+                       j++
+               }
+               qs[j] = '"'
+               j++
+       }
+       return string(qs[:j])
+}
+
+func CloseOnExec(fd Handle) {
+       SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)
+}
+
+// FullPath retrieves the full path of the specified file.
+func FullPath(name string) (path string, err error) {
+       p, err := UTF16PtrFromString(name)
+       if err != nil {
+               return "", err
+       }
+       n := uint32(100)
+       for {
+               buf := make([]uint16, n)
+               n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
+               if err != nil {
+                       return "", err
+               }
+               if n <= uint32(len(buf)) {
+                       return UTF16ToString(buf[:n]), nil
+               }
+       }
+}
diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go
new file mode 100644 (file)
index 0000000..e1c88c9
--- /dev/null
@@ -0,0 +1,7 @@
+// 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 windows
+
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
diff --git a/vendor/golang.org/x/sys/windows/race.go b/vendor/golang.org/x/sys/windows/race.go
new file mode 100644 (file)
index 0000000..343e18a
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright 2012 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.
+
+// +build windows,race
+
+package windows
+
+import (
+       "runtime"
+       "unsafe"
+)
+
+const raceenabled = true
+
+func raceAcquire(addr unsafe.Pointer) {
+       runtime.RaceAcquire(addr)
+}
+
+func raceReleaseMerge(addr unsafe.Pointer) {
+       runtime.RaceReleaseMerge(addr)
+}
+
+func raceReadRange(addr unsafe.Pointer, len int) {
+       runtime.RaceReadRange(addr, len)
+}
+
+func raceWriteRange(addr unsafe.Pointer, len int) {
+       runtime.RaceWriteRange(addr, len)
+}
diff --git a/vendor/golang.org/x/sys/windows/race0.go b/vendor/golang.org/x/sys/windows/race0.go
new file mode 100644 (file)
index 0000000..17af843
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2012 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.
+
+// +build windows,!race
+
+package windows
+
+import (
+       "unsafe"
+)
+
+const raceenabled = false
+
+func raceAcquire(addr unsafe.Pointer) {
+}
+
+func raceReleaseMerge(addr unsafe.Pointer) {
+}
+
+func raceReadRange(addr unsafe.Pointer, len int) {
+}
+
+func raceWriteRange(addr unsafe.Pointer, len int) {
+}
diff --git a/vendor/golang.org/x/sys/windows/registry/key.go b/vendor/golang.org/x/sys/windows/registry/key.go
new file mode 100644 (file)
index 0000000..f087ce5
--- /dev/null
@@ -0,0 +1,178 @@
+// Copyright 2015 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.
+
+// +build windows
+
+// Package registry provides access to the Windows registry.
+//
+// Here is a simple example, opening a registry key and reading a string value from it.
+//
+//     k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//     defer k.Close()
+//
+//     s, _, err := k.GetStringValue("SystemRoot")
+//     if err != nil {
+//             log.Fatal(err)
+//     }
+//     fmt.Printf("Windows system root is %q\n", s)
+//
+package registry
+
+import (
+       "io"
+       "syscall"
+       "time"
+)
+
+const (
+       // Registry key security and access rights.
+       // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx
+       // for details.
+       ALL_ACCESS         = 0xf003f
+       CREATE_LINK        = 0x00020
+       CREATE_SUB_KEY     = 0x00004
+       ENUMERATE_SUB_KEYS = 0x00008
+       EXECUTE            = 0x20019
+       NOTIFY             = 0x00010
+       QUERY_VALUE        = 0x00001
+       READ               = 0x20019
+       SET_VALUE          = 0x00002
+       WOW64_32KEY        = 0x00200
+       WOW64_64KEY        = 0x00100
+       WRITE              = 0x20006
+)
+
+// Key is a handle to an open Windows registry key.
+// Keys can be obtained by calling OpenKey; there are
+// also some predefined root keys such as CURRENT_USER.
+// Keys can be used directly in the Windows API.
+type Key syscall.Handle
+
+const (
+       // Windows defines some predefined root keys that are always open.
+       // An application can use these keys as entry points to the registry.
+       // Normally these keys are used in OpenKey to open new keys,
+       // but they can also be used anywhere a Key is required.
+       CLASSES_ROOT   = Key(syscall.HKEY_CLASSES_ROOT)
+       CURRENT_USER   = Key(syscall.HKEY_CURRENT_USER)
+       LOCAL_MACHINE  = Key(syscall.HKEY_LOCAL_MACHINE)
+       USERS          = Key(syscall.HKEY_USERS)
+       CURRENT_CONFIG = Key(syscall.HKEY_CURRENT_CONFIG)
+)
+
+// Close closes open key k.
+func (k Key) Close() error {
+       return syscall.RegCloseKey(syscall.Handle(k))
+}
+
+// OpenKey opens a new key with path name relative to key k.
+// It accepts any open key, including CURRENT_USER and others,
+// and returns the new key and an error.
+// The access parameter specifies desired access rights to the
+// key to be opened.
+func OpenKey(k Key, path string, access uint32) (Key, error) {
+       p, err := syscall.UTF16PtrFromString(path)
+       if err != nil {
+               return 0, err
+       }
+       var subkey syscall.Handle
+       err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey)
+       if err != nil {
+               return 0, err
+       }
+       return Key(subkey), nil
+}
+
+// ReadSubKeyNames returns the names of subkeys of key k.
+// The parameter n controls the number of returned names,
+// analogous to the way os.File.Readdirnames works.
+func (k Key) ReadSubKeyNames(n int) ([]string, error) {
+       ki, err := k.Stat()
+       if err != nil {
+               return nil, err
+       }
+       names := make([]string, 0, ki.SubKeyCount)
+       buf := make([]uint16, ki.MaxSubKeyLen+1) // extra room for terminating zero byte
+loopItems:
+       for i := uint32(0); ; i++ {
+               if n > 0 {
+                       if len(names) == n {
+                               return names, nil
+                       }
+               }
+               l := uint32(len(buf))
+               for {
+                       err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil)
+                       if err == nil {
+                               break
+                       }
+                       if err == syscall.ERROR_MORE_DATA {
+                               // Double buffer size and try again.
+                               l = uint32(2 * len(buf))
+                               buf = make([]uint16, l)
+                               continue
+                       }
+                       if err == _ERROR_NO_MORE_ITEMS {
+                               break loopItems
+                       }
+                       return names, err
+               }
+               names = append(names, syscall.UTF16ToString(buf[:l]))
+       }
+       if n > len(names) {
+               return names, io.EOF
+       }
+       return names, nil
+}
+
+// CreateKey creates a key named path under open key k.
+// CreateKey returns the new key and a boolean flag that reports
+// whether the key already existed.
+// The access parameter specifies the access rights for the key
+// to be created.
+func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) {
+       var h syscall.Handle
+       var d uint32
+       err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path),
+               0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d)
+       if err != nil {
+               return 0, false, err
+       }
+       return Key(h), d == _REG_OPENED_EXISTING_KEY, nil
+}
+
+// DeleteKey deletes the subkey path of key k and its values.
+func DeleteKey(k Key, path string) error {
+       return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path))
+}
+
+// A KeyInfo describes the statistics of a key. It is returned by Stat.
+type KeyInfo struct {
+       SubKeyCount     uint32
+       MaxSubKeyLen    uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte
+       ValueCount      uint32
+       MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte
+       MaxValueLen     uint32 // longest data component among the key's values, in bytes
+       lastWriteTime   syscall.Filetime
+}
+
+// ModTime returns the key's last write time.
+func (ki *KeyInfo) ModTime() time.Time {
+       return time.Unix(0, ki.lastWriteTime.Nanoseconds())
+}
+
+// Stat retrieves information about the open key k.
+func (k Key) Stat() (*KeyInfo, error) {
+       var ki KeyInfo
+       err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil,
+               &ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount,
+               &ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime)
+       if err != nil {
+               return nil, err
+       }
+       return &ki, nil
+}
diff --git a/vendor/golang.org/x/sys/windows/registry/mksyscall.go b/vendor/golang.org/x/sys/windows/registry/mksyscall.go
new file mode 100644 (file)
index 0000000..0ac95ff
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2015 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 registry
+
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go
diff --git a/vendor/golang.org/x/sys/windows/registry/syscall.go b/vendor/golang.org/x/sys/windows/registry/syscall.go
new file mode 100644 (file)
index 0000000..a6525da
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2015 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.
+
+// +build windows
+
+package registry
+
+import "syscall"
+
+const (
+       _REG_OPTION_NON_VOLATILE = 0
+
+       _REG_CREATED_NEW_KEY     = 1
+       _REG_OPENED_EXISTING_KEY = 2
+
+       _ERROR_NO_MORE_ITEMS syscall.Errno = 259
+)
+
+func LoadRegLoadMUIString() error {
+       return procRegLoadMUIStringW.Find()
+}
+
+//sys  regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW
+//sys  regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW
+//sys  regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW
+//sys  regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW
+//sys  regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW
+//sys   regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW
+
+//sys  expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW
diff --git a/vendor/golang.org/x/sys/windows/registry/value.go b/vendor/golang.org/x/sys/windows/registry/value.go
new file mode 100644 (file)
index 0000000..71d4e15
--- /dev/null
@@ -0,0 +1,384 @@
+// Copyright 2015 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.
+
+// +build windows
+
+package registry
+
+import (
+       "errors"
+       "io"
+       "syscall"
+       "unicode/utf16"
+       "unsafe"
+)
+
+const (
+       // Registry value types.
+       NONE                       = 0
+       SZ                         = 1
+       EXPAND_SZ                  = 2
+       BINARY                     = 3
+       DWORD                      = 4
+       DWORD_BIG_ENDIAN           = 5
+       LINK                       = 6
+       MULTI_SZ                   = 7
+       RESOURCE_LIST              = 8
+       FULL_RESOURCE_DESCRIPTOR   = 9
+       RESOURCE_REQUIREMENTS_LIST = 10
+       QWORD                      = 11
+)
+
+var (
+       // ErrShortBuffer is returned when the buffer was too short for the operation.
+       ErrShortBuffer = syscall.ERROR_MORE_DATA
+
+       // ErrNotExist is returned when a registry key or value does not exist.
+       ErrNotExist = syscall.ERROR_FILE_NOT_FOUND
+
+       // ErrUnexpectedType is returned by Get*Value when the value's type was unexpected.
+       ErrUnexpectedType = errors.New("unexpected key value type")
+)
+
+// GetValue retrieves the type and data for the specified value associated
+// with an open key k. It fills up buffer buf and returns the retrieved
+// byte count n. If buf is too small to fit the stored value it returns
+// ErrShortBuffer error along with the required buffer size n.
+// If no buffer is provided, it returns true and actual buffer size n.
+// If no buffer is provided, GetValue returns the value's type only.
+// If the value does not exist, the error returned is ErrNotExist.
+//
+// GetValue is a low level function. If value's type is known, use the appropriate
+// Get*Value function instead.
+func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) {
+       pname, err := syscall.UTF16PtrFromString(name)
+       if err != nil {
+               return 0, 0, err
+       }
+       var pbuf *byte
+       if len(buf) > 0 {
+               pbuf = (*byte)(unsafe.Pointer(&buf[0]))
+       }
+       l := uint32(len(buf))
+       err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l)
+       if err != nil {
+               return int(l), valtype, err
+       }
+       return int(l), valtype, nil
+}
+
+func (k Key) getValue(name string, buf []byte) (date []byte, valtype uint32, err error) {
+       p, err := syscall.UTF16PtrFromString(name)
+       if err != nil {
+               return nil, 0, err
+       }
+       var t uint32
+       n := uint32(len(buf))
+       for {
+               err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n)
+               if err == nil {
+                       return buf[:n], t, nil
+               }
+               if err != syscall.ERROR_MORE_DATA {
+                       return nil, 0, err
+               }
+               if n <= uint32(len(buf)) {
+                       return nil, 0, err
+               }
+               buf = make([]byte, n)
+       }
+}
+
+// GetStringValue retrieves the string value for the specified
+// value name associated with an open key k. It also returns the value's type.
+// If value does not exist, GetStringValue returns ErrNotExist.
+// If value is not SZ or EXPAND_SZ, it will return the correct value
+// type and ErrUnexpectedType.
+func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) {
+       data, typ, err2 := k.getValue(name, make([]byte, 64))
+       if err2 != nil {
+               return "", typ, err2
+       }
+       switch typ {
+       case SZ, EXPAND_SZ:
+       default:
+               return "", typ, ErrUnexpectedType
+       }
+       if len(data) == 0 {
+               return "", typ, nil
+       }
+       u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:]
+       return syscall.UTF16ToString(u), typ, nil
+}
+
+// GetMUIStringValue retrieves the localized string value for
+// the specified value name associated with an open key k.
+// If the value name doesn't exist or the localized string value
+// can't be resolved, GetMUIStringValue returns ErrNotExist.
+// GetMUIStringValue panics if the system doesn't support
+// regLoadMUIString; use LoadRegLoadMUIString to check if
+// regLoadMUIString is supported before calling this function.
+func (k Key) GetMUIStringValue(name string) (string, error) {
+       pname, err := syscall.UTF16PtrFromString(name)
+       if err != nil {
+               return "", err
+       }
+
+       buf := make([]uint16, 1024)
+       var buflen uint32
+       var pdir *uint16
+
+       err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir)
+       if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path
+
+               // Try to resolve the string value using the system directory as
+               // a DLL search path; this assumes the string value is of the form
+               // @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320.
+
+               // This approach works with tzres.dll but may have to be revised
+               // in the future to allow callers to provide custom search paths.
+
+               var s string
+               s, err = ExpandString("%SystemRoot%\\system32\\")
+               if err != nil {
+                       return "", err
+               }
+               pdir, err = syscall.UTF16PtrFromString(s)
+               if err != nil {
+                       return "", err
+               }
+
+               err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir)
+       }
+
+       for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed
+               if buflen <= uint32(len(buf)) {
+                       break // Buffer not growing, assume race; break
+               }
+               buf = make([]uint16, buflen)
+               err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir)
+       }
+
+       if err != nil {
+               return "", err
+       }
+
+       return syscall.UTF16ToString(buf), nil
+}
+
+// ExpandString expands environment-variable strings and replaces
+// them with the values defined for the current user.
+// Use ExpandString to expand EXPAND_SZ strings.
+func ExpandString(value string) (string, error) {
+       if value == "" {
+               return "", nil
+       }
+       p, err := syscall.UTF16PtrFromString(value)
+       if err != nil {
+               return "", err
+       }
+       r := make([]uint16, 100)
+       for {
+               n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r)))
+               if err != nil {
+                       return "", err
+               }
+               if n <= uint32(len(r)) {
+                       u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:]
+                       return syscall.UTF16ToString(u), nil
+               }
+               r = make([]uint16, n)
+       }
+}
+
+// GetStringsValue retrieves the []string value for the specified
+// value name associated with an open key k. It also returns the value's type.
+// If value does not exist, GetStringsValue returns ErrNotExist.
+// If value is not MULTI_SZ, it will return the correct value
+// type and ErrUnexpectedType.
+func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) {
+       data, typ, err2 := k.getValue(name, make([]byte, 64))
+       if err2 != nil {
+               return nil, typ, err2
+       }
+       if typ != MULTI_SZ {
+               return nil, typ, ErrUnexpectedType
+       }
+       if len(data) == 0 {
+               return nil, typ, nil
+       }
+       p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2]
+       if len(p) == 0 {
+               return nil, typ, nil
+       }
+       if p[len(p)-1] == 0 {
+               p = p[:len(p)-1] // remove terminating null
+       }
+       val = make([]string, 0, 5)
+       from := 0
+       for i, c := range p {
+               if c == 0 {
+                       val = append(val, string(utf16.Decode(p[from:i])))
+                       from = i + 1
+               }
+       }
+       return val, typ, nil
+}
+
+// GetIntegerValue retrieves the integer value for the specified
+// value name associated with an open key k. It also returns the value's type.
+// If value does not exist, GetIntegerValue returns ErrNotExist.
+// If value is not DWORD or QWORD, it will return the correct value
+// type and ErrUnexpectedType.
+func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) {
+       data, typ, err2 := k.getValue(name, make([]byte, 8))
+       if err2 != nil {
+               return 0, typ, err2
+       }
+       switch typ {
+       case DWORD:
+               if len(data) != 4 {
+                       return 0, typ, errors.New("DWORD value is not 4 bytes long")
+               }
+               return uint64(*(*uint32)(unsafe.Pointer(&data[0]))), DWORD, nil
+       case QWORD:
+               if len(data) != 8 {
+                       return 0, typ, errors.New("QWORD value is not 8 bytes long")
+               }
+               return uint64(*(*uint64)(unsafe.Pointer(&data[0]))), QWORD, nil
+       default:
+               return 0, typ, ErrUnexpectedType
+       }
+}
+
+// GetBinaryValue retrieves the binary value for the specified
+// value name associated with an open key k. It also returns the value's type.
+// If value does not exist, GetBinaryValue returns ErrNotExist.
+// If value is not BINARY, it will return the correct value
+// type and ErrUnexpectedType.
+func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) {
+       data, typ, err2 := k.getValue(name, make([]byte, 64))
+       if err2 != nil {
+               return nil, typ, err2
+       }
+       if typ != BINARY {
+               return nil, typ, ErrUnexpectedType
+       }
+       return data, typ, nil
+}
+
+func (k Key) setValue(name string, valtype uint32, data []byte) error {
+       p, err := syscall.UTF16PtrFromString(name)
+       if err != nil {
+               return err
+       }
+       if len(data) == 0 {
+               return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0)
+       }
+       return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data)))
+}
+
+// SetDWordValue sets the data and type of a name value
+// under key k to value and DWORD.
+func (k Key) SetDWordValue(name string, value uint32) error {
+       return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:])
+}
+
+// SetQWordValue sets the data and type of a name value
+// under key k to value and QWORD.
+func (k Key) SetQWordValue(name string, value uint64) error {
+       return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:])
+}
+
+func (k Key) setStringValue(name string, valtype uint32, value string) error {
+       v, err := syscall.UTF16FromString(value)
+       if err != nil {
+               return err
+       }
+       buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2]
+       return k.setValue(name, valtype, buf)
+}
+
+// SetStringValue sets the data and type of a name value
+// under key k to value and SZ. The value must not contain a zero byte.
+func (k Key) SetStringValue(name, value string) error {
+       return k.setStringValue(name, SZ, value)
+}
+
+// SetExpandStringValue sets the data and type of a name value
+// under key k to value and EXPAND_SZ. The value must not contain a zero byte.
+func (k Key) SetExpandStringValue(name, value string) error {
+       return k.setStringValue(name, EXPAND_SZ, value)
+}
+
+// SetStringsValue sets the data and type of a name value
+// under key k to value and MULTI_SZ. The value strings
+// must not contain a zero byte.
+func (k Key) SetStringsValue(name string, value []string) error {
+       ss := ""
+       for _, s := range value {
+               for i := 0; i < len(s); i++ {
+                       if s[i] == 0 {
+                               return errors.New("string cannot have 0 inside")
+                       }
+               }
+               ss += s + "\x00"
+       }
+       v := utf16.Encode([]rune(ss + "\x00"))
+       buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2]
+       return k.setValue(name, MULTI_SZ, buf)
+}
+
+// SetBinaryValue sets the data and type of a name value
+// under key k to value and BINARY.
+func (k Key) SetBinaryValue(name string, value []byte) error {
+       return k.setValue(name, BINARY, value)
+}
+
+// DeleteValue removes a named value from the key k.
+func (k Key) DeleteValue(name string) error {
+       return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name))
+}
+
+// ReadValueNames returns the value names of key k.
+// The parameter n controls the number of returned names,
+// analogous to the way os.File.Readdirnames works.
+func (k Key) ReadValueNames(n int) ([]string, error) {
+       ki, err := k.Stat()
+       if err != nil {
+               return nil, err
+       }
+       names := make([]string, 0, ki.ValueCount)
+       buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character
+loopItems:
+       for i := uint32(0); ; i++ {
+               if n > 0 {
+                       if len(names) == n {
+                               return names, nil
+                       }
+               }
+               l := uint32(len(buf))
+               for {
+                       err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil)
+                       if err == nil {
+                               break
+                       }
+                       if err == syscall.ERROR_MORE_DATA {
+                               // Double buffer size and try again.
+                               l = uint32(2 * len(buf))
+                               buf = make([]uint16, l)
+                               continue
+                       }
+                       if err == _ERROR_NO_MORE_ITEMS {
+                               break loopItems
+                       }
+                       return names, err
+               }
+               names = append(names, syscall.UTF16ToString(buf[:l]))
+       }
+       if n > len(names) {
+               return names, io.EOF
+       }
+       return names, nil
+}
diff --git a/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go
new file mode 100644 (file)
index 0000000..0fa24c6
--- /dev/null
@@ -0,0 +1,85 @@
+// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
+
+package registry
+
+import (
+       "golang.org/x/sys/windows"
+       "syscall"
+       "unsafe"
+)
+
+var _ unsafe.Pointer
+
+var (
+       modadvapi32 = windows.NewLazySystemDLL("advapi32.dll")
+       modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
+
+       procRegCreateKeyExW           = modadvapi32.NewProc("RegCreateKeyExW")
+       procRegDeleteKeyW             = modadvapi32.NewProc("RegDeleteKeyW")
+       procRegSetValueExW            = modadvapi32.NewProc("RegSetValueExW")
+       procRegEnumValueW             = modadvapi32.NewProc("RegEnumValueW")
+       procRegDeleteValueW           = modadvapi32.NewProc("RegDeleteValueW")
+       procRegLoadMUIStringW         = modadvapi32.NewProc("RegLoadMUIStringW")
+       procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW")
+)
+
+func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) {
+       r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition)))
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) {
+       r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0)
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) {
+       r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize))
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) {
+       r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0)
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) {
+       r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0)
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) {
+       r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0)
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size))
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go
new file mode 100644 (file)
index 0000000..ca09bdd
--- /dev/null
@@ -0,0 +1,435 @@
+// Copyright 2012 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 windows
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+const (
+       STANDARD_RIGHTS_REQUIRED = 0xf0000
+       STANDARD_RIGHTS_READ     = 0x20000
+       STANDARD_RIGHTS_WRITE    = 0x20000
+       STANDARD_RIGHTS_EXECUTE  = 0x20000
+       STANDARD_RIGHTS_ALL      = 0x1F0000
+)
+
+const (
+       NameUnknown          = 0
+       NameFullyQualifiedDN = 1
+       NameSamCompatible    = 2
+       NameDisplay          = 3
+       NameUniqueId         = 6
+       NameCanonical        = 7
+       NameUserPrincipal    = 8
+       NameCanonicalEx      = 9
+       NameServicePrincipal = 10
+       NameDnsDomain        = 12
+)
+
+// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
+// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx
+//sys  TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW
+//sys  GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW
+
+// TranslateAccountName converts a directory service
+// object name from one format to another.
+func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) {
+       u, e := UTF16PtrFromString(username)
+       if e != nil {
+               return "", e
+       }
+       n := uint32(50)
+       for {
+               b := make([]uint16, n)
+               e = TranslateName(u, from, to, &b[0], &n)
+               if e == nil {
+                       return UTF16ToString(b[:n]), nil
+               }
+               if e != ERROR_INSUFFICIENT_BUFFER {
+                       return "", e
+               }
+               if n <= uint32(len(b)) {
+                       return "", e
+               }
+       }
+}
+
+const (
+       // do not reorder
+       NetSetupUnknownStatus = iota
+       NetSetupUnjoined
+       NetSetupWorkgroupName
+       NetSetupDomainName
+)
+
+type UserInfo10 struct {
+       Name       *uint16
+       Comment    *uint16
+       UsrComment *uint16
+       FullName   *uint16
+}
+
+//sys  NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo
+//sys  NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation
+//sys  NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree
+
+const (
+       // do not reorder
+       SidTypeUser = 1 + iota
+       SidTypeGroup
+       SidTypeDomain
+       SidTypeAlias
+       SidTypeWellKnownGroup
+       SidTypeDeletedAccount
+       SidTypeInvalid
+       SidTypeUnknown
+       SidTypeComputer
+       SidTypeLabel
+)
+
+type SidIdentifierAuthority struct {
+       Value [6]byte
+}
+
+var (
+       SECURITY_NULL_SID_AUTHORITY        = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}}
+       SECURITY_WORLD_SID_AUTHORITY       = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}}
+       SECURITY_LOCAL_SID_AUTHORITY       = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}}
+       SECURITY_CREATOR_SID_AUTHORITY     = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}}
+       SECURITY_NON_UNIQUE_AUTHORITY      = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}}
+       SECURITY_NT_AUTHORITY              = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}}
+       SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}}
+)
+
+const (
+       SECURITY_NULL_RID                   = 0
+       SECURITY_WORLD_RID                  = 0
+       SECURITY_LOCAL_RID                  = 0
+       SECURITY_CREATOR_OWNER_RID          = 0
+       SECURITY_CREATOR_GROUP_RID          = 1
+       SECURITY_DIALUP_RID                 = 1
+       SECURITY_NETWORK_RID                = 2
+       SECURITY_BATCH_RID                  = 3
+       SECURITY_INTERACTIVE_RID            = 4
+       SECURITY_LOGON_IDS_RID              = 5
+       SECURITY_SERVICE_RID                = 6
+       SECURITY_LOCAL_SYSTEM_RID           = 18
+       SECURITY_BUILTIN_DOMAIN_RID         = 32
+       SECURITY_PRINCIPAL_SELF_RID         = 10
+       SECURITY_CREATOR_OWNER_SERVER_RID   = 0x2
+       SECURITY_CREATOR_GROUP_SERVER_RID   = 0x3
+       SECURITY_LOGON_IDS_RID_COUNT        = 0x3
+       SECURITY_ANONYMOUS_LOGON_RID        = 0x7
+       SECURITY_PROXY_RID                  = 0x8
+       SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9
+       SECURITY_SERVER_LOGON_RID           = SECURITY_ENTERPRISE_CONTROLLERS_RID
+       SECURITY_AUTHENTICATED_USER_RID     = 0xb
+       SECURITY_RESTRICTED_CODE_RID        = 0xc
+       SECURITY_NT_NON_UNIQUE_RID          = 0x15
+)
+
+//sys  LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW
+//sys  LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW
+//sys  ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW
+//sys  ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW
+//sys  GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid
+//sys  CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid
+//sys  AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid
+//sys  FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid
+//sys  EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid
+
+// The security identifier (SID) structure is a variable-length
+// structure used to uniquely identify users or groups.
+type SID struct{}
+
+// StringToSid converts a string-format security identifier
+// sid into a valid, functional sid.
+func StringToSid(s string) (*SID, error) {
+       var sid *SID
+       p, e := UTF16PtrFromString(s)
+       if e != nil {
+               return nil, e
+       }
+       e = ConvertStringSidToSid(p, &sid)
+       if e != nil {
+               return nil, e
+       }
+       defer LocalFree((Handle)(unsafe.Pointer(sid)))
+       return sid.Copy()
+}
+
+// LookupSID retrieves a security identifier sid for the account
+// and the name of the domain on which the account was found.
+// System specify target computer to search.
+func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) {
+       if len(account) == 0 {
+               return nil, "", 0, syscall.EINVAL
+       }
+       acc, e := UTF16PtrFromString(account)
+       if e != nil {
+               return nil, "", 0, e
+       }
+       var sys *uint16
+       if len(system) > 0 {
+               sys, e = UTF16PtrFromString(system)
+               if e != nil {
+                       return nil, "", 0, e
+               }
+       }
+       n := uint32(50)
+       dn := uint32(50)
+       for {
+               b := make([]byte, n)
+               db := make([]uint16, dn)
+               sid = (*SID)(unsafe.Pointer(&b[0]))
+               e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType)
+               if e == nil {
+                       return sid, UTF16ToString(db), accType, nil
+               }
+               if e != ERROR_INSUFFICIENT_BUFFER {
+                       return nil, "", 0, e
+               }
+               if n <= uint32(len(b)) {
+                       return nil, "", 0, e
+               }
+       }
+}
+
+// String converts sid to a string format
+// suitable for display, storage, or transmission.
+func (sid *SID) String() (string, error) {
+       var s *uint16
+       e := ConvertSidToStringSid(sid, &s)
+       if e != nil {
+               return "", e
+       }
+       defer LocalFree((Handle)(unsafe.Pointer(s)))
+       return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil
+}
+
+// Len returns the length, in bytes, of a valid security identifier sid.
+func (sid *SID) Len() int {
+       return int(GetLengthSid(sid))
+}
+
+// Copy creates a duplicate of security identifier sid.
+func (sid *SID) Copy() (*SID, error) {
+       b := make([]byte, sid.Len())
+       sid2 := (*SID)(unsafe.Pointer(&b[0]))
+       e := CopySid(uint32(len(b)), sid2, sid)
+       if e != nil {
+               return nil, e
+       }
+       return sid2, nil
+}
+
+// LookupAccount retrieves the name of the account for this sid
+// and the name of the first domain on which this sid is found.
+// System specify target computer to search for.
+func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) {
+       var sys *uint16
+       if len(system) > 0 {
+               sys, err = UTF16PtrFromString(system)
+               if err != nil {
+                       return "", "", 0, err
+               }
+       }
+       n := uint32(50)
+       dn := uint32(50)
+       for {
+               b := make([]uint16, n)
+               db := make([]uint16, dn)
+               e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType)
+               if e == nil {
+                       return UTF16ToString(b), UTF16ToString(db), accType, nil
+               }
+               if e != ERROR_INSUFFICIENT_BUFFER {
+                       return "", "", 0, e
+               }
+               if n <= uint32(len(b)) {
+                       return "", "", 0, e
+               }
+       }
+}
+
+const (
+       // do not reorder
+       TOKEN_ASSIGN_PRIMARY = 1 << iota
+       TOKEN_DUPLICATE
+       TOKEN_IMPERSONATE
+       TOKEN_QUERY
+       TOKEN_QUERY_SOURCE
+       TOKEN_ADJUST_PRIVILEGES
+       TOKEN_ADJUST_GROUPS
+       TOKEN_ADJUST_DEFAULT
+
+       TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
+               TOKEN_ASSIGN_PRIMARY |
+               TOKEN_DUPLICATE |
+               TOKEN_IMPERSONATE |
+               TOKEN_QUERY |
+               TOKEN_QUERY_SOURCE |
+               TOKEN_ADJUST_PRIVILEGES |
+               TOKEN_ADJUST_GROUPS |
+               TOKEN_ADJUST_DEFAULT
+       TOKEN_READ  = STANDARD_RIGHTS_READ | TOKEN_QUERY
+       TOKEN_WRITE = STANDARD_RIGHTS_WRITE |
+               TOKEN_ADJUST_PRIVILEGES |
+               TOKEN_ADJUST_GROUPS |
+               TOKEN_ADJUST_DEFAULT
+       TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE
+)
+
+const (
+       // do not reorder
+       TokenUser = 1 + iota
+       TokenGroups
+       TokenPrivileges
+       TokenOwner
+       TokenPrimaryGroup
+       TokenDefaultDacl
+       TokenSource
+       TokenType
+       TokenImpersonationLevel
+       TokenStatistics
+       TokenRestrictedSids
+       TokenSessionId
+       TokenGroupsAndPrivileges
+       TokenSessionReference
+       TokenSandBoxInert
+       TokenAuditPolicy
+       TokenOrigin
+       TokenElevationType
+       TokenLinkedToken
+       TokenElevation
+       TokenHasRestrictions
+       TokenAccessInformation
+       TokenVirtualizationAllowed
+       TokenVirtualizationEnabled
+       TokenIntegrityLevel
+       TokenUIAccess
+       TokenMandatoryPolicy
+       TokenLogonSid
+       MaxTokenInfoClass
+)
+
+type SIDAndAttributes struct {
+       Sid        *SID
+       Attributes uint32
+}
+
+type Tokenuser struct {
+       User SIDAndAttributes
+}
+
+type Tokenprimarygroup struct {
+       PrimaryGroup *SID
+}
+
+type Tokengroups struct {
+       GroupCount uint32
+       Groups     [1]SIDAndAttributes
+}
+
+//sys  OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken
+//sys  GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation
+//sys  GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW
+
+// An access token contains the security information for a logon session.
+// The system creates an access token when a user logs on, and every
+// process executed on behalf of the user has a copy of the token.
+// The token identifies the user, the user's groups, and the user's
+// privileges. The system uses the token to control access to securable
+// objects and to control the ability of the user to perform various
+// system-related operations on the local computer.
+type Token Handle
+
+// OpenCurrentProcessToken opens the access token
+// associated with current process.
+func OpenCurrentProcessToken() (Token, error) {
+       p, e := GetCurrentProcess()
+       if e != nil {
+               return 0, e
+       }
+       var t Token
+       e = OpenProcessToken(p, TOKEN_QUERY, &t)
+       if e != nil {
+               return 0, e
+       }
+       return t, nil
+}
+
+// Close releases access to access token.
+func (t Token) Close() error {
+       return CloseHandle(Handle(t))
+}
+
+// getInfo retrieves a specified type of information about an access token.
+func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) {
+       n := uint32(initSize)
+       for {
+               b := make([]byte, n)
+               e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n)
+               if e == nil {
+                       return unsafe.Pointer(&b[0]), nil
+               }
+               if e != ERROR_INSUFFICIENT_BUFFER {
+                       return nil, e
+               }
+               if n <= uint32(len(b)) {
+                       return nil, e
+               }
+       }
+}
+
+// GetTokenUser retrieves access token t user account information.
+func (t Token) GetTokenUser() (*Tokenuser, error) {
+       i, e := t.getInfo(TokenUser, 50)
+       if e != nil {
+               return nil, e
+       }
+       return (*Tokenuser)(i), nil
+}
+
+// GetTokenGroups retrieves group accounts associated with access token t.
+func (t Token) GetTokenGroups() (*Tokengroups, error) {
+       i, e := t.getInfo(TokenGroups, 50)
+       if e != nil {
+               return nil, e
+       }
+       return (*Tokengroups)(i), nil
+}
+
+// GetTokenPrimaryGroup retrieves access token t primary group information.
+// A pointer to a SID structure representing a group that will become
+// the primary group of any objects created by a process using this access token.
+func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) {
+       i, e := t.getInfo(TokenPrimaryGroup, 50)
+       if e != nil {
+               return nil, e
+       }
+       return (*Tokenprimarygroup)(i), nil
+}
+
+// GetUserProfileDirectory retrieves path to the
+// root directory of the access token t user's profile.
+func (t Token) GetUserProfileDirectory() (string, error) {
+       n := uint32(100)
+       for {
+               b := make([]uint16, n)
+               e := GetUserProfileDirectory(t, &b[0], &n)
+               if e == nil {
+                       return UTF16ToString(b), nil
+               }
+               if e != ERROR_INSUFFICIENT_BUFFER {
+                       return "", e
+               }
+               if n <= uint32(len(b)) {
+                       return "", e
+               }
+       }
+}
diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go
new file mode 100644 (file)
index 0000000..1c11d39
--- /dev/null
@@ -0,0 +1,143 @@
+// Copyright 2012 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.
+
+// +build windows
+
+package windows
+
+const (
+       SC_MANAGER_CONNECT            = 1
+       SC_MANAGER_CREATE_SERVICE     = 2
+       SC_MANAGER_ENUMERATE_SERVICE  = 4
+       SC_MANAGER_LOCK               = 8
+       SC_MANAGER_QUERY_LOCK_STATUS  = 16
+       SC_MANAGER_MODIFY_BOOT_CONFIG = 32
+       SC_MANAGER_ALL_ACCESS         = 0xf003f
+)
+
+//sys  OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW
+
+const (
+       SERVICE_KERNEL_DRIVER       = 1
+       SERVICE_FILE_SYSTEM_DRIVER  = 2
+       SERVICE_ADAPTER             = 4
+       SERVICE_RECOGNIZER_DRIVER   = 8
+       SERVICE_WIN32_OWN_PROCESS   = 16
+       SERVICE_WIN32_SHARE_PROCESS = 32
+       SERVICE_WIN32               = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS
+       SERVICE_INTERACTIVE_PROCESS = 256
+       SERVICE_DRIVER              = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER
+       SERVICE_TYPE_ALL            = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS
+
+       SERVICE_BOOT_START   = 0
+       SERVICE_SYSTEM_START = 1
+       SERVICE_AUTO_START   = 2
+       SERVICE_DEMAND_START = 3
+       SERVICE_DISABLED     = 4
+
+       SERVICE_ERROR_IGNORE   = 0
+       SERVICE_ERROR_NORMAL   = 1
+       SERVICE_ERROR_SEVERE   = 2
+       SERVICE_ERROR_CRITICAL = 3
+
+       SC_STATUS_PROCESS_INFO = 0
+
+       SERVICE_STOPPED          = 1
+       SERVICE_START_PENDING    = 2
+       SERVICE_STOP_PENDING     = 3
+       SERVICE_RUNNING          = 4
+       SERVICE_CONTINUE_PENDING = 5
+       SERVICE_PAUSE_PENDING    = 6
+       SERVICE_PAUSED           = 7
+       SERVICE_NO_CHANGE        = 0xffffffff
+
+       SERVICE_ACCEPT_STOP                  = 1
+       SERVICE_ACCEPT_PAUSE_CONTINUE        = 2
+       SERVICE_ACCEPT_SHUTDOWN              = 4
+       SERVICE_ACCEPT_PARAMCHANGE           = 8
+       SERVICE_ACCEPT_NETBINDCHANGE         = 16
+       SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32
+       SERVICE_ACCEPT_POWEREVENT            = 64
+       SERVICE_ACCEPT_SESSIONCHANGE         = 128
+
+       SERVICE_CONTROL_STOP                  = 1
+       SERVICE_CONTROL_PAUSE                 = 2
+       SERVICE_CONTROL_CONTINUE              = 3
+       SERVICE_CONTROL_INTERROGATE           = 4
+       SERVICE_CONTROL_SHUTDOWN              = 5
+       SERVICE_CONTROL_PARAMCHANGE           = 6
+       SERVICE_CONTROL_NETBINDADD            = 7
+       SERVICE_CONTROL_NETBINDREMOVE         = 8
+       SERVICE_CONTROL_NETBINDENABLE         = 9
+       SERVICE_CONTROL_NETBINDDISABLE        = 10
+       SERVICE_CONTROL_DEVICEEVENT           = 11
+       SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12
+       SERVICE_CONTROL_POWEREVENT            = 13
+       SERVICE_CONTROL_SESSIONCHANGE         = 14
+
+       SERVICE_ACTIVE    = 1
+       SERVICE_INACTIVE  = 2
+       SERVICE_STATE_ALL = 3
+
+       SERVICE_QUERY_CONFIG           = 1
+       SERVICE_CHANGE_CONFIG          = 2
+       SERVICE_QUERY_STATUS           = 4
+       SERVICE_ENUMERATE_DEPENDENTS   = 8
+       SERVICE_START                  = 16
+       SERVICE_STOP                   = 32
+       SERVICE_PAUSE_CONTINUE         = 64
+       SERVICE_INTERROGATE            = 128
+       SERVICE_USER_DEFINED_CONTROL   = 256
+       SERVICE_ALL_ACCESS             = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL
+       SERVICE_RUNS_IN_SYSTEM_PROCESS = 1
+       SERVICE_CONFIG_DESCRIPTION     = 1
+       SERVICE_CONFIG_FAILURE_ACTIONS = 2
+
+       NO_ERROR = 0
+)
+
+type SERVICE_STATUS struct {
+       ServiceType             uint32
+       CurrentState            uint32
+       ControlsAccepted        uint32
+       Win32ExitCode           uint32
+       ServiceSpecificExitCode uint32
+       CheckPoint              uint32
+       WaitHint                uint32
+}
+
+type SERVICE_TABLE_ENTRY struct {
+       ServiceName *uint16
+       ServiceProc uintptr
+}
+
+type QUERY_SERVICE_CONFIG struct {
+       ServiceType      uint32
+       StartType        uint32
+       ErrorControl     uint32
+       BinaryPathName   *uint16
+       LoadOrderGroup   *uint16
+       TagId            uint32
+       Dependencies     *uint16
+       ServiceStartName *uint16
+       DisplayName      *uint16
+}
+
+type SERVICE_DESCRIPTION struct {
+       Description *uint16
+}
+
+//sys  CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle
+//sys  CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW
+//sys  OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW
+//sys  DeleteService(service Handle) (err error) = advapi32.DeleteService
+//sys  StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW
+//sys  QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus
+//sys  ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService
+//sys  StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW
+//sys  SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus
+//sys  ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW
+//sys  QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW
+//sys  ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W
+//sys  QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W
diff --git a/vendor/golang.org/x/sys/windows/str.go b/vendor/golang.org/x/sys/windows/str.go
new file mode 100644 (file)
index 0000000..917cc2a
--- /dev/null
@@ -0,0 +1,22 @@
+// 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.
+
+// +build windows
+
+package windows
+
+func itoa(val int) string { // do it here rather than with fmt to avoid dependency
+       if val < 0 {
+               return "-" + itoa(-val)
+       }
+       var buf [32]byte // big enough for int64
+       i := len(buf) - 1
+       for val >= 10 {
+               buf[i] = byte(val%10 + '0')
+               i--
+               val /= 10
+       }
+       buf[i] = byte(val + '0')
+       return string(buf[i:])
+}
diff --git a/vendor/golang.org/x/sys/windows/svc/eventlog/install.go b/vendor/golang.org/x/sys/windows/svc/eventlog/install.go
new file mode 100644 (file)
index 0000000..c76a376
--- /dev/null
@@ -0,0 +1,80 @@
+// Copyright 2012 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.
+
+// +build windows
+
+package eventlog
+
+import (
+       "errors"
+
+       "golang.org/x/sys/windows"
+       "golang.org/x/sys/windows/registry"
+)
+
+const (
+       // Log levels.
+       Info    = windows.EVENTLOG_INFORMATION_TYPE
+       Warning = windows.EVENTLOG_WARNING_TYPE
+       Error   = windows.EVENTLOG_ERROR_TYPE
+)
+
+const addKeyName = `SYSTEM\CurrentControlSet\Services\EventLog\Application`
+
+// Install modifies PC registry to allow logging with an event source src.
+// It adds all required keys and values to the event log registry key.
+// Install uses msgFile as the event message file. If useExpandKey is true,
+// the event message file is installed as REG_EXPAND_SZ value,
+// otherwise as REG_SZ. Use bitwise of log.Error, log.Warning and
+// log.Info to specify events supported by the new event source.
+func Install(src, msgFile string, useExpandKey bool, eventsSupported uint32) error {
+       appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.CREATE_SUB_KEY)
+       if err != nil {
+               return err
+       }
+       defer appkey.Close()
+
+       sk, alreadyExist, err := registry.CreateKey(appkey, src, registry.SET_VALUE)
+       if err != nil {
+               return err
+       }
+       defer sk.Close()
+       if alreadyExist {
+               return errors.New(addKeyName + `\` + src + " registry key already exists")
+       }
+
+       err = sk.SetDWordValue("CustomSource", 1)
+       if err != nil {
+               return err
+       }
+       if useExpandKey {
+               err = sk.SetExpandStringValue("EventMessageFile", msgFile)
+       } else {
+               err = sk.SetStringValue("EventMessageFile", msgFile)
+       }
+       if err != nil {
+               return err
+       }
+       err = sk.SetDWordValue("TypesSupported", eventsSupported)
+       if err != nil {
+               return err
+       }
+       return nil
+}
+
+// InstallAsEventCreate is the same as Install, but uses
+// %SystemRoot%\System32\EventCreate.exe as the event message file.
+func InstallAsEventCreate(src string, eventsSupported uint32) error {
+       return Install(src, "%SystemRoot%\\System32\\EventCreate.exe", true, eventsSupported)
+}
+
+// Remove deletes all registry elements installed by the correspondent Install.
+func Remove(src string) error {
+       appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.SET_VALUE)
+       if err != nil {
+               return err
+       }
+       defer appkey.Close()
+       return registry.DeleteKey(appkey, src)
+}
diff --git a/vendor/golang.org/x/sys/windows/svc/eventlog/log.go b/vendor/golang.org/x/sys/windows/svc/eventlog/log.go
new file mode 100644 (file)
index 0000000..46e5153
--- /dev/null
@@ -0,0 +1,70 @@
+// Copyright 2012 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.
+
+// +build windows
+
+// Package eventlog implements access to Windows event log.
+//
+package eventlog
+
+import (
+       "errors"
+       "syscall"
+
+       "golang.org/x/sys/windows"
+)
+
+// Log provides access to the system log.
+type Log struct {
+       Handle windows.Handle
+}
+
+// Open retrieves a handle to the specified event log.
+func Open(source string) (*Log, error) {
+       return OpenRemote("", source)
+}
+
+// OpenRemote does the same as Open, but on different computer host.
+func OpenRemote(host, source string) (*Log, error) {
+       if source == "" {
+               return nil, errors.New("Specify event log source")
+       }
+       var s *uint16
+       if host != "" {
+               s = syscall.StringToUTF16Ptr(host)
+       }
+       h, err := windows.RegisterEventSource(s, syscall.StringToUTF16Ptr(source))
+       if err != nil {
+               return nil, err
+       }
+       return &Log{Handle: h}, nil
+}
+
+// Close closes event log l.
+func (l *Log) Close() error {
+       return windows.DeregisterEventSource(l.Handle)
+}
+
+func (l *Log) report(etype uint16, eid uint32, msg string) error {
+       ss := []*uint16{syscall.StringToUTF16Ptr(msg)}
+       return windows.ReportEvent(l.Handle, etype, 0, eid, 0, 1, 0, &ss[0], nil)
+}
+
+// Info writes an information event msg with event id eid to the end of event log l.
+// When EventCreate.exe is used, eid must be between 1 and 1000.
+func (l *Log) Info(eid uint32, msg string) error {
+       return l.report(windows.EVENTLOG_INFORMATION_TYPE, eid, msg)
+}
+
+// Warning writes an warning event msg with event id eid to the end of event log l.
+// When EventCreate.exe is used, eid must be between 1 and 1000.
+func (l *Log) Warning(eid uint32, msg string) error {
+       return l.report(windows.EVENTLOG_WARNING_TYPE, eid, msg)
+}
+
+// Error writes an error event msg with event id eid to the end of event log l.
+// When EventCreate.exe is used, eid must be between 1 and 1000.
+func (l *Log) Error(eid uint32, msg string) error {
+       return l.report(windows.EVENTLOG_ERROR_TYPE, eid, msg)
+}
diff --git a/vendor/golang.org/x/sys/windows/syscall.go b/vendor/golang.org/x/sys/windows/syscall.go
new file mode 100644 (file)
index 0000000..4e2fbe8
--- /dev/null
@@ -0,0 +1,71 @@
+// 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.
+
+// +build windows
+
+// Package windows contains an interface to the low-level operating system
+// primitives.  OS details vary depending on the underlying system, and
+// by default, godoc will display the OS-specific documentation for the current
+// system.  If you want godoc to display syscall documentation for another
+// system, set $GOOS and $GOARCH to the desired system.  For example, if
+// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS
+// to freebsd and $GOARCH to arm.
+// The primary use of this package is inside other packages that provide a more
+// portable interface to the system, such as "os", "time" and "net".  Use
+// those packages rather than this one if you can.
+// For details of the functions and data types in this package consult
+// the manuals for the appropriate operating system.
+// These calls return err == nil to indicate success; otherwise
+// err represents an operating system error describing the failure and
+// holds a value of type syscall.Errno.
+package windows // import "golang.org/x/sys/windows"
+
+import (
+       "syscall"
+)
+
+// ByteSliceFromString returns a NUL-terminated slice of bytes
+// containing the text of s. If s contains a NUL byte at any
+// location, it returns (nil, syscall.EINVAL).
+func ByteSliceFromString(s string) ([]byte, error) {
+       for i := 0; i < len(s); i++ {
+               if s[i] == 0 {
+                       return nil, syscall.EINVAL
+               }
+       }
+       a := make([]byte, len(s)+1)
+       copy(a, s)
+       return a, nil
+}
+
+// BytePtrFromString returns a pointer to a NUL-terminated array of
+// bytes containing the text of s. If s contains a NUL byte at any
+// location, it returns (nil, syscall.EINVAL).
+func BytePtrFromString(s string) (*byte, error) {
+       a, err := ByteSliceFromString(s)
+       if err != nil {
+               return nil, err
+       }
+       return &a[0], nil
+}
+
+// Single-word zero for use when we need a valid pointer to 0 bytes.
+// See mksyscall.pl.
+var _zero uintptr
+
+func (ts *Timespec) Unix() (sec int64, nsec int64) {
+       return int64(ts.Sec), int64(ts.Nsec)
+}
+
+func (tv *Timeval) Unix() (sec int64, nsec int64) {
+       return int64(tv.Sec), int64(tv.Usec) * 1000
+}
+
+func (ts *Timespec) Nano() int64 {
+       return int64(ts.Sec)*1e9 + int64(ts.Nsec)
+}
+
+func (tv *Timeval) Nano() int64 {
+       return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000
+}
diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go
new file mode 100644 (file)
index 0000000..592d73e
--- /dev/null
@@ -0,0 +1,989 @@
+// 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 windows
+
+import (
+       errorspkg "errors"
+       "sync"
+       "syscall"
+       "unicode/utf16"
+       "unsafe"
+)
+
+type Handle uintptr
+
+const InvalidHandle = ^Handle(0)
+
+// StringToUTF16 is deprecated. Use UTF16FromString instead.
+// If s contains a NUL byte this function panics instead of
+// returning an error.
+func StringToUTF16(s string) []uint16 {
+       a, err := UTF16FromString(s)
+       if err != nil {
+               panic("windows: string with NUL passed to StringToUTF16")
+       }
+       return a
+}
+
+// UTF16FromString returns the UTF-16 encoding of the UTF-8 string
+// s, with a terminating NUL added. If s contains a NUL byte at any
+// location, it returns (nil, syscall.EINVAL).
+func UTF16FromString(s string) ([]uint16, error) {
+       for i := 0; i < len(s); i++ {
+               if s[i] == 0 {
+                       return nil, syscall.EINVAL
+               }
+       }
+       return utf16.Encode([]rune(s + "\x00")), nil
+}
+
+// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
+// with a terminating NUL removed.
+func UTF16ToString(s []uint16) string {
+       for i, v := range s {
+               if v == 0 {
+                       s = s[0:i]
+                       break
+               }
+       }
+       return string(utf16.Decode(s))
+}
+
+// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
+// If s contains a NUL byte this function panics instead of
+// returning an error.
+func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] }
+
+// UTF16PtrFromString returns pointer to the UTF-16 encoding of
+// the UTF-8 string s, with a terminating NUL added. If s
+// contains a NUL byte at any location, it returns (nil, syscall.EINVAL).
+func UTF16PtrFromString(s string) (*uint16, error) {
+       a, err := UTF16FromString(s)
+       if err != nil {
+               return nil, err
+       }
+       return &a[0], nil
+}
+
+func Getpagesize() int { return 4096 }
+
+// Converts a Go function to a function pointer conforming
+// to the stdcall or cdecl calling convention.  This is useful when
+// interoperating with Windows code requiring callbacks.
+// Implemented in runtime/syscall_windows.goc
+func NewCallback(fn interface{}) uintptr
+func NewCallbackCDecl(fn interface{}) uintptr
+
+// windows api calls
+
+//sys  GetLastError() (lasterr error)
+//sys  LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW
+//sys  LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW
+//sys  FreeLibrary(handle Handle) (err error)
+//sys  GetProcAddress(module Handle, procname string) (proc uintptr, err error)
+//sys  GetVersion() (ver uint32, err error)
+//sys  FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW
+//sys  ExitProcess(exitcode uint32)
+//sys  CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW
+//sys  ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)
+//sys  WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)
+//sys  SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff]
+//sys  CloseHandle(handle Handle) (err error)
+//sys  GetStdHandle(stdhandle int) (handle Handle, err error) [failretval==InvalidHandle]
+//sys  findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW
+//sys  findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW
+//sys  FindClose(handle Handle) (err error)
+//sys  GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error)
+//sys  GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW
+//sys  SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW
+//sys  CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW
+//sys  RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW
+//sys  DeleteFile(path *uint16) (err error) = DeleteFileW
+//sys  MoveFile(from *uint16, to *uint16) (err error) = MoveFileW
+//sys  MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW
+//sys  GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW
+//sys  GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW
+//sys  SetEndOfFile(handle Handle) (err error)
+//sys  GetSystemTimeAsFileTime(time *Filetime)
+//sys  GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff]
+//sys  CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error)
+//sys  GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error)
+//sys  PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error)
+//sys  CancelIo(s Handle) (err error)
+//sys  CancelIoEx(s Handle, o *Overlapped) (err error)
+//sys  CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW
+//sys  OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error)
+//sys  TerminateProcess(handle Handle, exitcode uint32) (err error)
+//sys  GetExitCodeProcess(handle Handle, exitcode *uint32) (err error)
+//sys  GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW
+//sys  GetCurrentProcess() (pseudoHandle Handle, err error)
+//sys  GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error)
+//sys  DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error)
+//sys  WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff]
+//sys  GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW
+//sys  CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error)
+//sys  GetFileType(filehandle Handle) (n uint32, err error)
+//sys  CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW
+//sys  CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext
+//sys  CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom
+//sys  GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW
+//sys  FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW
+//sys  GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW
+//sys  SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW
+//sys  SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error)
+//sys  GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW
+//sys  SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW
+//sys  GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW
+//sys  GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW
+//sys  CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW
+//sys  LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0]
+//sys  SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error)
+//sys  FlushFileBuffers(handle Handle) (err error)
+//sys  GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW
+//sys  GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW
+//sys  GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW
+//sys  CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW
+//sys  MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error)
+//sys  UnmapViewOfFile(addr uintptr) (err error)
+//sys  FlushViewOfFile(addr uintptr, length uintptr) (err error)
+//sys  VirtualLock(addr uintptr, length uintptr) (err error)
+//sys  VirtualUnlock(addr uintptr, length uintptr) (err error)
+//sys  TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile
+//sys  ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW
+//sys  CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW
+//sys   CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore
+//sys  CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore
+//sys   CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore
+//sys  CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore
+//sys   CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain
+//sys   CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain
+//sys   CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext
+//sys   CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext
+//sys   CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy
+//sys  RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW
+//sys  RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey
+//sys  RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW
+//sys  RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW
+//sys  RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW
+//sys  getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId
+//sys  GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode
+//sys  WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
+//sys  ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
+//sys  CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
+//sys  Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW
+//sys  Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW
+//sys  DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error)
+// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
+//sys  CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW
+//sys  CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW
+//sys  GetCurrentThreadId() (id uint32)
+//sys  CreateEvent(eventAttrs *syscall.SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW
+//sys  SetEvent(event Handle) (err error) = kernel32.SetEvent
+
+// syscall interface implementation for other packages
+
+func Exit(code int) { ExitProcess(uint32(code)) }
+
+func makeInheritSa() *SecurityAttributes {
+       var sa SecurityAttributes
+       sa.Length = uint32(unsafe.Sizeof(sa))
+       sa.InheritHandle = 1
+       return &sa
+}
+
+func Open(path string, mode int, perm uint32) (fd Handle, err error) {
+       if len(path) == 0 {
+               return InvalidHandle, ERROR_FILE_NOT_FOUND
+       }
+       pathp, err := UTF16PtrFromString(path)
+       if err != nil {
+               return InvalidHandle, err
+       }
+       var access uint32
+       switch mode & (O_RDONLY | O_WRONLY | O_RDWR) {
+       case O_RDONLY:
+               access = GENERIC_READ
+       case O_WRONLY:
+               access = GENERIC_WRITE
+       case O_RDWR:
+               access = GENERIC_READ | GENERIC_WRITE
+       }
+       if mode&O_CREAT != 0 {
+               access |= GENERIC_WRITE
+       }
+       if mode&O_APPEND != 0 {
+               access &^= GENERIC_WRITE
+               access |= FILE_APPEND_DATA
+       }
+       sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
+       var sa *SecurityAttributes
+       if mode&O_CLOEXEC == 0 {
+               sa = makeInheritSa()
+       }
+       var createmode uint32
+       switch {
+       case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL):
+               createmode = CREATE_NEW
+       case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC):
+               createmode = CREATE_ALWAYS
+       case mode&O_CREAT == O_CREAT:
+               createmode = OPEN_ALWAYS
+       case mode&O_TRUNC == O_TRUNC:
+               createmode = TRUNCATE_EXISTING
+       default:
+               createmode = OPEN_EXISTING
+       }
+       h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0)
+       return h, e
+}
+
+func Read(fd Handle, p []byte) (n int, err error) {
+       var done uint32
+       e := ReadFile(fd, p, &done, nil)
+       if e != nil {
+               if e == ERROR_BROKEN_PIPE {
+                       // NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin
+                       return 0, nil
+               }
+               return 0, e
+       }
+       if raceenabled {
+               if done > 0 {
+                       raceWriteRange(unsafe.Pointer(&p[0]), int(done))
+               }
+               raceAcquire(unsafe.Pointer(&ioSync))
+       }
+       return int(done), nil
+}
+
+func Write(fd Handle, p []byte) (n int, err error) {
+       if raceenabled {
+               raceReleaseMerge(unsafe.Pointer(&ioSync))
+       }
+       var done uint32
+       e := WriteFile(fd, p, &done, nil)
+       if e != nil {
+               return 0, e
+       }
+       if raceenabled && done > 0 {
+               raceReadRange(unsafe.Pointer(&p[0]), int(done))
+       }
+       return int(done), nil
+}
+
+var ioSync int64
+
+func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) {
+       var w uint32
+       switch whence {
+       case 0:
+               w = FILE_BEGIN
+       case 1:
+               w = FILE_CURRENT
+       case 2:
+               w = FILE_END
+       }
+       hi := int32(offset >> 32)
+       lo := int32(offset)
+       // use GetFileType to check pipe, pipe can't do seek
+       ft, _ := GetFileType(fd)
+       if ft == FILE_TYPE_PIPE {
+               return 0, syscall.EPIPE
+       }
+       rlo, e := SetFilePointer(fd, lo, &hi, w)
+       if e != nil {
+               return 0, e
+       }
+       return int64(hi)<<32 + int64(rlo), nil
+}
+
+func Close(fd Handle) (err error) {
+       return CloseHandle(fd)
+}
+
+var (
+       Stdin  = getStdHandle(STD_INPUT_HANDLE)
+       Stdout = getStdHandle(STD_OUTPUT_HANDLE)
+       Stderr = getStdHandle(STD_ERROR_HANDLE)
+)
+
+func getStdHandle(h int) (fd Handle) {
+       r, _ := GetStdHandle(h)
+       CloseOnExec(r)
+       return r
+}
+
+const ImplementsGetwd = true
+
+func Getwd() (wd string, err error) {
+       b := make([]uint16, 300)
+       n, e := GetCurrentDirectory(uint32(len(b)), &b[0])
+       if e != nil {
+               return "", e
+       }
+       return string(utf16.Decode(b[0:n])), nil
+}
+
+func Chdir(path string) (err error) {
+       pathp, err := UTF16PtrFromString(path)
+       if err != nil {
+               return err
+       }
+       return SetCurrentDirectory(pathp)
+}
+
+func Mkdir(path string, mode uint32) (err error) {
+       pathp, err := UTF16PtrFromString(path)
+       if err != nil {
+               return err
+       }
+       return CreateDirectory(pathp, nil)
+}
+
+func Rmdir(path string) (err error) {
+       pathp, err := UTF16PtrFromString(path)
+       if err != nil {
+               return err
+       }
+       return RemoveDirectory(pathp)
+}
+
+func Unlink(path string) (err error) {
+       pathp, err := UTF16PtrFromString(path)
+       if err != nil {
+               return err
+       }
+       return DeleteFile(pathp)
+}
+
+func Rename(oldpath, newpath string) (err error) {
+       from, err := UTF16PtrFromString(oldpath)
+       if err != nil {
+               return err
+       }
+       to, err := UTF16PtrFromString(newpath)
+       if err != nil {
+               return err
+       }
+       return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)
+}
+
+func ComputerName() (name string, err error) {
+       var n uint32 = MAX_COMPUTERNAME_LENGTH + 1
+       b := make([]uint16, n)
+       e := GetComputerName(&b[0], &n)
+       if e != nil {
+               return "", e
+       }
+       return string(utf16.Decode(b[0:n])), nil
+}
+
+func Ftruncate(fd Handle, length int64) (err error) {
+       curoffset, e := Seek(fd, 0, 1)
+       if e != nil {
+               return e
+       }
+       defer Seek(fd, curoffset, 0)
+       _, e = Seek(fd, length, 0)
+       if e != nil {
+               return e
+       }
+       e = SetEndOfFile(fd)
+       if e != nil {
+               return e
+       }
+       return nil
+}
+
+func Gettimeofday(tv *Timeval) (err error) {
+       var ft Filetime
+       GetSystemTimeAsFileTime(&ft)
+       *tv = NsecToTimeval(ft.Nanoseconds())
+       return nil
+}
+
+func Pipe(p []Handle) (err error) {
+       if len(p) != 2 {
+               return syscall.EINVAL
+       }
+       var r, w Handle
+       e := CreatePipe(&r, &w, makeInheritSa(), 0)
+       if e != nil {
+               return e
+       }
+       p[0] = r
+       p[1] = w
+       return nil
+}
+
+func Utimes(path string, tv []Timeval) (err error) {
+       if len(tv) != 2 {
+               return syscall.EINVAL
+       }
+       pathp, e := UTF16PtrFromString(path)
+       if e != nil {
+               return e
+       }
+       h, e := CreateFile(pathp,
+               FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
+               OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
+       if e != nil {
+               return e
+       }
+       defer Close(h)
+       a := NsecToFiletime(tv[0].Nanoseconds())
+       w := NsecToFiletime(tv[1].Nanoseconds())
+       return SetFileTime(h, nil, &a, &w)
+}
+
+func UtimesNano(path string, ts []Timespec) (err error) {
+       if len(ts) != 2 {
+               return syscall.EINVAL
+       }
+       pathp, e := UTF16PtrFromString(path)
+       if e != nil {
+               return e
+       }
+       h, e := CreateFile(pathp,
+               FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
+               OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
+       if e != nil {
+               return e
+       }
+       defer Close(h)
+       a := NsecToFiletime(TimespecToNsec(ts[0]))
+       w := NsecToFiletime(TimespecToNsec(ts[1]))
+       return SetFileTime(h, nil, &a, &w)
+}
+
+func Fsync(fd Handle) (err error) {
+       return FlushFileBuffers(fd)
+}
+
+func Chmod(path string, mode uint32) (err error) {
+       if mode == 0 {
+               return syscall.EINVAL
+       }
+       p, e := UTF16PtrFromString(path)
+       if e != nil {
+               return e
+       }
+       attrs, e := GetFileAttributes(p)
+       if e != nil {
+               return e
+       }
+       if mode&S_IWRITE != 0 {
+               attrs &^= FILE_ATTRIBUTE_READONLY
+       } else {
+               attrs |= FILE_ATTRIBUTE_READONLY
+       }
+       return SetFileAttributes(p, attrs)
+}
+
+func LoadCancelIoEx() error {
+       return procCancelIoEx.Find()
+}
+
+func LoadSetFileCompletionNotificationModes() error {
+       return procSetFileCompletionNotificationModes.Find()
+}
+
+// net api calls
+
+const socket_error = uintptr(^uint32(0))
+
+//sys  WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
+//sys  WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
+//sys  WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
+//sys  socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
+//sys  Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt
+//sys  Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt
+//sys  bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind
+//sys  connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect
+//sys  getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname
+//sys  getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername
+//sys  listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen
+//sys  shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown
+//sys  Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket
+//sys  AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx
+//sys  GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs
+//sys  WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv
+//sys  WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend
+//sys  WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32,  from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom
+//sys  WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32,  overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo
+//sys  GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname
+//sys  GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname
+//sys  Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs
+//sys  GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname
+//sys  DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W
+//sys  DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree
+//sys  DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W
+//sys  GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW
+//sys  FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW
+//sys  GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry
+//sys  GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo
+//sys  SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes
+//sys  WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW
+//sys  GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses
+//sys  GetACP() (acp uint32) = kernel32.GetACP
+//sys  MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
+
+// For testing: clients can set this flag to force
+// creation of IPv6 sockets to return EAFNOSUPPORT.
+var SocketDisableIPv6 bool
+
+type RawSockaddrInet4 struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]uint8
+}
+
+type RawSockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+type RawSockaddr struct {
+       Family uint16
+       Data   [14]int8
+}
+
+type RawSockaddrAny struct {
+       Addr RawSockaddr
+       Pad  [96]int8
+}
+
+type Sockaddr interface {
+       sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs
+}
+
+type SockaddrInet4 struct {
+       Port int
+       Addr [4]byte
+       raw  RawSockaddrInet4
+}
+
+func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) {
+       if sa.Port < 0 || sa.Port > 0xFFFF {
+               return nil, 0, syscall.EINVAL
+       }
+       sa.raw.Family = AF_INET
+       p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
+       p[0] = byte(sa.Port >> 8)
+       p[1] = byte(sa.Port)
+       for i := 0; i < len(sa.Addr); i++ {
+               sa.raw.Addr[i] = sa.Addr[i]
+       }
+       return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
+}
+
+type SockaddrInet6 struct {
+       Port   int
+       ZoneId uint32
+       Addr   [16]byte
+       raw    RawSockaddrInet6
+}
+
+func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) {
+       if sa.Port < 0 || sa.Port > 0xFFFF {
+               return nil, 0, syscall.EINVAL
+       }
+       sa.raw.Family = AF_INET6
+       p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
+       p[0] = byte(sa.Port >> 8)
+       p[1] = byte(sa.Port)
+       sa.raw.Scope_id = sa.ZoneId
+       for i := 0; i < len(sa.Addr); i++ {
+               sa.raw.Addr[i] = sa.Addr[i]
+       }
+       return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
+}
+
+type SockaddrUnix struct {
+       Name string
+}
+
+func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) {
+       // TODO(brainman): implement SockaddrUnix.sockaddr()
+       return nil, 0, syscall.EWINDOWS
+}
+
+func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) {
+       switch rsa.Addr.Family {
+       case AF_UNIX:
+               return nil, syscall.EWINDOWS
+
+       case AF_INET:
+               pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
+               sa := new(SockaddrInet4)
+               p := (*[2]byte)(unsafe.Pointer(&pp.Port))
+               sa.Port = int(p[0])<<8 + int(p[1])
+               for i := 0; i < len(sa.Addr); i++ {
+                       sa.Addr[i] = pp.Addr[i]
+               }
+               return sa, nil
+
+       case AF_INET6:
+               pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
+               sa := new(SockaddrInet6)
+               p := (*[2]byte)(unsafe.Pointer(&pp.Port))
+               sa.Port = int(p[0])<<8 + int(p[1])
+               sa.ZoneId = pp.Scope_id
+               for i := 0; i < len(sa.Addr); i++ {
+                       sa.Addr[i] = pp.Addr[i]
+               }
+               return sa, nil
+       }
+       return nil, syscall.EAFNOSUPPORT
+}
+
+func Socket(domain, typ, proto int) (fd Handle, err error) {
+       if domain == AF_INET6 && SocketDisableIPv6 {
+               return InvalidHandle, syscall.EAFNOSUPPORT
+       }
+       return socket(int32(domain), int32(typ), int32(proto))
+}
+
+func SetsockoptInt(fd Handle, level, opt int, value int) (err error) {
+       v := int32(value)
+       return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v)))
+}
+
+func Bind(fd Handle, sa Sockaddr) (err error) {
+       ptr, n, err := sa.sockaddr()
+       if err != nil {
+               return err
+       }
+       return bind(fd, ptr, n)
+}
+
+func Connect(fd Handle, sa Sockaddr) (err error) {
+       ptr, n, err := sa.sockaddr()
+       if err != nil {
+               return err
+       }
+       return connect(fd, ptr, n)
+}
+
+func Getsockname(fd Handle) (sa Sockaddr, err error) {
+       var rsa RawSockaddrAny
+       l := int32(unsafe.Sizeof(rsa))
+       if err = getsockname(fd, &rsa, &l); err != nil {
+               return
+       }
+       return rsa.Sockaddr()
+}
+
+func Getpeername(fd Handle) (sa Sockaddr, err error) {
+       var rsa RawSockaddrAny
+       l := int32(unsafe.Sizeof(rsa))
+       if err = getpeername(fd, &rsa, &l); err != nil {
+               return
+       }
+       return rsa.Sockaddr()
+}
+
+func Listen(s Handle, n int) (err error) {
+       return listen(s, int32(n))
+}
+
+func Shutdown(fd Handle, how int) (err error) {
+       return shutdown(fd, int32(how))
+}
+
+func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) {
+       rsa, l, err := to.sockaddr()
+       if err != nil {
+               return err
+       }
+       return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine)
+}
+
+func LoadGetAddrInfo() error {
+       return procGetAddrInfoW.Find()
+}
+
+var connectExFunc struct {
+       once sync.Once
+       addr uintptr
+       err  error
+}
+
+func LoadConnectEx() error {
+       connectExFunc.once.Do(func() {
+               var s Handle
+               s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
+               if connectExFunc.err != nil {
+                       return
+               }
+               defer CloseHandle(s)
+               var n uint32
+               connectExFunc.err = WSAIoctl(s,
+                       SIO_GET_EXTENSION_FUNCTION_POINTER,
+                       (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)),
+                       uint32(unsafe.Sizeof(WSAID_CONNECTEX)),
+                       (*byte)(unsafe.Pointer(&connectExFunc.addr)),
+                       uint32(unsafe.Sizeof(connectExFunc.addr)),
+                       &n, nil, 0)
+       })
+       return connectExFunc.err
+}
+
+func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error {
+       err := LoadConnectEx()
+       if err != nil {
+               return errorspkg.New("failed to find ConnectEx: " + err.Error())
+       }
+       ptr, n, err := sa.sockaddr()
+       if err != nil {
+               return err
+       }
+       return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
+}
+
+// Invented structures to support what package os expects.
+type Rusage struct {
+       CreationTime Filetime
+       ExitTime     Filetime
+       KernelTime   Filetime
+       UserTime     Filetime
+}
+
+type WaitStatus struct {
+       ExitCode uint32
+}
+
+func (w WaitStatus) Exited() bool { return true }
+
+func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) }
+
+func (w WaitStatus) Signal() Signal { return -1 }
+
+func (w WaitStatus) CoreDump() bool { return false }
+
+func (w WaitStatus) Stopped() bool { return false }
+
+func (w WaitStatus) Continued() bool { return false }
+
+func (w WaitStatus) StopSignal() Signal { return -1 }
+
+func (w WaitStatus) Signaled() bool { return false }
+
+func (w WaitStatus) TrapCause() int { return -1 }
+
+// Timespec is an invented structure on Windows, but here for
+// consistency with the corresponding package for other operating systems.
+type Timespec struct {
+       Sec  int64
+       Nsec int64
+}
+
+func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
+
+func NsecToTimespec(nsec int64) (ts Timespec) {
+       ts.Sec = nsec / 1e9
+       ts.Nsec = nsec % 1e9
+       return
+}
+
+// TODO(brainman): fix all needed for net
+
+func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS }
+func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) {
+       return 0, nil, syscall.EWINDOWS
+}
+func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error)       { return syscall.EWINDOWS }
+func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS }
+
+// The Linger struct is wrong but we only noticed after Go 1.
+// sysLinger is the real system call structure.
+
+// BUG(brainman): The definition of Linger is not appropriate for direct use
+// with Setsockopt and Getsockopt.
+// Use SetsockoptLinger instead.
+
+type Linger struct {
+       Onoff  int32
+       Linger int32
+}
+
+type sysLinger struct {
+       Onoff  uint16
+       Linger uint16
+}
+
+type IPMreq struct {
+       Multiaddr [4]byte /* in_addr */
+       Interface [4]byte /* in_addr */
+}
+
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
+func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS }
+
+func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) {
+       sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)}
+       return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys)))
+}
+
+func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) {
+       return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4)
+}
+func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) {
+       return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
+}
+func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) {
+       return syscall.EWINDOWS
+}
+
+func Getpid() (pid int) { return int(getCurrentProcessId()) }
+
+func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) {
+       // NOTE(rsc): The Win32finddata struct is wrong for the system call:
+       // the two paths are each one uint16 short. Use the correct struct,
+       // a win32finddata1, and then copy the results out.
+       // There is no loss of expressivity here, because the final
+       // uint16, if it is used, is supposed to be a NUL, and Go doesn't need that.
+       // For Go 1.1, we might avoid the allocation of win32finddata1 here
+       // by adding a final Bug [2]uint16 field to the struct and then
+       // adjusting the fields in the result directly.
+       var data1 win32finddata1
+       handle, err = findFirstFile1(name, &data1)
+       if err == nil {
+               copyFindData(data, &data1)
+       }
+       return
+}
+
+func FindNextFile(handle Handle, data *Win32finddata) (err error) {
+       var data1 win32finddata1
+       err = findNextFile1(handle, &data1)
+       if err == nil {
+               copyFindData(data, &data1)
+       }
+       return
+}
+
+func getProcessEntry(pid int) (*ProcessEntry32, error) {
+       snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
+       if err != nil {
+               return nil, err
+       }
+       defer CloseHandle(snapshot)
+       var procEntry ProcessEntry32
+       procEntry.Size = uint32(unsafe.Sizeof(procEntry))
+       if err = Process32First(snapshot, &procEntry); err != nil {
+               return nil, err
+       }
+       for {
+               if procEntry.ProcessID == uint32(pid) {
+                       return &procEntry, nil
+               }
+               err = Process32Next(snapshot, &procEntry)
+               if err != nil {
+                       return nil, err
+               }
+       }
+}
+
+func Getppid() (ppid int) {
+       pe, err := getProcessEntry(Getpid())
+       if err != nil {
+               return -1
+       }
+       return int(pe.ParentProcessID)
+}
+
+// TODO(brainman): fix all needed for os
+func Fchdir(fd Handle) (err error)             { return syscall.EWINDOWS }
+func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS }
+func Symlink(path, link string) (err error)    { return syscall.EWINDOWS }
+
+func Fchmod(fd Handle, mode uint32) (err error)        { return syscall.EWINDOWS }
+func Chown(path string, uid int, gid int) (err error)  { return syscall.EWINDOWS }
+func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }
+func Fchown(fd Handle, uid int, gid int) (err error)   { return syscall.EWINDOWS }
+
+func Getuid() (uid int)                  { return -1 }
+func Geteuid() (euid int)                { return -1 }
+func Getgid() (gid int)                  { return -1 }
+func Getegid() (egid int)                { return -1 }
+func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS }
+
+type Signal int
+
+func (s Signal) Signal() {}
+
+func (s Signal) String() string {
+       if 0 <= s && int(s) < len(signals) {
+               str := signals[s]
+               if str != "" {
+                       return str
+               }
+       }
+       return "signal " + itoa(int(s))
+}
+
+func LoadCreateSymbolicLink() error {
+       return procCreateSymbolicLinkW.Find()
+}
+
+// Readlink returns the destination of the named symbolic link.
+func Readlink(path string, buf []byte) (n int, err error) {
+       fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING,
+               FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0)
+       if err != nil {
+               return -1, err
+       }
+       defer CloseHandle(fd)
+
+       rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE)
+       var bytesReturned uint32
+       err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil)
+       if err != nil {
+               return -1, err
+       }
+
+       rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0]))
+       var s string
+       switch rdb.ReparseTag {
+       case IO_REPARSE_TAG_SYMLINK:
+               data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
+               p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
+               s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
+       case IO_REPARSE_TAG_MOUNT_POINT:
+               data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
+               p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
+               s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
+       default:
+               // the path is not a symlink or junction but another type of reparse
+               // point
+               return -1, syscall.ENOENT
+       }
+       n = copy(buf, []byte(s))
+
+       return n, nil
+}
diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
new file mode 100644 (file)
index 0000000..3ff8f52
--- /dev/null
@@ -0,0 +1,2245 @@
+// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
+
+package windows
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+var _ unsafe.Pointer
+
+var (
+       modadvapi32 = NewLazySystemDLL("advapi32.dll")
+       modkernel32 = NewLazySystemDLL("kernel32.dll")
+       modshell32  = NewLazySystemDLL("shell32.dll")
+       modmswsock  = NewLazySystemDLL("mswsock.dll")
+       modcrypt32  = NewLazySystemDLL("crypt32.dll")
+       modws2_32   = NewLazySystemDLL("ws2_32.dll")
+       moddnsapi   = NewLazySystemDLL("dnsapi.dll")
+       modiphlpapi = NewLazySystemDLL("iphlpapi.dll")
+       modsecur32  = NewLazySystemDLL("secur32.dll")
+       modnetapi32 = NewLazySystemDLL("netapi32.dll")
+       moduserenv  = NewLazySystemDLL("userenv.dll")
+
+       procRegisterEventSourceW               = modadvapi32.NewProc("RegisterEventSourceW")
+       procDeregisterEventSource              = modadvapi32.NewProc("DeregisterEventSource")
+       procReportEventW                       = modadvapi32.NewProc("ReportEventW")
+       procOpenSCManagerW                     = modadvapi32.NewProc("OpenSCManagerW")
+       procCloseServiceHandle                 = modadvapi32.NewProc("CloseServiceHandle")
+       procCreateServiceW                     = modadvapi32.NewProc("CreateServiceW")
+       procOpenServiceW                       = modadvapi32.NewProc("OpenServiceW")
+       procDeleteService                      = modadvapi32.NewProc("DeleteService")
+       procStartServiceW                      = modadvapi32.NewProc("StartServiceW")
+       procQueryServiceStatus                 = modadvapi32.NewProc("QueryServiceStatus")
+       procControlService                     = modadvapi32.NewProc("ControlService")
+       procStartServiceCtrlDispatcherW        = modadvapi32.NewProc("StartServiceCtrlDispatcherW")
+       procSetServiceStatus                   = modadvapi32.NewProc("SetServiceStatus")
+       procChangeServiceConfigW               = modadvapi32.NewProc("ChangeServiceConfigW")
+       procQueryServiceConfigW                = modadvapi32.NewProc("QueryServiceConfigW")
+       procChangeServiceConfig2W              = modadvapi32.NewProc("ChangeServiceConfig2W")
+       procQueryServiceConfig2W               = modadvapi32.NewProc("QueryServiceConfig2W")
+       procGetLastError                       = modkernel32.NewProc("GetLastError")
+       procLoadLibraryW                       = modkernel32.NewProc("LoadLibraryW")
+       procLoadLibraryExW                     = modkernel32.NewProc("LoadLibraryExW")
+       procFreeLibrary                        = modkernel32.NewProc("FreeLibrary")
+       procGetProcAddress                     = modkernel32.NewProc("GetProcAddress")
+       procGetVersion                         = modkernel32.NewProc("GetVersion")
+       procFormatMessageW                     = modkernel32.NewProc("FormatMessageW")
+       procExitProcess                        = modkernel32.NewProc("ExitProcess")
+       procCreateFileW                        = modkernel32.NewProc("CreateFileW")
+       procReadFile                           = modkernel32.NewProc("ReadFile")
+       procWriteFile                          = modkernel32.NewProc("WriteFile")
+       procSetFilePointer                     = modkernel32.NewProc("SetFilePointer")
+       procCloseHandle                        = modkernel32.NewProc("CloseHandle")
+       procGetStdHandle                       = modkernel32.NewProc("GetStdHandle")
+       procFindFirstFileW                     = modkernel32.NewProc("FindFirstFileW")
+       procFindNextFileW                      = modkernel32.NewProc("FindNextFileW")
+       procFindClose                          = modkernel32.NewProc("FindClose")
+       procGetFileInformationByHandle         = modkernel32.NewProc("GetFileInformationByHandle")
+       procGetCurrentDirectoryW               = modkernel32.NewProc("GetCurrentDirectoryW")
+       procSetCurrentDirectoryW               = modkernel32.NewProc("SetCurrentDirectoryW")
+       procCreateDirectoryW                   = modkernel32.NewProc("CreateDirectoryW")
+       procRemoveDirectoryW                   = modkernel32.NewProc("RemoveDirectoryW")
+       procDeleteFileW                        = modkernel32.NewProc("DeleteFileW")
+       procMoveFileW                          = modkernel32.NewProc("MoveFileW")
+       procMoveFileExW                        = modkernel32.NewProc("MoveFileExW")
+       procGetComputerNameW                   = modkernel32.NewProc("GetComputerNameW")
+       procGetComputerNameExW                 = modkernel32.NewProc("GetComputerNameExW")
+       procSetEndOfFile                       = modkernel32.NewProc("SetEndOfFile")
+       procGetSystemTimeAsFileTime            = modkernel32.NewProc("GetSystemTimeAsFileTime")
+       procGetTimeZoneInformation             = modkernel32.NewProc("GetTimeZoneInformation")
+       procCreateIoCompletionPort             = modkernel32.NewProc("CreateIoCompletionPort")
+       procGetQueuedCompletionStatus          = modkernel32.NewProc("GetQueuedCompletionStatus")
+       procPostQueuedCompletionStatus         = modkernel32.NewProc("PostQueuedCompletionStatus")
+       procCancelIo                           = modkernel32.NewProc("CancelIo")
+       procCancelIoEx                         = modkernel32.NewProc("CancelIoEx")
+       procCreateProcessW                     = modkernel32.NewProc("CreateProcessW")
+       procOpenProcess                        = modkernel32.NewProc("OpenProcess")
+       procTerminateProcess                   = modkernel32.NewProc("TerminateProcess")
+       procGetExitCodeProcess                 = modkernel32.NewProc("GetExitCodeProcess")
+       procGetStartupInfoW                    = modkernel32.NewProc("GetStartupInfoW")
+       procGetCurrentProcess                  = modkernel32.NewProc("GetCurrentProcess")
+       procGetProcessTimes                    = modkernel32.NewProc("GetProcessTimes")
+       procDuplicateHandle                    = modkernel32.NewProc("DuplicateHandle")
+       procWaitForSingleObject                = modkernel32.NewProc("WaitForSingleObject")
+       procGetTempPathW                       = modkernel32.NewProc("GetTempPathW")
+       procCreatePipe                         = modkernel32.NewProc("CreatePipe")
+       procGetFileType                        = modkernel32.NewProc("GetFileType")
+       procCryptAcquireContextW               = modadvapi32.NewProc("CryptAcquireContextW")
+       procCryptReleaseContext                = modadvapi32.NewProc("CryptReleaseContext")
+       procCryptGenRandom                     = modadvapi32.NewProc("CryptGenRandom")
+       procGetEnvironmentStringsW             = modkernel32.NewProc("GetEnvironmentStringsW")
+       procFreeEnvironmentStringsW            = modkernel32.NewProc("FreeEnvironmentStringsW")
+       procGetEnvironmentVariableW            = modkernel32.NewProc("GetEnvironmentVariableW")
+       procSetEnvironmentVariableW            = modkernel32.NewProc("SetEnvironmentVariableW")
+       procSetFileTime                        = modkernel32.NewProc("SetFileTime")
+       procGetFileAttributesW                 = modkernel32.NewProc("GetFileAttributesW")
+       procSetFileAttributesW                 = modkernel32.NewProc("SetFileAttributesW")
+       procGetFileAttributesExW               = modkernel32.NewProc("GetFileAttributesExW")
+       procGetCommandLineW                    = modkernel32.NewProc("GetCommandLineW")
+       procCommandLineToArgvW                 = modshell32.NewProc("CommandLineToArgvW")
+       procLocalFree                          = modkernel32.NewProc("LocalFree")
+       procSetHandleInformation               = modkernel32.NewProc("SetHandleInformation")
+       procFlushFileBuffers                   = modkernel32.NewProc("FlushFileBuffers")
+       procGetFullPathNameW                   = modkernel32.NewProc("GetFullPathNameW")
+       procGetLongPathNameW                   = modkernel32.NewProc("GetLongPathNameW")
+       procGetShortPathNameW                  = modkernel32.NewProc("GetShortPathNameW")
+       procCreateFileMappingW                 = modkernel32.NewProc("CreateFileMappingW")
+       procMapViewOfFile                      = modkernel32.NewProc("MapViewOfFile")
+       procUnmapViewOfFile                    = modkernel32.NewProc("UnmapViewOfFile")
+       procFlushViewOfFile                    = modkernel32.NewProc("FlushViewOfFile")
+       procVirtualLock                        = modkernel32.NewProc("VirtualLock")
+       procVirtualUnlock                      = modkernel32.NewProc("VirtualUnlock")
+       procTransmitFile                       = modmswsock.NewProc("TransmitFile")
+       procReadDirectoryChangesW              = modkernel32.NewProc("ReadDirectoryChangesW")
+       procCertOpenSystemStoreW               = modcrypt32.NewProc("CertOpenSystemStoreW")
+       procCertOpenStore                      = modcrypt32.NewProc("CertOpenStore")
+       procCertEnumCertificatesInStore        = modcrypt32.NewProc("CertEnumCertificatesInStore")
+       procCertAddCertificateContextToStore   = modcrypt32.NewProc("CertAddCertificateContextToStore")
+       procCertCloseStore                     = modcrypt32.NewProc("CertCloseStore")
+       procCertGetCertificateChain            = modcrypt32.NewProc("CertGetCertificateChain")
+       procCertFreeCertificateChain           = modcrypt32.NewProc("CertFreeCertificateChain")
+       procCertCreateCertificateContext       = modcrypt32.NewProc("CertCreateCertificateContext")
+       procCertFreeCertificateContext         = modcrypt32.NewProc("CertFreeCertificateContext")
+       procCertVerifyCertificateChainPolicy   = modcrypt32.NewProc("CertVerifyCertificateChainPolicy")
+       procRegOpenKeyExW                      = modadvapi32.NewProc("RegOpenKeyExW")
+       procRegCloseKey                        = modadvapi32.NewProc("RegCloseKey")
+       procRegQueryInfoKeyW                   = modadvapi32.NewProc("RegQueryInfoKeyW")
+       procRegEnumKeyExW                      = modadvapi32.NewProc("RegEnumKeyExW")
+       procRegQueryValueExW                   = modadvapi32.NewProc("RegQueryValueExW")
+       procGetCurrentProcessId                = modkernel32.NewProc("GetCurrentProcessId")
+       procGetConsoleMode                     = modkernel32.NewProc("GetConsoleMode")
+       procWriteConsoleW                      = modkernel32.NewProc("WriteConsoleW")
+       procReadConsoleW                       = modkernel32.NewProc("ReadConsoleW")
+       procCreateToolhelp32Snapshot           = modkernel32.NewProc("CreateToolhelp32Snapshot")
+       procProcess32FirstW                    = modkernel32.NewProc("Process32FirstW")
+       procProcess32NextW                     = modkernel32.NewProc("Process32NextW")
+       procDeviceIoControl                    = modkernel32.NewProc("DeviceIoControl")
+       procCreateSymbolicLinkW                = modkernel32.NewProc("CreateSymbolicLinkW")
+       procCreateHardLinkW                    = modkernel32.NewProc("CreateHardLinkW")
+       procGetCurrentThreadId                 = modkernel32.NewProc("GetCurrentThreadId")
+       procCreateEventW                       = modkernel32.NewProc("CreateEventW")
+       procSetEvent                           = modkernel32.NewProc("SetEvent")
+       procWSAStartup                         = modws2_32.NewProc("WSAStartup")
+       procWSACleanup                         = modws2_32.NewProc("WSACleanup")
+       procWSAIoctl                           = modws2_32.NewProc("WSAIoctl")
+       procsocket                             = modws2_32.NewProc("socket")
+       procsetsockopt                         = modws2_32.NewProc("setsockopt")
+       procgetsockopt                         = modws2_32.NewProc("getsockopt")
+       procbind                               = modws2_32.NewProc("bind")
+       procconnect                            = modws2_32.NewProc("connect")
+       procgetsockname                        = modws2_32.NewProc("getsockname")
+       procgetpeername                        = modws2_32.NewProc("getpeername")
+       proclisten                             = modws2_32.NewProc("listen")
+       procshutdown                           = modws2_32.NewProc("shutdown")
+       procclosesocket                        = modws2_32.NewProc("closesocket")
+       procAcceptEx                           = modmswsock.NewProc("AcceptEx")
+       procGetAcceptExSockaddrs               = modmswsock.NewProc("GetAcceptExSockaddrs")
+       procWSARecv                            = modws2_32.NewProc("WSARecv")
+       procWSASend                            = modws2_32.NewProc("WSASend")
+       procWSARecvFrom                        = modws2_32.NewProc("WSARecvFrom")
+       procWSASendTo                          = modws2_32.NewProc("WSASendTo")
+       procgethostbyname                      = modws2_32.NewProc("gethostbyname")
+       procgetservbyname                      = modws2_32.NewProc("getservbyname")
+       procntohs                              = modws2_32.NewProc("ntohs")
+       procgetprotobyname                     = modws2_32.NewProc("getprotobyname")
+       procDnsQuery_W                         = moddnsapi.NewProc("DnsQuery_W")
+       procDnsRecordListFree                  = moddnsapi.NewProc("DnsRecordListFree")
+       procDnsNameCompare_W                   = moddnsapi.NewProc("DnsNameCompare_W")
+       procGetAddrInfoW                       = modws2_32.NewProc("GetAddrInfoW")
+       procFreeAddrInfoW                      = modws2_32.NewProc("FreeAddrInfoW")
+       procGetIfEntry                         = modiphlpapi.NewProc("GetIfEntry")
+       procGetAdaptersInfo                    = modiphlpapi.NewProc("GetAdaptersInfo")
+       procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes")
+       procWSAEnumProtocolsW                  = modws2_32.NewProc("WSAEnumProtocolsW")
+       procGetAdaptersAddresses               = modiphlpapi.NewProc("GetAdaptersAddresses")
+       procGetACP                             = modkernel32.NewProc("GetACP")
+       procMultiByteToWideChar                = modkernel32.NewProc("MultiByteToWideChar")
+       procTranslateNameW                     = modsecur32.NewProc("TranslateNameW")
+       procGetUserNameExW                     = modsecur32.NewProc("GetUserNameExW")
+       procNetUserGetInfo                     = modnetapi32.NewProc("NetUserGetInfo")
+       procNetGetJoinInformation              = modnetapi32.NewProc("NetGetJoinInformation")
+       procNetApiBufferFree                   = modnetapi32.NewProc("NetApiBufferFree")
+       procLookupAccountSidW                  = modadvapi32.NewProc("LookupAccountSidW")
+       procLookupAccountNameW                 = modadvapi32.NewProc("LookupAccountNameW")
+       procConvertSidToStringSidW             = modadvapi32.NewProc("ConvertSidToStringSidW")
+       procConvertStringSidToSidW             = modadvapi32.NewProc("ConvertStringSidToSidW")
+       procGetLengthSid                       = modadvapi32.NewProc("GetLengthSid")
+       procCopySid                            = modadvapi32.NewProc("CopySid")
+       procAllocateAndInitializeSid           = modadvapi32.NewProc("AllocateAndInitializeSid")
+       procFreeSid                            = modadvapi32.NewProc("FreeSid")
+       procEqualSid                           = modadvapi32.NewProc("EqualSid")
+       procOpenProcessToken                   = modadvapi32.NewProc("OpenProcessToken")
+       procGetTokenInformation                = modadvapi32.NewProc("GetTokenInformation")
+       procGetUserProfileDirectoryW           = moduserenv.NewProc("GetUserProfileDirectoryW")
+)
+
+func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procRegisterEventSourceW.Addr(), 2, uintptr(unsafe.Pointer(uncServerName)), uintptr(unsafe.Pointer(sourceName)), 0)
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func DeregisterEventSource(handle Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procDeregisterEventSource.Addr(), 1, uintptr(handle), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) {
+       r1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(access))
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CloseServiceHandle(handle Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procCloseServiceHandle.Addr(), 1, uintptr(handle), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall15(procCreateServiceW.Addr(), 13, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(unsafe.Pointer(displayName)), uintptr(access), uintptr(srvType), uintptr(startType), uintptr(errCtl), uintptr(unsafe.Pointer(pathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), 0, 0)
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procOpenServiceW.Addr(), 3, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(access))
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func DeleteService(service Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procDeleteService.Addr(), 1, uintptr(service), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procStartServiceW.Addr(), 3, uintptr(service), uintptr(numArgs), uintptr(unsafe.Pointer(argVectors)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) {
+       r1, _, e1 := syscall.Syscall(procQueryServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(status)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) {
+       r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) {
+       r1, _, e1 := syscall.Syscall(procStartServiceCtrlDispatcherW.Addr(), 1, uintptr(unsafe.Pointer(serviceTable)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(serviceStatus)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) {
+       r1, _, e1 := syscall.Syscall12(procChangeServiceConfigW.Addr(), 11, uintptr(service), uintptr(serviceType), uintptr(startType), uintptr(errorControl), uintptr(unsafe.Pointer(binaryPathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), uintptr(unsafe.Pointer(displayName)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procQueryServiceConfigW.Addr(), 4, uintptr(service), uintptr(unsafe.Pointer(serviceConfig)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) {
+       r1, _, e1 := syscall.Syscall(procChangeServiceConfig2W.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(info)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procQueryServiceConfig2W.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetLastError() (lasterr error) {
+       r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0)
+       if r0 != 0 {
+               lasterr = syscall.Errno(r0)
+       }
+       return
+}
+
+func LoadLibrary(libname string) (handle Handle, err error) {
+       var _p0 *uint16
+       _p0, err = syscall.UTF16PtrFromString(libname)
+       if err != nil {
+               return
+       }
+       return _LoadLibrary(_p0)
+}
+
+func _LoadLibrary(libname *uint16) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procLoadLibraryW.Addr(), 1, uintptr(unsafe.Pointer(libname)), 0, 0)
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) {
+       var _p0 *uint16
+       _p0, err = syscall.UTF16PtrFromString(libname)
+       if err != nil {
+               return
+       }
+       return _LoadLibraryEx(_p0, zero, flags)
+}
+
+func _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags))
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func FreeLibrary(handle Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetProcAddress(module Handle, procname string) (proc uintptr, err error) {
+       var _p0 *byte
+       _p0, err = syscall.BytePtrFromString(procname)
+       if err != nil {
+               return
+       }
+       return _GetProcAddress(module, _p0)
+}
+
+func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) {
+       r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procname)), 0)
+       proc = uintptr(r0)
+       if proc == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetVersion() (ver uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0)
+       ver = uint32(r0)
+       if ver == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) {
+       var _p0 *uint16
+       if len(buf) > 0 {
+               _p0 = &buf[0]
+       }
+       r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, uintptr(flags), uintptr(msgsrc), uintptr(msgid), uintptr(langid), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(args)), 0, 0)
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ExitProcess(exitcode uint32) {
+       syscall.Syscall(procExitProcess.Addr(), 1, uintptr(exitcode), 0, 0)
+       return
+}
+
+func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0)
+       handle = Handle(r0)
+       if handle == InvalidHandle {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) {
+       var _p0 *byte
+       if len(buf) > 0 {
+               _p0 = &buf[0]
+       }
+       r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) {
+       var _p0 *byte
+       if len(buf) > 0 {
+               _p0 = &buf[0]
+       }
+       r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) {
+       r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0)
+       newlowoffset = uint32(r0)
+       if newlowoffset == 0xffffffff {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CloseHandle(handle Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procCloseHandle.Addr(), 1, uintptr(handle), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetStdHandle(stdhandle int) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procGetStdHandle.Addr(), 1, uintptr(stdhandle), 0, 0)
+       handle = Handle(r0)
+       if handle == InvalidHandle {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0)
+       handle = Handle(r0)
+       if handle == InvalidHandle {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func findNextFile1(handle Handle, data *win32finddata1) (err error) {
+       r1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func FindClose(handle Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetCurrentDirectoryW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetCurrentDirectory(path *uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) {
+       r1, _, e1 := syscall.Syscall(procCreateDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func RemoveDirectory(path *uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procRemoveDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func DeleteFile(path *uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procDeleteFileW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func MoveFile(from *uint16, to *uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procMoveFileW.Addr(), 2, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetComputerName(buf *uint16, n *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nametype), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetEndOfFile(handle Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetEndOfFile.Addr(), 1, uintptr(handle), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetSystemTimeAsFileTime(time *Filetime) {
+       syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0)
+       return
+}
+
+func GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(tzi)), 0, 0)
+       rc = uint32(r0)
+       if rc == 0xffffffff {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0)
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CancelIo(s Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procCancelIo.Addr(), 1, uintptr(s), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CancelIoEx(s Handle, o *Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(s), uintptr(unsafe.Pointer(o)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) {
+       var _p0 uint32
+       if inheritHandles {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, uintptr(unsafe.Pointer(appName)), uintptr(unsafe.Pointer(commandLine)), uintptr(unsafe.Pointer(procSecurity)), uintptr(unsafe.Pointer(threadSecurity)), uintptr(_p0), uintptr(creationFlags), uintptr(unsafe.Pointer(env)), uintptr(unsafe.Pointer(currentDir)), uintptr(unsafe.Pointer(startupInfo)), uintptr(unsafe.Pointer(outProcInfo)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) {
+       var _p0 uint32
+       if inheritHandle {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid))
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func TerminateProcess(handle Handle, exitcode uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(exitcode)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetStartupInfo(startupInfo *StartupInfo) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetCurrentProcess() (pseudoHandle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0)
+       pseudoHandle = Handle(r0)
+       if pseudoHandle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) {
+       r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) {
+       var _p0 uint32
+       if bInheritHandle {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall9(procDuplicateHandle.Addr(), 7, uintptr(hSourceProcessHandle), uintptr(hSourceHandle), uintptr(hTargetProcessHandle), uintptr(unsafe.Pointer(lpTargetHandle)), uintptr(dwDesiredAccess), uintptr(_p0), uintptr(dwOptions), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procWaitForSingleObject.Addr(), 2, uintptr(handle), uintptr(waitMilliseconds), 0)
+       event = uint32(r0)
+       if event == 0xffffffff {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procCreatePipe.Addr(), 4, uintptr(unsafe.Pointer(readhandle)), uintptr(unsafe.Pointer(writehandle)), uintptr(unsafe.Pointer(sa)), uintptr(size), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetFileType(filehandle Handle) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0)
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procCryptAcquireContextW.Addr(), 5, uintptr(unsafe.Pointer(provhandle)), uintptr(unsafe.Pointer(container)), uintptr(unsafe.Pointer(provider)), uintptr(provtype), uintptr(flags), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CryptReleaseContext(provhandle Handle, flags uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procCryptReleaseContext.Addr(), 2, uintptr(provhandle), uintptr(flags), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) {
+       r1, _, e1 := syscall.Syscall(procCryptGenRandom.Addr(), 3, uintptr(provhandle), uintptr(buflen), uintptr(unsafe.Pointer(buf)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetEnvironmentStrings() (envs *uint16, err error) {
+       r0, _, e1 := syscall.Syscall(procGetEnvironmentStringsW.Addr(), 0, 0, 0, 0)
+       envs = (*uint16)(unsafe.Pointer(r0))
+       if envs == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func FreeEnvironmentStrings(envs *uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procFreeEnvironmentStringsW.Addr(), 1, uintptr(unsafe.Pointer(envs)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(size))
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetEnvironmentVariable(name *uint16, value *uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) {
+       r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetFileAttributes(name *uint16) (attrs uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetFileAttributesW.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)
+       attrs = uint32(r0)
+       if attrs == INVALID_FILE_ATTRIBUTES {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetFileAttributes(name *uint16, attrs uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetFileAttributesW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(level), uintptr(unsafe.Pointer(info)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetCommandLine() (cmd *uint16) {
+       r0, _, _ := syscall.Syscall(procGetCommandLineW.Addr(), 0, 0, 0, 0)
+       cmd = (*uint16)(unsafe.Pointer(r0))
+       return
+}
+
+func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) {
+       r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0)
+       argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0))
+       if argv == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func LocalFree(hmem Handle) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procLocalFree.Addr(), 1, uintptr(hmem), 0, 0)
+       handle = Handle(r0)
+       if handle != 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetHandleInformation.Addr(), 3, uintptr(handle), uintptr(mask), uintptr(flags))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func FlushFileBuffers(handle Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procFlushFileBuffers.Addr(), 1, uintptr(handle), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0)
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetLongPathNameW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(buf)), uintptr(buflen))
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetShortPathNameW.Addr(), 3, uintptr(unsafe.Pointer(longpath)), uintptr(unsafe.Pointer(shortpath)), uintptr(buflen))
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, uintptr(fhandle), uintptr(unsafe.Pointer(sa)), uintptr(prot), uintptr(maxSizeHigh), uintptr(maxSizeLow), uintptr(unsafe.Pointer(name)))
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) {
+       r0, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, uintptr(handle), uintptr(access), uintptr(offsetHigh), uintptr(offsetLow), uintptr(length), 0)
+       addr = uintptr(r0)
+       if addr == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func UnmapViewOfFile(addr uintptr) (err error) {
+       r1, _, e1 := syscall.Syscall(procUnmapViewOfFile.Addr(), 1, uintptr(addr), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func FlushViewOfFile(addr uintptr, length uintptr) (err error) {
+       r1, _, e1 := syscall.Syscall(procFlushViewOfFile.Addr(), 2, uintptr(addr), uintptr(length), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func VirtualLock(addr uintptr, length uintptr) (err error) {
+       r1, _, e1 := syscall.Syscall(procVirtualLock.Addr(), 2, uintptr(addr), uintptr(length), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func VirtualUnlock(addr uintptr, length uintptr) (err error) {
+       r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) {
+       r1, _, e1 := syscall.Syscall9(procTransmitFile.Addr(), 7, uintptr(s), uintptr(handle), uintptr(bytesToWrite), uintptr(bytsPerSend), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transmitFileBuf)), uintptr(flags), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) {
+       var _p0 uint32
+       if watchSubTree {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall9(procReadDirectoryChangesW.Addr(), 8, uintptr(handle), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(_p0), uintptr(mask), uintptr(unsafe.Pointer(retlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procCertOpenSystemStoreW.Addr(), 2, uintptr(hprov), uintptr(unsafe.Pointer(name)), 0)
+       store = Handle(r0)
+       if store == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0)
+       handle = Handle(r0)
+       if handle == InvalidHandle {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) {
+       r0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0)
+       context = (*CertContext)(unsafe.Pointer(r0))
+       if context == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) {
+       r1, _, e1 := syscall.Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertCloseStore(store Handle, flags uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procCertCloseStore.Addr(), 2, uintptr(store), uintptr(flags), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) {
+       r1, _, e1 := syscall.Syscall9(procCertGetCertificateChain.Addr(), 8, uintptr(engine), uintptr(unsafe.Pointer(leaf)), uintptr(unsafe.Pointer(time)), uintptr(additionalStore), uintptr(unsafe.Pointer(para)), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(chainCtx)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertFreeCertificateChain(ctx *CertChainContext) {
+       syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0)
+       return
+}
+
+func CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) {
+       r0, _, e1 := syscall.Syscall(procCertCreateCertificateContext.Addr(), 3, uintptr(certEncodingType), uintptr(unsafe.Pointer(certEncoded)), uintptr(encodedLen))
+       context = (*CertContext)(unsafe.Pointer(r0))
+       if context == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertFreeCertificateContext(ctx *CertContext) (err error) {
+       r1, _, e1 := syscall.Syscall(procCertFreeCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) {
+       r1, _, e1 := syscall.Syscall6(procCertVerifyCertificateChainPolicy.Addr(), 4, uintptr(policyOID), uintptr(unsafe.Pointer(chain)), uintptr(unsafe.Pointer(para)), uintptr(unsafe.Pointer(status)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) {
+       r0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0)
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func RegCloseKey(key Handle) (regerrno error) {
+       r0, _, _ := syscall.Syscall(procRegCloseKey.Addr(), 1, uintptr(key), 0, 0)
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) {
+       r0, _, _ := syscall.Syscall12(procRegQueryInfoKeyW.Addr(), 12, uintptr(key), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(subkeysLen)), uintptr(unsafe.Pointer(maxSubkeyLen)), uintptr(unsafe.Pointer(maxClassLen)), uintptr(unsafe.Pointer(valuesLen)), uintptr(unsafe.Pointer(maxValueNameLen)), uintptr(unsafe.Pointer(maxValueLen)), uintptr(unsafe.Pointer(saLen)), uintptr(unsafe.Pointer(lastWriteTime)))
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) {
+       r0, _, _ := syscall.Syscall9(procRegEnumKeyExW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(lastWriteTime)), 0)
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) {
+       r0, _, _ := syscall.Syscall6(procRegQueryValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)))
+       if r0 != 0 {
+               regerrno = syscall.Errno(r0)
+       }
+       return
+}
+
+func getCurrentProcessId() (pid uint32) {
+       r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0)
+       pid = uint32(r0)
+       return
+}
+
+func GetConsoleMode(console Handle, mode *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) {
+       r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) {
+       r1, _, e1 := syscall.Syscall6(procReadConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(toread), uintptr(unsafe.Pointer(read)), uintptr(unsafe.Pointer(inputControl)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processId), 0)
+       handle = Handle(r0)
+       if handle == InvalidHandle {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) {
+       r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) {
+       r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags))
+       if r1&0xff == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) {
+       r1, _, e1 := syscall.Syscall(procCreateHardLinkW.Addr(), 3, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(existingfilename)), uintptr(reserved))
+       if r1&0xff == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetCurrentThreadId() (id uint32) {
+       r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0)
+       id = uint32(r0)
+       return
+}
+
+func CreateEvent(eventAttrs *syscall.SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0)
+       handle = Handle(r0)
+       if handle == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetEvent(event Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetEvent.Addr(), 1, uintptr(event), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WSAStartup(verreq uint32, data *WSAData) (sockerr error) {
+       r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0)
+       if r0 != 0 {
+               sockerr = syscall.Errno(r0)
+       }
+       return
+}
+
+func WSACleanup() (err error) {
+       r1, _, e1 := syscall.Syscall(procWSACleanup.Addr(), 0, 0, 0, 0)
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) {
+       r1, _, e1 := syscall.Syscall9(procWSAIoctl.Addr(), 9, uintptr(s), uintptr(iocc), uintptr(unsafe.Pointer(inbuf)), uintptr(cbif), uintptr(unsafe.Pointer(outbuf)), uintptr(cbob), uintptr(unsafe.Pointer(cbbr)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine))
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func socket(af int32, typ int32, protocol int32) (handle Handle, err error) {
+       r0, _, e1 := syscall.Syscall(procsocket.Addr(), 3, uintptr(af), uintptr(typ), uintptr(protocol))
+       handle = Handle(r0)
+       if handle == InvalidHandle {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0)
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procgetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(unsafe.Pointer(optlen)), 0)
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func bind(s Handle, name unsafe.Pointer, namelen int32) (err error) {
+       r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func connect(s Handle, name unsafe.Pointer, namelen int32) (err error) {
+       r1, _, e1 := syscall.Syscall(procconnect.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) {
+       r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) {
+       r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func listen(s Handle, backlog int32) (err error) {
+       r1, _, e1 := syscall.Syscall(proclisten.Addr(), 2, uintptr(s), uintptr(backlog), 0)
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func shutdown(s Handle, how int32) (err error) {
+       r1, _, e1 := syscall.Syscall(procshutdown.Addr(), 2, uintptr(s), uintptr(how), 0)
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func Closesocket(s Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procclosesocket.Addr(), 1, uintptr(s), 0, 0)
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) {
+       syscall.Syscall9(procGetAcceptExSockaddrs.Addr(), 8, uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(lrsa)), uintptr(unsafe.Pointer(lrsalen)), uintptr(unsafe.Pointer(rrsa)), uintptr(unsafe.Pointer(rrsalen)), 0)
+       return
+}
+
+func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) {
+       r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) {
+       r1, _, e1 := syscall.Syscall9(procWSASend.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) {
+       r1, _, e1 := syscall.Syscall9(procWSARecvFrom.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) {
+       r1, _, e1 := syscall.Syscall9(procWSASendTo.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(to)), uintptr(tolen), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
+       if r1 == socket_error {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetHostByName(name string) (h *Hostent, err error) {
+       var _p0 *byte
+       _p0, err = syscall.BytePtrFromString(name)
+       if err != nil {
+               return
+       }
+       return _GetHostByName(_p0)
+}
+
+func _GetHostByName(name *byte) (h *Hostent, err error) {
+       r0, _, e1 := syscall.Syscall(procgethostbyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)
+       h = (*Hostent)(unsafe.Pointer(r0))
+       if h == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetServByName(name string, proto string) (s *Servent, err error) {
+       var _p0 *byte
+       _p0, err = syscall.BytePtrFromString(name)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = syscall.BytePtrFromString(proto)
+       if err != nil {
+               return
+       }
+       return _GetServByName(_p0, _p1)
+}
+
+func _GetServByName(name *byte, proto *byte) (s *Servent, err error) {
+       r0, _, e1 := syscall.Syscall(procgetservbyname.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(proto)), 0)
+       s = (*Servent)(unsafe.Pointer(r0))
+       if s == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func Ntohs(netshort uint16) (u uint16) {
+       r0, _, _ := syscall.Syscall(procntohs.Addr(), 1, uintptr(netshort), 0, 0)
+       u = uint16(r0)
+       return
+}
+
+func GetProtoByName(name string) (p *Protoent, err error) {
+       var _p0 *byte
+       _p0, err = syscall.BytePtrFromString(name)
+       if err != nil {
+               return
+       }
+       return _GetProtoByName(_p0)
+}
+
+func _GetProtoByName(name *byte) (p *Protoent, err error) {
+       r0, _, e1 := syscall.Syscall(procgetprotobyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)
+       p = (*Protoent)(unsafe.Pointer(r0))
+       if p == nil {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) {
+       var _p0 *uint16
+       _p0, status = syscall.UTF16PtrFromString(name)
+       if status != nil {
+               return
+       }
+       return _DnsQuery(_p0, qtype, options, extra, qrs, pr)
+}
+
+func _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) {
+       r0, _, _ := syscall.Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr)))
+       if r0 != 0 {
+               status = syscall.Errno(r0)
+       }
+       return
+}
+
+func DnsRecordListFree(rl *DNSRecord, freetype uint32) {
+       syscall.Syscall(procDnsRecordListFree.Addr(), 2, uintptr(unsafe.Pointer(rl)), uintptr(freetype), 0)
+       return
+}
+
+func DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) {
+       r0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0)
+       same = r0 != 0
+       return
+}
+
+func GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) {
+       r0, _, _ := syscall.Syscall6(procGetAddrInfoW.Addr(), 4, uintptr(unsafe.Pointer(nodename)), uintptr(unsafe.Pointer(servicename)), uintptr(unsafe.Pointer(hints)), uintptr(unsafe.Pointer(result)), 0, 0)
+       if r0 != 0 {
+               sockerr = syscall.Errno(r0)
+       }
+       return
+}
+
+func FreeAddrInfoW(addrinfo *AddrinfoW) {
+       syscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0)
+       return
+}
+
+func GetIfEntry(pIfRow *MibIfRow) (errcode error) {
+       r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0)
+       if r0 != 0 {
+               errcode = syscall.Errno(r0)
+       }
+       return
+}
+
+func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) {
+       r0, _, _ := syscall.Syscall(procGetAdaptersInfo.Addr(), 2, uintptr(unsafe.Pointer(ai)), uintptr(unsafe.Pointer(ol)), 0)
+       if r0 != 0 {
+               errcode = syscall.Errno(r0)
+       }
+       return
+}
+
+func SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(handle), uintptr(flags), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) {
+       r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength)))
+       n = int32(r0)
+       if n == -1 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) {
+       r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0)
+       if r0 != 0 {
+               errcode = syscall.Errno(r0)
+       }
+       return
+}
+
+func GetACP() (acp uint32) {
+       r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0)
+       acp = uint32(r0)
+       return
+}
+
+func MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) {
+       r0, _, e1 := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, uintptr(codePage), uintptr(dwFlags), uintptr(unsafe.Pointer(str)), uintptr(nstr), uintptr(unsafe.Pointer(wchar)), uintptr(nwchar))
+       nwrite = int32(r0)
+       if nwrite == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procTranslateNameW.Addr(), 5, uintptr(unsafe.Pointer(accName)), uintptr(accNameFormat), uintptr(desiredNameFormat), uintptr(unsafe.Pointer(translatedName)), uintptr(unsafe.Pointer(nSize)), 0)
+       if r1&0xff == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize)))
+       if r1&0xff == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) {
+       r0, _, _ := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), 0, 0)
+       if r0 != 0 {
+               neterr = syscall.Errno(r0)
+       }
+       return
+}
+
+func NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) {
+       r0, _, _ := syscall.Syscall(procNetGetJoinInformation.Addr(), 3, uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bufType)))
+       if r0 != 0 {
+               neterr = syscall.Errno(r0)
+       }
+       return
+}
+
+func NetApiBufferFree(buf *byte) (neterr error) {
+       r0, _, _ := syscall.Syscall(procNetApiBufferFree.Addr(), 1, uintptr(unsafe.Pointer(buf)), 0, 0)
+       if r0 != 0 {
+               neterr = syscall.Errno(r0)
+       }
+       return
+}
+
+func LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) {
+       r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(stringSid)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) {
+       r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(stringSid)), uintptr(unsafe.Pointer(sid)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetLengthSid(sid *SID) (len uint32) {
+       r0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0)
+       len = uint32(r0)
+       return
+}
+
+func CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) {
+       r1, _, e1 := syscall.Syscall(procCopySid.Addr(), 3, uintptr(destSidLen), uintptr(unsafe.Pointer(destSid)), uintptr(unsafe.Pointer(srcSid)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) {
+       r1, _, e1 := syscall.Syscall12(procAllocateAndInitializeSid.Addr(), 11, uintptr(unsafe.Pointer(identAuth)), uintptr(subAuth), uintptr(subAuth0), uintptr(subAuth1), uintptr(subAuth2), uintptr(subAuth3), uintptr(subAuth4), uintptr(subAuth5), uintptr(subAuth6), uintptr(subAuth7), uintptr(unsafe.Pointer(sid)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func FreeSid(sid *SID) (err error) {
+       r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0)
+       if r1 != 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) {
+       r0, _, _ := syscall.Syscall(procEqualSid.Addr(), 2, uintptr(unsafe.Pointer(sid1)), uintptr(unsafe.Pointer(sid2)), 0)
+       isEqual = r0 != 0
+       return
+}
+
+func OpenProcessToken(h Handle, access uint32, token *Token) (err error) {
+       r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetUserProfileDirectoryW.Addr(), 3, uintptr(t), uintptr(unsafe.Pointer(dir)), uintptr(unsafe.Pointer(dirLen)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = error(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
diff --git a/vendor/golang.org/x/sys/windows/ztypes_windows.go b/vendor/golang.org/x/sys/windows/ztypes_windows.go
new file mode 100644 (file)
index 0000000..1fe19d1
--- /dev/null
@@ -0,0 +1,1242 @@
+// Copyright 2011 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 windows
+
+import "syscall"
+
+const (
+       // Windows errors.
+       ERROR_FILE_NOT_FOUND         syscall.Errno = 2
+       ERROR_PATH_NOT_FOUND         syscall.Errno = 3
+       ERROR_ACCESS_DENIED          syscall.Errno = 5
+       ERROR_NO_MORE_FILES          syscall.Errno = 18
+       ERROR_HANDLE_EOF             syscall.Errno = 38
+       ERROR_NETNAME_DELETED        syscall.Errno = 64
+       ERROR_FILE_EXISTS            syscall.Errno = 80
+       ERROR_BROKEN_PIPE            syscall.Errno = 109
+       ERROR_BUFFER_OVERFLOW        syscall.Errno = 111
+       ERROR_INSUFFICIENT_BUFFER    syscall.Errno = 122
+       ERROR_MOD_NOT_FOUND          syscall.Errno = 126
+       ERROR_PROC_NOT_FOUND         syscall.Errno = 127
+       ERROR_ALREADY_EXISTS         syscall.Errno = 183
+       ERROR_ENVVAR_NOT_FOUND       syscall.Errno = 203
+       ERROR_MORE_DATA              syscall.Errno = 234
+       ERROR_OPERATION_ABORTED      syscall.Errno = 995
+       ERROR_IO_PENDING             syscall.Errno = 997
+       ERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066
+       ERROR_NOT_FOUND              syscall.Errno = 1168
+       ERROR_PRIVILEGE_NOT_HELD     syscall.Errno = 1314
+       WSAEACCES                    syscall.Errno = 10013
+       WSAECONNRESET                syscall.Errno = 10054
+)
+
+const (
+       // Invented values to support what package os expects.
+       O_RDONLY   = 0x00000
+       O_WRONLY   = 0x00001
+       O_RDWR     = 0x00002
+       O_CREAT    = 0x00040
+       O_EXCL     = 0x00080
+       O_NOCTTY   = 0x00100
+       O_TRUNC    = 0x00200
+       O_NONBLOCK = 0x00800
+       O_APPEND   = 0x00400
+       O_SYNC     = 0x01000
+       O_ASYNC    = 0x02000
+       O_CLOEXEC  = 0x80000
+)
+
+const (
+       // More invented values for signals
+       SIGHUP  = Signal(0x1)
+       SIGINT  = Signal(0x2)
+       SIGQUIT = Signal(0x3)
+       SIGILL  = Signal(0x4)
+       SIGTRAP = Signal(0x5)
+       SIGABRT = Signal(0x6)
+       SIGBUS  = Signal(0x7)
+       SIGFPE  = Signal(0x8)
+       SIGKILL = Signal(0x9)
+       SIGSEGV = Signal(0xb)
+       SIGPIPE = Signal(0xd)
+       SIGALRM = Signal(0xe)
+       SIGTERM = Signal(0xf)
+)
+
+var signals = [...]string{
+       1:  "hangup",
+       2:  "interrupt",
+       3:  "quit",
+       4:  "illegal instruction",
+       5:  "trace/breakpoint trap",
+       6:  "aborted",
+       7:  "bus error",
+       8:  "floating point exception",
+       9:  "killed",
+       10: "user defined signal 1",
+       11: "segmentation fault",
+       12: "user defined signal 2",
+       13: "broken pipe",
+       14: "alarm clock",
+       15: "terminated",
+}
+
+const (
+       GENERIC_READ    = 0x80000000
+       GENERIC_WRITE   = 0x40000000
+       GENERIC_EXECUTE = 0x20000000
+       GENERIC_ALL     = 0x10000000
+
+       FILE_LIST_DIRECTORY   = 0x00000001
+       FILE_APPEND_DATA      = 0x00000004
+       FILE_WRITE_ATTRIBUTES = 0x00000100
+
+       FILE_SHARE_READ              = 0x00000001
+       FILE_SHARE_WRITE             = 0x00000002
+       FILE_SHARE_DELETE            = 0x00000004
+       FILE_ATTRIBUTE_READONLY      = 0x00000001
+       FILE_ATTRIBUTE_HIDDEN        = 0x00000002
+       FILE_ATTRIBUTE_SYSTEM        = 0x00000004
+       FILE_ATTRIBUTE_DIRECTORY     = 0x00000010
+       FILE_ATTRIBUTE_ARCHIVE       = 0x00000020
+       FILE_ATTRIBUTE_NORMAL        = 0x00000080
+       FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
+
+       INVALID_FILE_ATTRIBUTES = 0xffffffff
+
+       CREATE_NEW        = 1
+       CREATE_ALWAYS     = 2
+       OPEN_EXISTING     = 3
+       OPEN_ALWAYS       = 4
+       TRUNCATE_EXISTING = 5
+
+       FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
+       FILE_FLAG_BACKUP_SEMANTICS   = 0x02000000
+       FILE_FLAG_OVERLAPPED         = 0x40000000
+
+       HANDLE_FLAG_INHERIT    = 0x00000001
+       STARTF_USESTDHANDLES   = 0x00000100
+       STARTF_USESHOWWINDOW   = 0x00000001
+       DUPLICATE_CLOSE_SOURCE = 0x00000001
+       DUPLICATE_SAME_ACCESS  = 0x00000002
+
+       STD_INPUT_HANDLE  = -10
+       STD_OUTPUT_HANDLE = -11
+       STD_ERROR_HANDLE  = -12
+
+       FILE_BEGIN   = 0
+       FILE_CURRENT = 1
+       FILE_END     = 2
+
+       LANG_ENGLISH       = 0x09
+       SUBLANG_ENGLISH_US = 0x01
+
+       FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
+       FORMAT_MESSAGE_IGNORE_INSERTS  = 512
+       FORMAT_MESSAGE_FROM_STRING     = 1024
+       FORMAT_MESSAGE_FROM_HMODULE    = 2048
+       FORMAT_MESSAGE_FROM_SYSTEM     = 4096
+       FORMAT_MESSAGE_ARGUMENT_ARRAY  = 8192
+       FORMAT_MESSAGE_MAX_WIDTH_MASK  = 255
+
+       MAX_PATH      = 260
+       MAX_LONG_PATH = 32768
+
+       MAX_COMPUTERNAME_LENGTH = 15
+
+       TIME_ZONE_ID_UNKNOWN  = 0
+       TIME_ZONE_ID_STANDARD = 1
+
+       TIME_ZONE_ID_DAYLIGHT = 2
+       IGNORE                = 0
+       INFINITE              = 0xffffffff
+
+       WAIT_TIMEOUT   = 258
+       WAIT_ABANDONED = 0x00000080
+       WAIT_OBJECT_0  = 0x00000000
+       WAIT_FAILED    = 0xFFFFFFFF
+
+       CREATE_NEW_PROCESS_GROUP   = 0x00000200
+       CREATE_UNICODE_ENVIRONMENT = 0x00000400
+
+       PROCESS_TERMINATE         = 1
+       PROCESS_QUERY_INFORMATION = 0x00000400
+       SYNCHRONIZE               = 0x00100000
+
+       PAGE_READONLY          = 0x02
+       PAGE_READWRITE         = 0x04
+       PAGE_WRITECOPY         = 0x08
+       PAGE_EXECUTE_READ      = 0x20
+       PAGE_EXECUTE_READWRITE = 0x40
+       PAGE_EXECUTE_WRITECOPY = 0x80
+
+       FILE_MAP_COPY    = 0x01
+       FILE_MAP_WRITE   = 0x02
+       FILE_MAP_READ    = 0x04
+       FILE_MAP_EXECUTE = 0x20
+
+       CTRL_C_EVENT     = 0
+       CTRL_BREAK_EVENT = 1
+
+       // Windows reserves errors >= 1<<29 for application use.
+       APPLICATION_ERROR = 1 << 29
+)
+
+const (
+       // flags for CreateToolhelp32Snapshot
+       TH32CS_SNAPHEAPLIST = 0x01
+       TH32CS_SNAPPROCESS  = 0x02
+       TH32CS_SNAPTHREAD   = 0x04
+       TH32CS_SNAPMODULE   = 0x08
+       TH32CS_SNAPMODULE32 = 0x10
+       TH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD
+       TH32CS_INHERIT      = 0x80000000
+)
+
+const (
+       // filters for ReadDirectoryChangesW
+       FILE_NOTIFY_CHANGE_FILE_NAME   = 0x001
+       FILE_NOTIFY_CHANGE_DIR_NAME    = 0x002
+       FILE_NOTIFY_CHANGE_ATTRIBUTES  = 0x004
+       FILE_NOTIFY_CHANGE_SIZE        = 0x008
+       FILE_NOTIFY_CHANGE_LAST_WRITE  = 0x010
+       FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020
+       FILE_NOTIFY_CHANGE_CREATION    = 0x040
+       FILE_NOTIFY_CHANGE_SECURITY    = 0x100
+)
+
+const (
+       // do not reorder
+       FILE_ACTION_ADDED = iota + 1
+       FILE_ACTION_REMOVED
+       FILE_ACTION_MODIFIED
+       FILE_ACTION_RENAMED_OLD_NAME
+       FILE_ACTION_RENAMED_NEW_NAME
+)
+
+const (
+       // wincrypt.h
+       PROV_RSA_FULL                    = 1
+       PROV_RSA_SIG                     = 2
+       PROV_DSS                         = 3
+       PROV_FORTEZZA                    = 4
+       PROV_MS_EXCHANGE                 = 5
+       PROV_SSL                         = 6
+       PROV_RSA_SCHANNEL                = 12
+       PROV_DSS_DH                      = 13
+       PROV_EC_ECDSA_SIG                = 14
+       PROV_EC_ECNRA_SIG                = 15
+       PROV_EC_ECDSA_FULL               = 16
+       PROV_EC_ECNRA_FULL               = 17
+       PROV_DH_SCHANNEL                 = 18
+       PROV_SPYRUS_LYNKS                = 20
+       PROV_RNG                         = 21
+       PROV_INTEL_SEC                   = 22
+       PROV_REPLACE_OWF                 = 23
+       PROV_RSA_AES                     = 24
+       CRYPT_VERIFYCONTEXT              = 0xF0000000
+       CRYPT_NEWKEYSET                  = 0x00000008
+       CRYPT_DELETEKEYSET               = 0x00000010
+       CRYPT_MACHINE_KEYSET             = 0x00000020
+       CRYPT_SILENT                     = 0x00000040
+       CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080
+
+       USAGE_MATCH_TYPE_AND = 0
+       USAGE_MATCH_TYPE_OR  = 1
+
+       X509_ASN_ENCODING   = 0x00000001
+       PKCS_7_ASN_ENCODING = 0x00010000
+
+       CERT_STORE_PROV_MEMORY = 2
+
+       CERT_STORE_ADD_ALWAYS = 4
+
+       CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004
+
+       CERT_TRUST_NO_ERROR                          = 0x00000000
+       CERT_TRUST_IS_NOT_TIME_VALID                 = 0x00000001
+       CERT_TRUST_IS_REVOKED                        = 0x00000004
+       CERT_TRUST_IS_NOT_SIGNATURE_VALID            = 0x00000008
+       CERT_TRUST_IS_NOT_VALID_FOR_USAGE            = 0x00000010
+       CERT_TRUST_IS_UNTRUSTED_ROOT                 = 0x00000020
+       CERT_TRUST_REVOCATION_STATUS_UNKNOWN         = 0x00000040
+       CERT_TRUST_IS_CYCLIC                         = 0x00000080
+       CERT_TRUST_INVALID_EXTENSION                 = 0x00000100
+       CERT_TRUST_INVALID_POLICY_CONSTRAINTS        = 0x00000200
+       CERT_TRUST_INVALID_BASIC_CONSTRAINTS         = 0x00000400
+       CERT_TRUST_INVALID_NAME_CONSTRAINTS          = 0x00000800
+       CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000
+       CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT   = 0x00002000
+       CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000
+       CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT      = 0x00008000
+       CERT_TRUST_IS_OFFLINE_REVOCATION             = 0x01000000
+       CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY          = 0x02000000
+       CERT_TRUST_IS_EXPLICIT_DISTRUST              = 0x04000000
+       CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT    = 0x08000000
+
+       CERT_CHAIN_POLICY_BASE              = 1
+       CERT_CHAIN_POLICY_AUTHENTICODE      = 2
+       CERT_CHAIN_POLICY_AUTHENTICODE_TS   = 3
+       CERT_CHAIN_POLICY_SSL               = 4
+       CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5
+       CERT_CHAIN_POLICY_NT_AUTH           = 6
+       CERT_CHAIN_POLICY_MICROSOFT_ROOT    = 7
+       CERT_CHAIN_POLICY_EV                = 8
+
+       CERT_E_EXPIRED       = 0x800B0101
+       CERT_E_ROLE          = 0x800B0103
+       CERT_E_PURPOSE       = 0x800B0106
+       CERT_E_UNTRUSTEDROOT = 0x800B0109
+       CERT_E_CN_NO_MATCH   = 0x800B010F
+
+       AUTHTYPE_CLIENT = 1
+       AUTHTYPE_SERVER = 2
+)
+
+var (
+       OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00")
+       OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00")
+       OID_SGC_NETSCAPE        = []byte("2.16.840.1.113730.4.1\x00")
+)
+
+// Invented values to support what package os expects.
+type Timeval struct {
+       Sec  int32
+       Usec int32
+}
+
+func (tv *Timeval) Nanoseconds() int64 {
+       return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3
+}
+
+func NsecToTimeval(nsec int64) (tv Timeval) {
+       tv.Sec = int32(nsec / 1e9)
+       tv.Usec = int32(nsec % 1e9 / 1e3)
+       return
+}
+
+type SecurityAttributes struct {
+       Length             uint32
+       SecurityDescriptor uintptr
+       InheritHandle      uint32
+}
+
+type Overlapped struct {
+       Internal     uintptr
+       InternalHigh uintptr
+       Offset       uint32
+       OffsetHigh   uint32
+       HEvent       Handle
+}
+
+type FileNotifyInformation struct {
+       NextEntryOffset uint32
+       Action          uint32
+       FileNameLength  uint32
+       FileName        uint16
+}
+
+type Filetime struct {
+       LowDateTime  uint32
+       HighDateTime uint32
+}
+
+// Nanoseconds returns Filetime ft in nanoseconds
+// since Epoch (00:00:00 UTC, January 1, 1970).
+func (ft *Filetime) Nanoseconds() int64 {
+       // 100-nanosecond intervals since January 1, 1601
+       nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime)
+       // change starting time to the Epoch (00:00:00 UTC, January 1, 1970)
+       nsec -= 116444736000000000
+       // convert into nanoseconds
+       nsec *= 100
+       return nsec
+}
+
+func NsecToFiletime(nsec int64) (ft Filetime) {
+       // convert into 100-nanosecond
+       nsec /= 100
+       // change starting time to January 1, 1601
+       nsec += 116444736000000000
+       // split into high / low
+       ft.LowDateTime = uint32(nsec & 0xffffffff)
+       ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff)
+       return ft
+}
+
+type Win32finddata struct {
+       FileAttributes    uint32
+       CreationTime      Filetime
+       LastAccessTime    Filetime
+       LastWriteTime     Filetime
+       FileSizeHigh      uint32
+       FileSizeLow       uint32
+       Reserved0         uint32
+       Reserved1         uint32
+       FileName          [MAX_PATH - 1]uint16
+       AlternateFileName [13]uint16
+}
+
+// This is the actual system call structure.
+// Win32finddata is what we committed to in Go 1.
+type win32finddata1 struct {
+       FileAttributes    uint32
+       CreationTime      Filetime
+       LastAccessTime    Filetime
+       LastWriteTime     Filetime
+       FileSizeHigh      uint32
+       FileSizeLow       uint32
+       Reserved0         uint32
+       Reserved1         uint32
+       FileName          [MAX_PATH]uint16
+       AlternateFileName [14]uint16
+}
+
+func copyFindData(dst *Win32finddata, src *win32finddata1) {
+       dst.FileAttributes = src.FileAttributes
+       dst.CreationTime = src.CreationTime
+       dst.LastAccessTime = src.LastAccessTime
+       dst.LastWriteTime = src.LastWriteTime
+       dst.FileSizeHigh = src.FileSizeHigh
+       dst.FileSizeLow = src.FileSizeLow
+       dst.Reserved0 = src.Reserved0
+       dst.Reserved1 = src.Reserved1
+
+       // The src is 1 element bigger than dst, but it must be NUL.
+       copy(dst.FileName[:], src.FileName[:])
+       copy(dst.AlternateFileName[:], src.AlternateFileName[:])
+}
+
+type ByHandleFileInformation struct {
+       FileAttributes     uint32
+       CreationTime       Filetime
+       LastAccessTime     Filetime
+       LastWriteTime      Filetime
+       VolumeSerialNumber uint32
+       FileSizeHigh       uint32
+       FileSizeLow        uint32
+       NumberOfLinks      uint32
+       FileIndexHigh      uint32
+       FileIndexLow       uint32
+}
+
+const (
+       GetFileExInfoStandard = 0
+       GetFileExMaxInfoLevel = 1
+)
+
+type Win32FileAttributeData struct {
+       FileAttributes uint32
+       CreationTime   Filetime
+       LastAccessTime Filetime
+       LastWriteTime  Filetime
+       FileSizeHigh   uint32
+       FileSizeLow    uint32
+}
+
+// ShowWindow constants
+const (
+       // winuser.h
+       SW_HIDE            = 0
+       SW_NORMAL          = 1
+       SW_SHOWNORMAL      = 1
+       SW_SHOWMINIMIZED   = 2
+       SW_SHOWMAXIMIZED   = 3
+       SW_MAXIMIZE        = 3
+       SW_SHOWNOACTIVATE  = 4
+       SW_SHOW            = 5
+       SW_MINIMIZE        = 6
+       SW_SHOWMINNOACTIVE = 7
+       SW_SHOWNA          = 8
+       SW_RESTORE         = 9
+       SW_SHOWDEFAULT     = 10
+       SW_FORCEMINIMIZE   = 11
+)
+
+type StartupInfo struct {
+       Cb            uint32
+       _             *uint16
+       Desktop       *uint16
+       Title         *uint16
+       X             uint32
+       Y             uint32
+       XSize         uint32
+       YSize         uint32
+       XCountChars   uint32
+       YCountChars   uint32
+       FillAttribute uint32
+       Flags         uint32
+       ShowWindow    uint16
+       _             uint16
+       _             *byte
+       StdInput      Handle
+       StdOutput     Handle
+       StdErr        Handle
+}
+
+type ProcessInformation struct {
+       Process   Handle
+       Thread    Handle
+       ProcessId uint32
+       ThreadId  uint32
+}
+
+type ProcessEntry32 struct {
+       Size            uint32
+       Usage           uint32
+       ProcessID       uint32
+       DefaultHeapID   uintptr
+       ModuleID        uint32
+       Threads         uint32
+       ParentProcessID uint32
+       PriClassBase    int32
+       Flags           uint32
+       ExeFile         [MAX_PATH]uint16
+}
+
+type Systemtime struct {
+       Year         uint16
+       Month        uint16
+       DayOfWeek    uint16
+       Day          uint16
+       Hour         uint16
+       Minute       uint16
+       Second       uint16
+       Milliseconds uint16
+}
+
+type Timezoneinformation struct {
+       Bias         int32
+       StandardName [32]uint16
+       StandardDate Systemtime
+       StandardBias int32
+       DaylightName [32]uint16
+       DaylightDate Systemtime
+       DaylightBias int32
+}
+
+// Socket related.
+
+const (
+       AF_UNSPEC  = 0
+       AF_UNIX    = 1
+       AF_INET    = 2
+       AF_INET6   = 23
+       AF_NETBIOS = 17
+
+       SOCK_STREAM    = 1
+       SOCK_DGRAM     = 2
+       SOCK_RAW       = 3
+       SOCK_SEQPACKET = 5
+
+       IPPROTO_IP   = 0
+       IPPROTO_IPV6 = 0x29
+       IPPROTO_TCP  = 6
+       IPPROTO_UDP  = 17
+
+       SOL_SOCKET                = 0xffff
+       SO_REUSEADDR              = 4
+       SO_KEEPALIVE              = 8
+       SO_DONTROUTE              = 16
+       SO_BROADCAST              = 32
+       SO_LINGER                 = 128
+       SO_RCVBUF                 = 0x1002
+       SO_SNDBUF                 = 0x1001
+       SO_UPDATE_ACCEPT_CONTEXT  = 0x700b
+       SO_UPDATE_CONNECT_CONTEXT = 0x7010
+
+       IOC_OUT                            = 0x40000000
+       IOC_IN                             = 0x80000000
+       IOC_VENDOR                         = 0x18000000
+       IOC_INOUT                          = IOC_IN | IOC_OUT
+       IOC_WS2                            = 0x08000000
+       SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6
+       SIO_KEEPALIVE_VALS                 = IOC_IN | IOC_VENDOR | 4
+       SIO_UDP_CONNRESET                  = IOC_IN | IOC_VENDOR | 12
+
+       // cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460
+
+       IP_TOS             = 0x3
+       IP_TTL             = 0x4
+       IP_MULTICAST_IF    = 0x9
+       IP_MULTICAST_TTL   = 0xa
+       IP_MULTICAST_LOOP  = 0xb
+       IP_ADD_MEMBERSHIP  = 0xc
+       IP_DROP_MEMBERSHIP = 0xd
+
+       IPV6_V6ONLY         = 0x1b
+       IPV6_UNICAST_HOPS   = 0x4
+       IPV6_MULTICAST_IF   = 0x9
+       IPV6_MULTICAST_HOPS = 0xa
+       IPV6_MULTICAST_LOOP = 0xb
+       IPV6_JOIN_GROUP     = 0xc
+       IPV6_LEAVE_GROUP    = 0xd
+
+       SOMAXCONN = 0x7fffffff
+
+       TCP_NODELAY = 1
+
+       SHUT_RD   = 0
+       SHUT_WR   = 1
+       SHUT_RDWR = 2
+
+       WSADESCRIPTION_LEN = 256
+       WSASYS_STATUS_LEN  = 128
+)
+
+type WSABuf struct {
+       Len uint32
+       Buf *byte
+}
+
+// Invented values to support what package os expects.
+const (
+       S_IFMT   = 0x1f000
+       S_IFIFO  = 0x1000
+       S_IFCHR  = 0x2000
+       S_IFDIR  = 0x4000
+       S_IFBLK  = 0x6000
+       S_IFREG  = 0x8000
+       S_IFLNK  = 0xa000
+       S_IFSOCK = 0xc000
+       S_ISUID  = 0x800
+       S_ISGID  = 0x400
+       S_ISVTX  = 0x200
+       S_IRUSR  = 0x100
+       S_IWRITE = 0x80
+       S_IWUSR  = 0x80
+       S_IXUSR  = 0x40
+)
+
+const (
+       FILE_TYPE_CHAR    = 0x0002
+       FILE_TYPE_DISK    = 0x0001
+       FILE_TYPE_PIPE    = 0x0003
+       FILE_TYPE_REMOTE  = 0x8000
+       FILE_TYPE_UNKNOWN = 0x0000
+)
+
+type Hostent struct {
+       Name     *byte
+       Aliases  **byte
+       AddrType uint16
+       Length   uint16
+       AddrList **byte
+}
+
+type Protoent struct {
+       Name    *byte
+       Aliases **byte
+       Proto   uint16
+}
+
+const (
+       DNS_TYPE_A       = 0x0001
+       DNS_TYPE_NS      = 0x0002
+       DNS_TYPE_MD      = 0x0003
+       DNS_TYPE_MF      = 0x0004
+       DNS_TYPE_CNAME   = 0x0005
+       DNS_TYPE_SOA     = 0x0006
+       DNS_TYPE_MB      = 0x0007
+       DNS_TYPE_MG      = 0x0008
+       DNS_TYPE_MR      = 0x0009
+       DNS_TYPE_NULL    = 0x000a
+       DNS_TYPE_WKS     = 0x000b
+       DNS_TYPE_PTR     = 0x000c
+       DNS_TYPE_HINFO   = 0x000d
+       DNS_TYPE_MINFO   = 0x000e
+       DNS_TYPE_MX      = 0x000f
+       DNS_TYPE_TEXT    = 0x0010
+       DNS_TYPE_RP      = 0x0011
+       DNS_TYPE_AFSDB   = 0x0012
+       DNS_TYPE_X25     = 0x0013
+       DNS_TYPE_ISDN    = 0x0014
+       DNS_TYPE_RT      = 0x0015
+       DNS_TYPE_NSAP    = 0x0016
+       DNS_TYPE_NSAPPTR = 0x0017
+       DNS_TYPE_SIG     = 0x0018
+       DNS_TYPE_KEY     = 0x0019
+       DNS_TYPE_PX      = 0x001a
+       DNS_TYPE_GPOS    = 0x001b
+       DNS_TYPE_AAAA    = 0x001c
+       DNS_TYPE_LOC     = 0x001d
+       DNS_TYPE_NXT     = 0x001e
+       DNS_TYPE_EID     = 0x001f
+       DNS_TYPE_NIMLOC  = 0x0020
+       DNS_TYPE_SRV     = 0x0021
+       DNS_TYPE_ATMA    = 0x0022
+       DNS_TYPE_NAPTR   = 0x0023
+       DNS_TYPE_KX      = 0x0024
+       DNS_TYPE_CERT    = 0x0025
+       DNS_TYPE_A6      = 0x0026
+       DNS_TYPE_DNAME   = 0x0027
+       DNS_TYPE_SINK    = 0x0028
+       DNS_TYPE_OPT     = 0x0029
+       DNS_TYPE_DS      = 0x002B
+       DNS_TYPE_RRSIG   = 0x002E
+       DNS_TYPE_NSEC    = 0x002F
+       DNS_TYPE_DNSKEY  = 0x0030
+       DNS_TYPE_DHCID   = 0x0031
+       DNS_TYPE_UINFO   = 0x0064
+       DNS_TYPE_UID     = 0x0065
+       DNS_TYPE_GID     = 0x0066
+       DNS_TYPE_UNSPEC  = 0x0067
+       DNS_TYPE_ADDRS   = 0x00f8
+       DNS_TYPE_TKEY    = 0x00f9
+       DNS_TYPE_TSIG    = 0x00fa
+       DNS_TYPE_IXFR    = 0x00fb
+       DNS_TYPE_AXFR    = 0x00fc
+       DNS_TYPE_MAILB   = 0x00fd
+       DNS_TYPE_MAILA   = 0x00fe
+       DNS_TYPE_ALL     = 0x00ff
+       DNS_TYPE_ANY     = 0x00ff
+       DNS_TYPE_WINS    = 0xff01
+       DNS_TYPE_WINSR   = 0xff02
+       DNS_TYPE_NBSTAT  = 0xff01
+)
+
+const (
+       DNS_INFO_NO_RECORDS = 0x251D
+)
+
+const (
+       // flags inside DNSRecord.Dw
+       DnsSectionQuestion   = 0x0000
+       DnsSectionAnswer     = 0x0001
+       DnsSectionAuthority  = 0x0002
+       DnsSectionAdditional = 0x0003
+)
+
+type DNSSRVData struct {
+       Target   *uint16
+       Priority uint16
+       Weight   uint16
+       Port     uint16
+       Pad      uint16
+}
+
+type DNSPTRData struct {
+       Host *uint16
+}
+
+type DNSMXData struct {
+       NameExchange *uint16
+       Preference   uint16
+       Pad          uint16
+}
+
+type DNSTXTData struct {
+       StringCount uint16
+       StringArray [1]*uint16
+}
+
+type DNSRecord struct {
+       Next     *DNSRecord
+       Name     *uint16
+       Type     uint16
+       Length   uint16
+       Dw       uint32
+       Ttl      uint32
+       Reserved uint32
+       Data     [40]byte
+}
+
+const (
+       TF_DISCONNECT         = 1
+       TF_REUSE_SOCKET       = 2
+       TF_WRITE_BEHIND       = 4
+       TF_USE_DEFAULT_WORKER = 0
+       TF_USE_SYSTEM_THREAD  = 16
+       TF_USE_KERNEL_APC     = 32
+)
+
+type TransmitFileBuffers struct {
+       Head       uintptr
+       HeadLength uint32
+       Tail       uintptr
+       TailLength uint32
+}
+
+const (
+       IFF_UP           = 1
+       IFF_BROADCAST    = 2
+       IFF_LOOPBACK     = 4
+       IFF_POINTTOPOINT = 8
+       IFF_MULTICAST    = 16
+)
+
+const SIO_GET_INTERFACE_LIST = 0x4004747F
+
+// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old.
+// will be fixed to change variable type as suitable.
+
+type SockaddrGen [24]byte
+
+type InterfaceInfo struct {
+       Flags            uint32
+       Address          SockaddrGen
+       BroadcastAddress SockaddrGen
+       Netmask          SockaddrGen
+}
+
+type IpAddressString struct {
+       String [16]byte
+}
+
+type IpMaskString IpAddressString
+
+type IpAddrString struct {
+       Next      *IpAddrString
+       IpAddress IpAddressString
+       IpMask    IpMaskString
+       Context   uint32
+}
+
+const MAX_ADAPTER_NAME_LENGTH = 256
+const MAX_ADAPTER_DESCRIPTION_LENGTH = 128
+const MAX_ADAPTER_ADDRESS_LENGTH = 8
+
+type IpAdapterInfo struct {
+       Next                *IpAdapterInfo
+       ComboIndex          uint32
+       AdapterName         [MAX_ADAPTER_NAME_LENGTH + 4]byte
+       Description         [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte
+       AddressLength       uint32
+       Address             [MAX_ADAPTER_ADDRESS_LENGTH]byte
+       Index               uint32
+       Type                uint32
+       DhcpEnabled         uint32
+       CurrentIpAddress    *IpAddrString
+       IpAddressList       IpAddrString
+       GatewayList         IpAddrString
+       DhcpServer          IpAddrString
+       HaveWins            bool
+       PrimaryWinsServer   IpAddrString
+       SecondaryWinsServer IpAddrString
+       LeaseObtained       int64
+       LeaseExpires        int64
+}
+
+const MAXLEN_PHYSADDR = 8
+const MAX_INTERFACE_NAME_LEN = 256
+const MAXLEN_IFDESCR = 256
+
+type MibIfRow struct {
+       Name            [MAX_INTERFACE_NAME_LEN]uint16
+       Index           uint32
+       Type            uint32
+       Mtu             uint32
+       Speed           uint32
+       PhysAddrLen     uint32
+       PhysAddr        [MAXLEN_PHYSADDR]byte
+       AdminStatus     uint32
+       OperStatus      uint32
+       LastChange      uint32
+       InOctets        uint32
+       InUcastPkts     uint32
+       InNUcastPkts    uint32
+       InDiscards      uint32
+       InErrors        uint32
+       InUnknownProtos uint32
+       OutOctets       uint32
+       OutUcastPkts    uint32
+       OutNUcastPkts   uint32
+       OutDiscards     uint32
+       OutErrors       uint32
+       OutQLen         uint32
+       DescrLen        uint32
+       Descr           [MAXLEN_IFDESCR]byte
+}
+
+type CertContext struct {
+       EncodingType uint32
+       EncodedCert  *byte
+       Length       uint32
+       CertInfo     uintptr
+       Store        Handle
+}
+
+type CertChainContext struct {
+       Size                       uint32
+       TrustStatus                CertTrustStatus
+       ChainCount                 uint32
+       Chains                     **CertSimpleChain
+       LowerQualityChainCount     uint32
+       LowerQualityChains         **CertChainContext
+       HasRevocationFreshnessTime uint32
+       RevocationFreshnessTime    uint32
+}
+
+type CertSimpleChain struct {
+       Size                       uint32
+       TrustStatus                CertTrustStatus
+       NumElements                uint32
+       Elements                   **CertChainElement
+       TrustListInfo              uintptr
+       HasRevocationFreshnessTime uint32
+       RevocationFreshnessTime    uint32
+}
+
+type CertChainElement struct {
+       Size              uint32
+       CertContext       *CertContext
+       TrustStatus       CertTrustStatus
+       RevocationInfo    *CertRevocationInfo
+       IssuanceUsage     *CertEnhKeyUsage
+       ApplicationUsage  *CertEnhKeyUsage
+       ExtendedErrorInfo *uint16
+}
+
+type CertRevocationInfo struct {
+       Size             uint32
+       RevocationResult uint32
+       RevocationOid    *byte
+       OidSpecificInfo  uintptr
+       HasFreshnessTime uint32
+       FreshnessTime    uint32
+       CrlInfo          uintptr // *CertRevocationCrlInfo
+}
+
+type CertTrustStatus struct {
+       ErrorStatus uint32
+       InfoStatus  uint32
+}
+
+type CertUsageMatch struct {
+       Type  uint32
+       Usage CertEnhKeyUsage
+}
+
+type CertEnhKeyUsage struct {
+       Length           uint32
+       UsageIdentifiers **byte
+}
+
+type CertChainPara struct {
+       Size                         uint32
+       RequestedUsage               CertUsageMatch
+       RequstedIssuancePolicy       CertUsageMatch
+       URLRetrievalTimeout          uint32
+       CheckRevocationFreshnessTime uint32
+       RevocationFreshnessTime      uint32
+       CacheResync                  *Filetime
+}
+
+type CertChainPolicyPara struct {
+       Size            uint32
+       Flags           uint32
+       ExtraPolicyPara uintptr
+}
+
+type SSLExtraCertChainPolicyPara struct {
+       Size       uint32
+       AuthType   uint32
+       Checks     uint32
+       ServerName *uint16
+}
+
+type CertChainPolicyStatus struct {
+       Size              uint32
+       Error             uint32
+       ChainIndex        uint32
+       ElementIndex      uint32
+       ExtraPolicyStatus uintptr
+}
+
+const (
+       // do not reorder
+       HKEY_CLASSES_ROOT = 0x80000000 + iota
+       HKEY_CURRENT_USER
+       HKEY_LOCAL_MACHINE
+       HKEY_USERS
+       HKEY_PERFORMANCE_DATA
+       HKEY_CURRENT_CONFIG
+       HKEY_DYN_DATA
+
+       KEY_QUERY_VALUE        = 1
+       KEY_SET_VALUE          = 2
+       KEY_CREATE_SUB_KEY     = 4
+       KEY_ENUMERATE_SUB_KEYS = 8
+       KEY_NOTIFY             = 16
+       KEY_CREATE_LINK        = 32
+       KEY_WRITE              = 0x20006
+       KEY_EXECUTE            = 0x20019
+       KEY_READ               = 0x20019
+       KEY_WOW64_64KEY        = 0x0100
+       KEY_WOW64_32KEY        = 0x0200
+       KEY_ALL_ACCESS         = 0xf003f
+)
+
+const (
+       // do not reorder
+       REG_NONE = iota
+       REG_SZ
+       REG_EXPAND_SZ
+       REG_BINARY
+       REG_DWORD_LITTLE_ENDIAN
+       REG_DWORD_BIG_ENDIAN
+       REG_LINK
+       REG_MULTI_SZ
+       REG_RESOURCE_LIST
+       REG_FULL_RESOURCE_DESCRIPTOR
+       REG_RESOURCE_REQUIREMENTS_LIST
+       REG_QWORD_LITTLE_ENDIAN
+       REG_DWORD = REG_DWORD_LITTLE_ENDIAN
+       REG_QWORD = REG_QWORD_LITTLE_ENDIAN
+)
+
+type AddrinfoW struct {
+       Flags     int32
+       Family    int32
+       Socktype  int32
+       Protocol  int32
+       Addrlen   uintptr
+       Canonname *uint16
+       Addr      uintptr
+       Next      *AddrinfoW
+}
+
+const (
+       AI_PASSIVE     = 1
+       AI_CANONNAME   = 2
+       AI_NUMERICHOST = 4
+)
+
+type GUID struct {
+       Data1 uint32
+       Data2 uint16
+       Data3 uint16
+       Data4 [8]byte
+}
+
+var WSAID_CONNECTEX = GUID{
+       0x25a207b9,
+       0xddf3,
+       0x4660,
+       [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
+}
+
+const (
+       FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
+       FILE_SKIP_SET_EVENT_ON_HANDLE        = 2
+)
+
+const (
+       WSAPROTOCOL_LEN    = 255
+       MAX_PROTOCOL_CHAIN = 7
+       BASE_PROTOCOL      = 1
+       LAYERED_PROTOCOL   = 0
+
+       XP1_CONNECTIONLESS           = 0x00000001
+       XP1_GUARANTEED_DELIVERY      = 0x00000002
+       XP1_GUARANTEED_ORDER         = 0x00000004
+       XP1_MESSAGE_ORIENTED         = 0x00000008
+       XP1_PSEUDO_STREAM            = 0x00000010
+       XP1_GRACEFUL_CLOSE           = 0x00000020
+       XP1_EXPEDITED_DATA           = 0x00000040
+       XP1_CONNECT_DATA             = 0x00000080
+       XP1_DISCONNECT_DATA          = 0x00000100
+       XP1_SUPPORT_BROADCAST        = 0x00000200
+       XP1_SUPPORT_MULTIPOINT       = 0x00000400
+       XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800
+       XP1_MULTIPOINT_DATA_PLANE    = 0x00001000
+       XP1_QOS_SUPPORTED            = 0x00002000
+       XP1_UNI_SEND                 = 0x00008000
+       XP1_UNI_RECV                 = 0x00010000
+       XP1_IFS_HANDLES              = 0x00020000
+       XP1_PARTIAL_MESSAGE          = 0x00040000
+       XP1_SAN_SUPPORT_SDP          = 0x00080000
+
+       PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001
+       PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002
+       PFL_HIDDEN                  = 0x00000004
+       PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008
+       PFL_NETWORKDIRECT_PROVIDER  = 0x00000010
+)
+
+type WSAProtocolInfo struct {
+       ServiceFlags1     uint32
+       ServiceFlags2     uint32
+       ServiceFlags3     uint32
+       ServiceFlags4     uint32
+       ProviderFlags     uint32
+       ProviderId        GUID
+       CatalogEntryId    uint32
+       ProtocolChain     WSAProtocolChain
+       Version           int32
+       AddressFamily     int32
+       MaxSockAddr       int32
+       MinSockAddr       int32
+       SocketType        int32
+       Protocol          int32
+       ProtocolMaxOffset int32
+       NetworkByteOrder  int32
+       SecurityScheme    int32
+       MessageSize       uint32
+       ProviderReserved  uint32
+       ProtocolName      [WSAPROTOCOL_LEN + 1]uint16
+}
+
+type WSAProtocolChain struct {
+       ChainLen     int32
+       ChainEntries [MAX_PROTOCOL_CHAIN]uint32
+}
+
+type TCPKeepalive struct {
+       OnOff    uint32
+       Time     uint32
+       Interval uint32
+}
+
+type symbolicLinkReparseBuffer struct {
+       SubstituteNameOffset uint16
+       SubstituteNameLength uint16
+       PrintNameOffset      uint16
+       PrintNameLength      uint16
+       Flags                uint32
+       PathBuffer           [1]uint16
+}
+
+type mountPointReparseBuffer struct {
+       SubstituteNameOffset uint16
+       SubstituteNameLength uint16
+       PrintNameOffset      uint16
+       PrintNameLength      uint16
+       PathBuffer           [1]uint16
+}
+
+type reparseDataBuffer struct {
+       ReparseTag        uint32
+       ReparseDataLength uint16
+       Reserved          uint16
+
+       // GenericReparseBuffer
+       reparseBuffer byte
+}
+
+const (
+       FSCTL_GET_REPARSE_POINT          = 0x900A8
+       MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024
+       IO_REPARSE_TAG_MOUNT_POINT       = 0xA0000003
+       IO_REPARSE_TAG_SYMLINK           = 0xA000000C
+       SYMBOLIC_LINK_FLAG_DIRECTORY     = 0x1
+)
+
+const (
+       ComputerNameNetBIOS                   = 0
+       ComputerNameDnsHostname               = 1
+       ComputerNameDnsDomain                 = 2
+       ComputerNameDnsFullyQualified         = 3
+       ComputerNamePhysicalNetBIOS           = 4
+       ComputerNamePhysicalDnsHostname       = 5
+       ComputerNamePhysicalDnsDomain         = 6
+       ComputerNamePhysicalDnsFullyQualified = 7
+       ComputerNameMax                       = 8
+)
+
+const (
+       MOVEFILE_REPLACE_EXISTING      = 0x1
+       MOVEFILE_COPY_ALLOWED          = 0x2
+       MOVEFILE_DELAY_UNTIL_REBOOT    = 0x4
+       MOVEFILE_WRITE_THROUGH         = 0x8
+       MOVEFILE_CREATE_HARDLINK       = 0x10
+       MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
+)
+
+const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
+
+const (
+       IF_TYPE_OTHER              = 1
+       IF_TYPE_ETHERNET_CSMACD    = 6
+       IF_TYPE_ISO88025_TOKENRING = 9
+       IF_TYPE_PPP                = 23
+       IF_TYPE_SOFTWARE_LOOPBACK  = 24
+       IF_TYPE_ATM                = 37
+       IF_TYPE_IEEE80211          = 71
+       IF_TYPE_TUNNEL             = 131
+       IF_TYPE_IEEE1394           = 144
+)
+
+type SocketAddress struct {
+       Sockaddr       *syscall.RawSockaddrAny
+       SockaddrLength int32
+}
+
+type IpAdapterUnicastAddress struct {
+       Length             uint32
+       Flags              uint32
+       Next               *IpAdapterUnicastAddress
+       Address            SocketAddress
+       PrefixOrigin       int32
+       SuffixOrigin       int32
+       DadState           int32
+       ValidLifetime      uint32
+       PreferredLifetime  uint32
+       LeaseLifetime      uint32
+       OnLinkPrefixLength uint8
+}
+
+type IpAdapterAnycastAddress struct {
+       Length  uint32
+       Flags   uint32
+       Next    *IpAdapterAnycastAddress
+       Address SocketAddress
+}
+
+type IpAdapterMulticastAddress struct {
+       Length  uint32
+       Flags   uint32
+       Next    *IpAdapterMulticastAddress
+       Address SocketAddress
+}
+
+type IpAdapterDnsServerAdapter struct {
+       Length   uint32
+       Reserved uint32
+       Next     *IpAdapterDnsServerAdapter
+       Address  SocketAddress
+}
+
+type IpAdapterPrefix struct {
+       Length       uint32
+       Flags        uint32
+       Next         *IpAdapterPrefix
+       Address      SocketAddress
+       PrefixLength uint32
+}
+
+type IpAdapterAddresses struct {
+       Length                uint32
+       IfIndex               uint32
+       Next                  *IpAdapterAddresses
+       AdapterName           *byte
+       FirstUnicastAddress   *IpAdapterUnicastAddress
+       FirstAnycastAddress   *IpAdapterAnycastAddress
+       FirstMulticastAddress *IpAdapterMulticastAddress
+       FirstDnsServerAddress *IpAdapterDnsServerAdapter
+       DnsSuffix             *uint16
+       Description           *uint16
+       FriendlyName          *uint16
+       PhysicalAddress       [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
+       PhysicalAddressLength uint32
+       Flags                 uint32
+       Mtu                   uint32
+       IfType                uint32
+       OperStatus            uint32
+       Ipv6IfIndex           uint32
+       ZoneIndices           [16]uint32
+       FirstPrefix           *IpAdapterPrefix
+       /* more fields might be present here. */
+}
+
+const (
+       IfOperStatusUp             = 1
+       IfOperStatusDown           = 2
+       IfOperStatusTesting        = 3
+       IfOperStatusUnknown        = 4
+       IfOperStatusDormant        = 5
+       IfOperStatusNotPresent     = 6
+       IfOperStatusLowerLayerDown = 7
+)
diff --git a/vendor/golang.org/x/sys/windows/ztypes_windows_386.go b/vendor/golang.org/x/sys/windows/ztypes_windows_386.go
new file mode 100644 (file)
index 0000000..10f33be
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2011 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 windows
+
+type WSAData struct {
+       Version      uint16
+       HighVersion  uint16
+       Description  [WSADESCRIPTION_LEN + 1]byte
+       SystemStatus [WSASYS_STATUS_LEN + 1]byte
+       MaxSockets   uint16
+       MaxUdpDg     uint16
+       VendorInfo   *byte
+}
+
+type Servent struct {
+       Name    *byte
+       Aliases **byte
+       Port    uint16
+       Proto   *byte
+}
diff --git a/vendor/golang.org/x/sys/windows/ztypes_windows_amd64.go b/vendor/golang.org/x/sys/windows/ztypes_windows_amd64.go
new file mode 100644 (file)
index 0000000..3f272c2
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2011 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 windows
+
+type WSAData struct {
+       Version      uint16
+       HighVersion  uint16
+       MaxSockets   uint16
+       MaxUdpDg     uint16
+       VendorInfo   *byte
+       Description  [WSADESCRIPTION_LEN + 1]byte
+       SystemStatus [WSASYS_STATUS_LEN + 1]byte
+}
+
+type Servent struct {
+       Name    *byte
+       Aliases **byte
+       Proto   *byte
+       Port    uint16
+}
index cc00c27f6008df17d48272787478b69e77efd9df..6c5ed524424ddcac602a5b4f89f8bdeca0467a03 100644 (file)
                        "revision": "7a56174f0086b32866ebd746a794417edbc678a1",
                        "revisionTime": "2016-03-02T21:58:15+02:00"
                },
+               {
+                       "checksumSHA1": "fpW2dhGFC6SrVzipJx7fjg2DIH8=",
+                       "path": "golang.org/x/sys/windows",
+                       "revision": "a646d33e2ee3172a661fc09bca23bb4889a41bc8",
+                       "revisionTime": "2016-07-15T05:43:45Z"
+               },
+               {
+                       "checksumSHA1": "PjYlbMS0ttyZYlaevvjA/gV3g1c=",
+                       "path": "golang.org/x/sys/windows/registry",
+                       "revision": "a646d33e2ee3172a661fc09bca23bb4889a41bc8",
+                       "revisionTime": "2016-07-15T05:43:45Z"
+               },
+               {
+                       "checksumSHA1": "uVlUSSKplihZG7N+QJ6fzDZ4Kh8=",
+                       "path": "golang.org/x/sys/windows/svc/eventlog",
+                       "revision": "a646d33e2ee3172a661fc09bca23bb4889a41bc8",
+                       "revisionTime": "2016-07-15T05:43:45Z"
+               },
                {
                        "checksumSHA1": "+OgOXBoiQ+X+C2dsAeiOHwBIEH0=",
                        "path": "gopkg.in/yaml.v2",