syscall_windows.go raw

   1  // Copyright 2009 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  // Windows system calls.
   6  
   7  package windows
   8  
   9  import (
  10  	errorspkg "errors"
  11  	"fmt"
  12  	"runtime"
  13  	"sync"
  14  	"syscall"
  15  	"time"
  16  	"unicode/utf16"
  17  	"unsafe"
  18  )
  19  
  20  type (
  21  	Handle uintptr
  22  	HWND   uintptr
  23  )
  24  
  25  const (
  26  	InvalidHandle = ^Handle(0)
  27  	InvalidHWND   = ^HWND(0)
  28  
  29  	// Flags for DefineDosDevice.
  30  	DDD_EXACT_MATCH_ON_REMOVE = 0x00000004
  31  	DDD_NO_BROADCAST_SYSTEM   = 0x00000008
  32  	DDD_RAW_TARGET_PATH       = 0x00000001
  33  	DDD_REMOVE_DEFINITION     = 0x00000002
  34  
  35  	// Return values for GetDriveType.
  36  	DRIVE_UNKNOWN     = 0
  37  	DRIVE_NO_ROOT_DIR = 1
  38  	DRIVE_REMOVABLE   = 2
  39  	DRIVE_FIXED       = 3
  40  	DRIVE_REMOTE      = 4
  41  	DRIVE_CDROM       = 5
  42  	DRIVE_RAMDISK     = 6
  43  
  44  	// File system flags from GetVolumeInformation and GetVolumeInformationByHandle.
  45  	FILE_CASE_SENSITIVE_SEARCH        = 0x00000001
  46  	FILE_CASE_PRESERVED_NAMES         = 0x00000002
  47  	FILE_FILE_COMPRESSION             = 0x00000010
  48  	FILE_DAX_VOLUME                   = 0x20000000
  49  	FILE_NAMED_STREAMS                = 0x00040000
  50  	FILE_PERSISTENT_ACLS              = 0x00000008
  51  	FILE_READ_ONLY_VOLUME             = 0x00080000
  52  	FILE_SEQUENTIAL_WRITE_ONCE        = 0x00100000
  53  	FILE_SUPPORTS_ENCRYPTION          = 0x00020000
  54  	FILE_SUPPORTS_EXTENDED_ATTRIBUTES = 0x00800000
  55  	FILE_SUPPORTS_HARD_LINKS          = 0x00400000
  56  	FILE_SUPPORTS_OBJECT_IDS          = 0x00010000
  57  	FILE_SUPPORTS_OPEN_BY_FILE_ID     = 0x01000000
  58  	FILE_SUPPORTS_REPARSE_POINTS      = 0x00000080
  59  	FILE_SUPPORTS_SPARSE_FILES        = 0x00000040
  60  	FILE_SUPPORTS_TRANSACTIONS        = 0x00200000
  61  	FILE_SUPPORTS_USN_JOURNAL         = 0x02000000
  62  	FILE_UNICODE_ON_DISK              = 0x00000004
  63  	FILE_VOLUME_IS_COMPRESSED         = 0x00008000
  64  	FILE_VOLUME_QUOTAS                = 0x00000020
  65  
  66  	// Flags for LockFileEx.
  67  	LOCKFILE_FAIL_IMMEDIATELY = 0x00000001
  68  	LOCKFILE_EXCLUSIVE_LOCK   = 0x00000002
  69  
  70  	// Return value of SleepEx and other APC functions
  71  	WAIT_IO_COMPLETION = 0x000000C0
  72  )
  73  
  74  // StringToUTF16 is deprecated. Use UTF16FromString instead.
  75  // If s contains a NUL byte this function panics instead of
  76  // returning an error.
  77  func StringToUTF16(s string) []uint16 {
  78  	a, err := UTF16FromString(s)
  79  	if err != nil {
  80  		panic("windows: string with NUL passed to StringToUTF16")
  81  	}
  82  	return a
  83  }
  84  
  85  // UTF16FromString returns the UTF-16 encoding of the UTF-8 string
  86  // s, with a terminating NUL added. If s contains a NUL byte at any
  87  // location, it returns (nil, syscall.EINVAL).
  88  func UTF16FromString(s string) ([]uint16, error) {
  89  	return syscall.UTF16FromString(s)
  90  }
  91  
  92  // UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
  93  // with a terminating NUL and any bytes after the NUL removed.
  94  func UTF16ToString(s []uint16) string {
  95  	return syscall.UTF16ToString(s)
  96  }
  97  
  98  // StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
  99  // If s contains a NUL byte this function panics instead of
 100  // returning an error.
 101  func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] }
 102  
 103  // UTF16PtrFromString returns pointer to the UTF-16 encoding of
 104  // the UTF-8 string s, with a terminating NUL added. If s
 105  // contains a NUL byte at any location, it returns (nil, syscall.EINVAL).
 106  func UTF16PtrFromString(s string) (*uint16, error) {
 107  	a, err := UTF16FromString(s)
 108  	if err != nil {
 109  		return nil, err
 110  	}
 111  	return &a[0], nil
 112  }
 113  
 114  // UTF16PtrToString takes a pointer to a UTF-16 sequence and returns the corresponding UTF-8 encoded string.
 115  // If the pointer is nil, it returns the empty string. It assumes that the UTF-16 sequence is terminated
 116  // at a zero word; if the zero word is not present, the program may crash.
 117  func UTF16PtrToString(p *uint16) string {
 118  	if p == nil {
 119  		return ""
 120  	}
 121  	if *p == 0 {
 122  		return ""
 123  	}
 124  
 125  	// Find NUL terminator.
 126  	n := 0
 127  	for ptr := unsafe.Pointer(p); *(*uint16)(ptr) != 0; n++ {
 128  		ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*p))
 129  	}
 130  	return UTF16ToString(unsafe.Slice(p, n))
 131  }
 132  
 133  func Getpagesize() int { return 4096 }
 134  
 135  // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention.
 136  // This is useful when interoperating with Windows code requiring callbacks.
 137  // The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr.
 138  func NewCallback(fn interface{}) uintptr {
 139  	return syscall.NewCallback(fn)
 140  }
 141  
 142  // NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention.
 143  // This is useful when interoperating with Windows code requiring callbacks.
 144  // The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr.
 145  func NewCallbackCDecl(fn interface{}) uintptr {
 146  	return syscall.NewCallbackCDecl(fn)
 147  }
 148  
 149  // windows api calls
 150  
 151  //sys	GetLastError() (lasterr error)
 152  //sys	LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW
 153  //sys	LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW
 154  //sys	FreeLibrary(handle Handle) (err error)
 155  //sys	GetProcAddress(module Handle, procname string) (proc uintptr, err error)
 156  //sys	GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) = kernel32.GetModuleFileNameW
 157  //sys	GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) = kernel32.GetModuleHandleExW
 158  //sys	SetDefaultDllDirectories(directoryFlags uint32) (err error)
 159  //sys	AddDllDirectory(path *uint16) (cookie uintptr, err error) = kernel32.AddDllDirectory
 160  //sys	RemoveDllDirectory(cookie uintptr) (err error) = kernel32.RemoveDllDirectory
 161  //sys	SetDllDirectory(path string) (err error) = kernel32.SetDllDirectoryW
 162  //sys	GetVersion() (ver uint32, err error)
 163  //sys	FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW
 164  //sys	ExitProcess(exitcode uint32)
 165  //sys	IsWow64Process(handle Handle, isWow64 *bool) (err error) = IsWow64Process
 166  //sys	IsWow64Process2(handle Handle, processMachine *uint16, nativeMachine *uint16) (err error) = IsWow64Process2?
 167  //sys	CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile Handle) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW
 168  //sys	CreateNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *SecurityAttributes) (handle Handle, err error)  [failretval==InvalidHandle] = CreateNamedPipeW
 169  //sys	ConnectNamedPipe(pipe Handle, overlapped *Overlapped) (err error)
 170  //sys	DisconnectNamedPipe(pipe Handle) (err error)
 171  //sys   GetNamedPipeClientProcessId(pipe Handle, clientProcessID *uint32) (err error)
 172  //sys   GetNamedPipeServerProcessId(pipe Handle, serverProcessID *uint32) (err error)
 173  //sys	GetNamedPipeInfo(pipe Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error)
 174  //sys	GetNamedPipeHandleState(pipe Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW
 175  //sys	SetNamedPipeHandleState(pipe Handle, state *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32) (err error) = SetNamedPipeHandleState
 176  //sys	readFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = ReadFile
 177  //sys	writeFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = WriteFile
 178  //sys	GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error)
 179  //sys	SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff]
 180  //sys	CloseHandle(handle Handle) (err error)
 181  //sys	GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle]
 182  //sys	SetStdHandle(stdhandle uint32, handle Handle) (err error)
 183  //sys	findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW
 184  //sys	findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW
 185  //sys	FindClose(handle Handle) (err error)
 186  //sys	GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error)
 187  //sys	GetFileInformationByHandleEx(handle Handle, class uint32, outBuffer *byte, outBufferLen uint32) (err error)
 188  //sys	SetFileInformationByHandle(handle Handle, class uint32, inBuffer *byte, inBufferLen uint32) (err error)
 189  //sys	GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW
 190  //sys	SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW
 191  //sys	CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW
 192  //sys	RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW
 193  //sys	DeleteFile(path *uint16) (err error) = DeleteFileW
 194  //sys	MoveFile(from *uint16, to *uint16) (err error) = MoveFileW
 195  //sys	MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW
 196  //sys	LockFileEx(file Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error)
 197  //sys	UnlockFileEx(file Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error)
 198  //sys	GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW
 199  //sys	GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW
 200  //sys	SetEndOfFile(handle Handle) (err error)
 201  //sys	SetFileValidData(handle Handle, validDataLength int64) (err error)
 202  //sys	GetSystemTimeAsFileTime(time *Filetime)
 203  //sys	GetSystemTimePreciseAsFileTime(time *Filetime)
 204  //sys	GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff]
 205  //sys	CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uintptr, threadcnt uint32) (handle Handle, err error)
 206  //sys	GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uintptr, overlapped **Overlapped, timeout uint32) (err error)
 207  //sys	PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uintptr, overlapped *Overlapped) (err error)
 208  //sys	CancelIo(s Handle) (err error)
 209  //sys	CancelIoEx(s Handle, o *Overlapped) (err error)
 210  //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
 211  //sys	CreateProcessAsUser(token Token, appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = advapi32.CreateProcessAsUserW
 212  //sys   initializeProcThreadAttributeList(attrlist *ProcThreadAttributeList, attrcount uint32, flags uint32, size *uintptr) (err error) = InitializeProcThreadAttributeList
 213  //sys   deleteProcThreadAttributeList(attrlist *ProcThreadAttributeList) = DeleteProcThreadAttributeList
 214  //sys   updateProcThreadAttribute(attrlist *ProcThreadAttributeList, flags uint32, attr uintptr, value unsafe.Pointer, size uintptr, prevvalue unsafe.Pointer, returnedsize *uintptr) (err error) = UpdateProcThreadAttribute
 215  //sys	OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error)
 216  //sys	ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW
 217  //sys	GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) = user32.GetWindowThreadProcessId
 218  //sys	LoadKeyboardLayout(name *uint16, flags uint32) (hkl Handle, err error) [failretval==0] = user32.LoadKeyboardLayoutW
 219  //sys	UnloadKeyboardLayout(hkl Handle) (err error) = user32.UnloadKeyboardLayout
 220  //sys	GetKeyboardLayout(tid uint32) (hkl Handle) = user32.GetKeyboardLayout
 221  //sys	ToUnicodeEx(vkey uint32, scancode uint32, keystate *byte, pwszBuff *uint16, cchBuff int32, flags uint32, hkl Handle) (ret int32) = user32.ToUnicodeEx
 222  //sys	GetShellWindow() (shellWindow HWND) = user32.GetShellWindow
 223  //sys	MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW
 224  //sys	ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx
 225  //sys	shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath
 226  //sys	TerminateProcess(handle Handle, exitcode uint32) (err error)
 227  //sys	GetExitCodeProcess(handle Handle, exitcode *uint32) (err error)
 228  //sys	getStartupInfo(startupInfo *StartupInfo) = GetStartupInfoW
 229  //sys	GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error)
 230  //sys	DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error)
 231  //sys	WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff]
 232  //sys	waitForMultipleObjects(count uint32, handles uintptr, waitAll bool, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] = WaitForMultipleObjects
 233  //sys	GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW
 234  //sys	CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error)
 235  //sys	GetFileType(filehandle Handle) (n uint32, err error)
 236  //sys	CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW
 237  //sys	CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext
 238  //sys	CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom
 239  //sys	GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW
 240  //sys	FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW
 241  //sys	GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW
 242  //sys	SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW
 243  //sys	ExpandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW
 244  //sys	CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock
 245  //sys	DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock
 246  //sys	getTickCount64() (ms uint64) = kernel32.GetTickCount64
 247  //sys   GetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error)
 248  //sys	SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error)
 249  //sys	GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW
 250  //sys	SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW
 251  //sys	GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW
 252  //sys	GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW
 253  //sys	commandLineToArgv(cmd *uint16, argc *int32) (argv **uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW
 254  //sys	LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0]
 255  //sys	LocalAlloc(flags uint32, length uint32) (ptr uintptr, err error)
 256  //sys	SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error)
 257  //sys	FlushFileBuffers(handle Handle) (err error)
 258  //sys	GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW
 259  //sys	GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW
 260  //sys	GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW
 261  //sys	GetFinalPathNameByHandle(file Handle, filePath *uint16, filePathSize uint32, flags uint32) (n uint32, err error) = kernel32.GetFinalPathNameByHandleW
 262  //sys	CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateFileMappingW
 263  //sys	MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error)
 264  //sys	UnmapViewOfFile(addr uintptr) (err error)
 265  //sys	FlushViewOfFile(addr uintptr, length uintptr) (err error)
 266  //sys	VirtualLock(addr uintptr, length uintptr) (err error)
 267  //sys	VirtualUnlock(addr uintptr, length uintptr) (err error)
 268  //sys	VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc
 269  //sys	VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree
 270  //sys	VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect
 271  //sys	VirtualProtectEx(process Handle, address uintptr, size uintptr, newProtect uint32, oldProtect *uint32) (err error) = kernel32.VirtualProtectEx
 272  //sys	VirtualQuery(address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQuery
 273  //sys	VirtualQueryEx(process Handle, address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQueryEx
 274  //sys	ReadProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesRead *uintptr) (err error) = kernel32.ReadProcessMemory
 275  //sys	WriteProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesWritten *uintptr) (err error) = kernel32.WriteProcessMemory
 276  //sys	TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile
 277  //sys	ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW
 278  //sys	FindFirstChangeNotification(path string, watchSubtree bool, notifyFilter uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.FindFirstChangeNotificationW
 279  //sys	FindNextChangeNotification(handle Handle) (err error)
 280  //sys	FindCloseChangeNotification(handle Handle) (err error)
 281  //sys	CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW
 282  //sys	CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) = crypt32.CertOpenStore
 283  //sys	CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore
 284  //sys	CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore
 285  //sys	CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore
 286  //sys	CertDeleteCertificateFromStore(certContext *CertContext) (err error) = crypt32.CertDeleteCertificateFromStore
 287  //sys	CertDuplicateCertificateContext(certContext *CertContext) (dupContext *CertContext) = crypt32.CertDuplicateCertificateContext
 288  //sys	PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) = crypt32.PFXImportCertStore
 289  //sys	CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain
 290  //sys	CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain
 291  //sys	CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext
 292  //sys	CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext
 293  //sys	CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy
 294  //sys	CertGetNameString(certContext *CertContext, nameType uint32, flags uint32, typePara unsafe.Pointer, name *uint16, size uint32) (chars uint32) = crypt32.CertGetNameStringW
 295  //sys	CertFindExtension(objId *byte, countExtensions uint32, extensions *CertExtension) (ret *CertExtension) = crypt32.CertFindExtension
 296  //sys   CertFindCertificateInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevCertContext *CertContext) (cert *CertContext, err error) [failretval==nil] = crypt32.CertFindCertificateInStore
 297  //sys   CertFindChainInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevChainContext *CertChainContext) (certchain *CertChainContext, err error) [failretval==nil] = crypt32.CertFindChainInStore
 298  //sys   CryptAcquireCertificatePrivateKey(cert *CertContext, flags uint32, parameters unsafe.Pointer, cryptProvOrNCryptKey *Handle, keySpec *uint32, callerFreeProvOrNCryptKey *bool) (err error) = crypt32.CryptAcquireCertificatePrivateKey
 299  //sys	CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) = crypt32.CryptQueryObject
 300  //sys	CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte, lenEncodedBytes uint32, flags uint32, decoded unsafe.Pointer, decodedLen *uint32) (err error) = crypt32.CryptDecodeObject
 301  //sys	CryptProtectData(dataIn *DataBlob, name *uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptProtectData
 302  //sys	CryptUnprotectData(dataIn *DataBlob, name **uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptUnprotectData
 303  //sys	WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) = wintrust.WinVerifyTrustEx
 304  //sys	RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW
 305  //sys	RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey
 306  //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
 307  //sys	RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW
 308  //sys	RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW
 309  //sys	RegNotifyChangeKeyValue(key Handle, watchSubtree bool, notifyFilter uint32, event Handle, asynchronous bool) (regerrno error) = advapi32.RegNotifyChangeKeyValue
 310  //sys	GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId
 311  //sys	ProcessIdToSessionId(pid uint32, sessionid *uint32) (err error) = kernel32.ProcessIdToSessionId
 312  //sys	ClosePseudoConsole(console Handle) = kernel32.ClosePseudoConsole
 313  //sys	createPseudoConsole(size uint32, in Handle, out Handle, flags uint32, pconsole *Handle) (hr error) = kernel32.CreatePseudoConsole
 314  //sys	GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode
 315  //sys	SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode
 316  //sys	GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo
 317  //sys	setConsoleCursorPosition(console Handle, position uint32) (err error) = kernel32.SetConsoleCursorPosition
 318  //sys	GetConsoleCP() (cp uint32, err error) = kernel32.GetConsoleCP
 319  //sys	GetConsoleOutputCP() (cp uint32, err error) = kernel32.GetConsoleOutputCP
 320  //sys	SetConsoleCP(cp uint32) (err error) = kernel32.SetConsoleCP
 321  //sys	SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP
 322  //sys	WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
 323  //sys	ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
 324  //sys	GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) = kernel32.GetNumberOfConsoleInputEvents
 325  //sys	FlushConsoleInputBuffer(console Handle) (err error) = kernel32.FlushConsoleInputBuffer
 326  //sys	resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole
 327  //sys	CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
 328  //sys	Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW
 329  //sys	Module32Next(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32NextW
 330  //sys	Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW
 331  //sys	Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW
 332  //sys	Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error)
 333  //sys	Thread32Next(snapshot Handle, threadEntry *ThreadEntry32) (err error)
 334  //sys	DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error)
 335  // This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
 336  //sys	CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW
 337  //sys	CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW
 338  //sys	GetCurrentThreadId() (id uint32)
 339  //sys	CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateEventW
 340  //sys	CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateEventExW
 341  //sys	OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW
 342  //sys	SetEvent(event Handle) (err error) = kernel32.SetEvent
 343  //sys	ResetEvent(event Handle) (err error) = kernel32.ResetEvent
 344  //sys	PulseEvent(event Handle) (err error) = kernel32.PulseEvent
 345  //sys	CreateMutex(mutexAttrs *SecurityAttributes, initialOwner bool, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateMutexW
 346  //sys	CreateMutexEx(mutexAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateMutexExW
 347  //sys	OpenMutex(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenMutexW
 348  //sys	ReleaseMutex(mutex Handle) (err error) = kernel32.ReleaseMutex
 349  //sys	SleepEx(milliseconds uint32, alertable bool) (ret uint32) = kernel32.SleepEx
 350  //sys	CreateJobObject(jobAttr *SecurityAttributes, name *uint16) (handle Handle, err error) = kernel32.CreateJobObjectW
 351  //sys	AssignProcessToJobObject(job Handle, process Handle) (err error) = kernel32.AssignProcessToJobObject
 352  //sys	TerminateJobObject(job Handle, exitCode uint32) (err error) = kernel32.TerminateJobObject
 353  //sys	SetErrorMode(mode uint32) (ret uint32) = kernel32.SetErrorMode
 354  //sys	ResumeThread(thread Handle) (ret uint32, err error) [failretval==0xffffffff] = kernel32.ResumeThread
 355  //sys	SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass
 356  //sys	GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass
 357  //sys	QueryInformationJobObject(job Handle, JobObjectInformationClass int32, JobObjectInformation uintptr, JobObjectInformationLength uint32, retlen *uint32) (err error) = kernel32.QueryInformationJobObject
 358  //sys	SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error)
 359  //sys	GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error)
 360  //sys	GetProcessId(process Handle) (id uint32, err error)
 361  //sys	QueryFullProcessImageName(proc Handle, flags uint32, exeName *uint16, size *uint32) (err error) = kernel32.QueryFullProcessImageNameW
 362  //sys	OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error)
 363  //sys	SetProcessPriorityBoost(process Handle, disable bool) (err error) = kernel32.SetProcessPriorityBoost
 364  //sys	GetProcessWorkingSetSizeEx(hProcess Handle, lpMinimumWorkingSetSize *uintptr, lpMaximumWorkingSetSize *uintptr, flags *uint32)
 365  //sys	SetProcessWorkingSetSizeEx(hProcess Handle, dwMinimumWorkingSetSize uintptr, dwMaximumWorkingSetSize uintptr, flags uint32) (err error)
 366  //sys	ClearCommBreak(handle Handle) (err error)
 367  //sys	ClearCommError(handle Handle, lpErrors *uint32, lpStat *ComStat) (err error)
 368  //sys	EscapeCommFunction(handle Handle, dwFunc uint32) (err error)
 369  //sys	GetCommState(handle Handle, lpDCB *DCB) (err error)
 370  //sys	GetCommModemStatus(handle Handle, lpModemStat *uint32) (err error)
 371  //sys	GetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error)
 372  //sys	PurgeComm(handle Handle, dwFlags uint32) (err error)
 373  //sys	SetCommBreak(handle Handle) (err error)
 374  //sys	SetCommMask(handle Handle, dwEvtMask uint32) (err error)
 375  //sys	SetCommState(handle Handle, lpDCB *DCB) (err error)
 376  //sys	SetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error)
 377  //sys	SetupComm(handle Handle, dwInQueue uint32, dwOutQueue uint32) (err error)
 378  //sys	WaitCommEvent(handle Handle, lpEvtMask *uint32, lpOverlapped *Overlapped) (err error)
 379  //sys	GetActiveProcessorCount(groupNumber uint16) (ret uint32)
 380  //sys	GetMaximumProcessorCount(groupNumber uint16) (ret uint32)
 381  //sys	EnumWindows(enumFunc uintptr, param unsafe.Pointer) (err error) = user32.EnumWindows
 382  //sys	EnumChildWindows(hwnd HWND, enumFunc uintptr, param unsafe.Pointer) = user32.EnumChildWindows
 383  //sys	GetClassName(hwnd HWND, className *uint16, maxCount int32) (copied int32, err error) = user32.GetClassNameW
 384  //sys	GetDesktopWindow() (hwnd HWND) = user32.GetDesktopWindow
 385  //sys	GetForegroundWindow() (hwnd HWND) = user32.GetForegroundWindow
 386  //sys	IsWindow(hwnd HWND) (isWindow bool) = user32.IsWindow
 387  //sys	IsWindowUnicode(hwnd HWND) (isUnicode bool) = user32.IsWindowUnicode
 388  //sys	IsWindowVisible(hwnd HWND) (isVisible bool) = user32.IsWindowVisible
 389  //sys	GetGUIThreadInfo(thread uint32, info *GUIThreadInfo) (err error) = user32.GetGUIThreadInfo
 390  //sys	GetLargePageMinimum() (size uintptr)
 391  
 392  // Volume Management Functions
 393  //sys	DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW
 394  //sys	DeleteVolumeMountPoint(volumeMountPoint *uint16) (err error) = DeleteVolumeMountPointW
 395  //sys	FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeW
 396  //sys	FindFirstVolumeMountPoint(rootPathName *uint16, volumeMountPoint *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeMountPointW
 397  //sys	FindNextVolume(findVolume Handle, volumeName *uint16, bufferLength uint32) (err error) = FindNextVolumeW
 398  //sys	FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW
 399  //sys	FindVolumeClose(findVolume Handle) (err error)
 400  //sys	FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error)
 401  //sys	GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = GetDiskFreeSpaceExW
 402  //sys	GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW
 403  //sys	GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0]
 404  //sys	GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW
 405  //sys	GetVolumeInformation(rootPathName *uint16, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationW
 406  //sys	GetVolumeInformationByHandle(file Handle, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationByHandleW
 407  //sys	GetVolumeNameForVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16, bufferlength uint32) (err error) = GetVolumeNameForVolumeMountPointW
 408  //sys	GetVolumePathName(fileName *uint16, volumePathName *uint16, bufferLength uint32) (err error) = GetVolumePathNameW
 409  //sys	GetVolumePathNamesForVolumeName(volumeName *uint16, volumePathNames *uint16, bufferLength uint32, returnLength *uint32) (err error) = GetVolumePathNamesForVolumeNameW
 410  //sys	QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW
 411  //sys	SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW
 412  //sys	SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW
 413  //sys	InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) = advapi32.InitiateSystemShutdownExW
 414  //sys	SetProcessShutdownParameters(level uint32, flags uint32) (err error) = kernel32.SetProcessShutdownParameters
 415  //sys	GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) = kernel32.GetProcessShutdownParameters
 416  //sys	clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) = ole32.CLSIDFromString
 417  //sys	stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) = ole32.StringFromGUID2
 418  //sys	coCreateGuid(pguid *GUID) (ret error) = ole32.CoCreateGuid
 419  //sys	CoTaskMemFree(address unsafe.Pointer) = ole32.CoTaskMemFree
 420  //sys	CoInitializeEx(reserved uintptr, coInit uint32) (ret error) = ole32.CoInitializeEx
 421  //sys	CoUninitialize() = ole32.CoUninitialize
 422  //sys	CoGetObject(name *uint16, bindOpts *BIND_OPTS3, guid *GUID, functionTable **uintptr) (ret error) = ole32.CoGetObject
 423  //sys	getProcessPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetProcessPreferredUILanguages
 424  //sys	getThreadPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetThreadPreferredUILanguages
 425  //sys	getUserPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetUserPreferredUILanguages
 426  //sys	getSystemPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetSystemPreferredUILanguages
 427  //sys	findResource(module Handle, name uintptr, resType uintptr) (resInfo Handle, err error) = kernel32.FindResourceW
 428  //sys	SizeofResource(module Handle, resInfo Handle) (size uint32, err error) = kernel32.SizeofResource
 429  //sys	LoadResource(module Handle, resInfo Handle) (resData Handle, err error) = kernel32.LoadResource
 430  //sys	LockResource(resData Handle) (addr uintptr, err error) = kernel32.LockResource
 431  
 432  // Version APIs
 433  //sys	GetFileVersionInfoSize(filename string, zeroHandle *Handle) (bufSize uint32, err error) = version.GetFileVersionInfoSizeW
 434  //sys	GetFileVersionInfo(filename string, handle uint32, bufSize uint32, buffer unsafe.Pointer) (err error) = version.GetFileVersionInfoW
 435  //sys	VerQueryValue(block unsafe.Pointer, subBlock string, pointerToBufferPointer unsafe.Pointer, bufSize *uint32) (err error) = version.VerQueryValueW
 436  
 437  // Process Status API (PSAPI)
 438  //sys	enumProcesses(processIds *uint32, nSize uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses
 439  //sys	EnumProcessModules(process Handle, module *Handle, cb uint32, cbNeeded *uint32) (err error) = psapi.EnumProcessModules
 440  //sys	EnumProcessModulesEx(process Handle, module *Handle, cb uint32, cbNeeded *uint32, filterFlag uint32) (err error) = psapi.EnumProcessModulesEx
 441  //sys	GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) = psapi.GetModuleInformation
 442  //sys	GetModuleFileNameEx(process Handle, module Handle, filename *uint16, size uint32) (err error) = psapi.GetModuleFileNameExW
 443  //sys	GetModuleBaseName(process Handle, module Handle, baseName *uint16, size uint32) (err error) = psapi.GetModuleBaseNameW
 444  //sys   QueryWorkingSetEx(process Handle, pv uintptr, cb uint32) (err error) = psapi.QueryWorkingSetEx
 445  
 446  // NT Native APIs
 447  //sys	rtlNtStatusToDosErrorNoTeb(ntstatus NTStatus) (ret syscall.Errno) = ntdll.RtlNtStatusToDosErrorNoTeb
 448  //sys	rtlGetVersion(info *OsVersionInfoEx) (ntstatus error) = ntdll.RtlGetVersion
 449  //sys	rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) = ntdll.RtlGetNtVersionNumbers
 450  //sys	RtlGetCurrentPeb() (peb *PEB) = ntdll.RtlGetCurrentPeb
 451  //sys	RtlInitUnicodeString(destinationString *NTUnicodeString, sourceString *uint16) = ntdll.RtlInitUnicodeString
 452  //sys	RtlInitString(destinationString *NTString, sourceString *byte) = ntdll.RtlInitString
 453  //sys	NtCreateFile(handle *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, allocationSize *int64, attributes uint32, share uint32, disposition uint32, options uint32, eabuffer uintptr, ealength uint32) (ntstatus error) = ntdll.NtCreateFile
 454  //sys	NtCreateNamedPipeFile(pipe *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (ntstatus error) = ntdll.NtCreateNamedPipeFile
 455  //sys	NtSetInformationFile(handle Handle, iosb *IO_STATUS_BLOCK, inBuffer *byte, inBufferLen uint32, class uint32) (ntstatus error) = ntdll.NtSetInformationFile
 456  //sys	RtlDosPathNameToNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToNtPathName_U_WithStatus
 457  //sys	RtlDosPathNameToRelativeNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToRelativeNtPathName_U_WithStatus
 458  //sys	RtlDefaultNpAcl(acl **ACL) (ntstatus error) = ntdll.RtlDefaultNpAcl
 459  //sys	NtQueryInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQueryInformationProcess
 460  //sys	NtSetInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32) (ntstatus error) = ntdll.NtSetInformationProcess
 461  //sys	NtQuerySystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQuerySystemInformation
 462  //sys	NtSetSystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32) (ntstatus error) = ntdll.NtSetSystemInformation
 463  //sys	RtlAddFunctionTable(functionTable *RUNTIME_FUNCTION, entryCount uint32, baseAddress uintptr) (ret bool) = ntdll.RtlAddFunctionTable
 464  //sys	RtlDeleteFunctionTable(functionTable *RUNTIME_FUNCTION) (ret bool) = ntdll.RtlDeleteFunctionTable
 465  
 466  // Desktop Window Manager API (Dwmapi)
 467  //sys	DwmGetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmGetWindowAttribute
 468  //sys	DwmSetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmSetWindowAttribute
 469  
 470  // Windows Multimedia API
 471  //sys TimeBeginPeriod (period uint32) (err error) [failretval != 0] = winmm.timeBeginPeriod
 472  //sys TimeEndPeriod (period uint32) (err error) [failretval != 0] = winmm.timeEndPeriod
 473  
 474  // syscall interface implementation for other packages
 475  
 476  // GetCurrentProcess returns the handle for the current process.
 477  // It is a pseudo handle that does not need to be closed.
 478  // The returned error is always nil.
 479  //
 480  // Deprecated: use CurrentProcess for the same Handle without the nil
 481  // error.
 482  func GetCurrentProcess() (Handle, error) {
 483  	return CurrentProcess(), nil
 484  }
 485  
 486  // CurrentProcess returns the handle for the current process.
 487  // It is a pseudo handle that does not need to be closed.
 488  func CurrentProcess() Handle { return Handle(^uintptr(1 - 1)) }
 489  
 490  // GetCurrentThread returns the handle for the current thread.
 491  // It is a pseudo handle that does not need to be closed.
 492  // The returned error is always nil.
 493  //
 494  // Deprecated: use CurrentThread for the same Handle without the nil
 495  // error.
 496  func GetCurrentThread() (Handle, error) {
 497  	return CurrentThread(), nil
 498  }
 499  
 500  // CurrentThread returns the handle for the current thread.
 501  // It is a pseudo handle that does not need to be closed.
 502  func CurrentThread() Handle { return Handle(^uintptr(2 - 1)) }
 503  
 504  // GetProcAddressByOrdinal retrieves the address of the exported
 505  // function from module by ordinal.
 506  func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) {
 507  	r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0)
 508  	proc = uintptr(r0)
 509  	if proc == 0 {
 510  		err = errnoErr(e1)
 511  	}
 512  	return
 513  }
 514  
 515  func Exit(code int) { ExitProcess(uint32(code)) }
 516  
 517  func makeInheritSa() *SecurityAttributes {
 518  	var sa SecurityAttributes
 519  	sa.Length = uint32(unsafe.Sizeof(sa))
 520  	sa.InheritHandle = 1
 521  	return &sa
 522  }
 523  
 524  func Open(path string, mode int, perm uint32) (fd Handle, err error) {
 525  	if len(path) == 0 {
 526  		return InvalidHandle, ERROR_FILE_NOT_FOUND
 527  	}
 528  	pathp, err := UTF16PtrFromString(path)
 529  	if err != nil {
 530  		return InvalidHandle, err
 531  	}
 532  	var access uint32
 533  	switch mode & (O_RDONLY | O_WRONLY | O_RDWR) {
 534  	case O_RDONLY:
 535  		access = GENERIC_READ
 536  	case O_WRONLY:
 537  		access = GENERIC_WRITE
 538  	case O_RDWR:
 539  		access = GENERIC_READ | GENERIC_WRITE
 540  	}
 541  	if mode&O_CREAT != 0 {
 542  		access |= GENERIC_WRITE
 543  	}
 544  	if mode&O_APPEND != 0 {
 545  		access &^= GENERIC_WRITE
 546  		access |= FILE_APPEND_DATA
 547  	}
 548  	sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
 549  	var sa *SecurityAttributes
 550  	if mode&O_CLOEXEC == 0 {
 551  		sa = makeInheritSa()
 552  	}
 553  	var createmode uint32
 554  	switch {
 555  	case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL):
 556  		createmode = CREATE_NEW
 557  	case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC):
 558  		createmode = CREATE_ALWAYS
 559  	case mode&O_CREAT == O_CREAT:
 560  		createmode = OPEN_ALWAYS
 561  	case mode&O_TRUNC == O_TRUNC:
 562  		createmode = TRUNCATE_EXISTING
 563  	default:
 564  		createmode = OPEN_EXISTING
 565  	}
 566  	var attrs uint32 = FILE_ATTRIBUTE_NORMAL
 567  	if perm&S_IWRITE == 0 {
 568  		attrs = FILE_ATTRIBUTE_READONLY
 569  	}
 570  	h, e := CreateFile(pathp, access, sharemode, sa, createmode, attrs, 0)
 571  	return h, e
 572  }
 573  
 574  func Read(fd Handle, p []byte) (n int, err error) {
 575  	var done uint32
 576  	e := ReadFile(fd, p, &done, nil)
 577  	if e != nil {
 578  		if e == ERROR_BROKEN_PIPE {
 579  			// NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin
 580  			return 0, nil
 581  		}
 582  		return 0, e
 583  	}
 584  	return int(done), nil
 585  }
 586  
 587  func Write(fd Handle, p []byte) (n int, err error) {
 588  	if raceenabled {
 589  		raceReleaseMerge(unsafe.Pointer(&ioSync))
 590  	}
 591  	var done uint32
 592  	e := WriteFile(fd, p, &done, nil)
 593  	if e != nil {
 594  		return 0, e
 595  	}
 596  	return int(done), nil
 597  }
 598  
 599  func ReadFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error {
 600  	err := readFile(fd, p, done, overlapped)
 601  	if raceenabled {
 602  		if *done > 0 {
 603  			raceWriteRange(unsafe.Pointer(&p[0]), int(*done))
 604  		}
 605  		raceAcquire(unsafe.Pointer(&ioSync))
 606  	}
 607  	return err
 608  }
 609  
 610  func WriteFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error {
 611  	if raceenabled {
 612  		raceReleaseMerge(unsafe.Pointer(&ioSync))
 613  	}
 614  	err := writeFile(fd, p, done, overlapped)
 615  	if raceenabled && *done > 0 {
 616  		raceReadRange(unsafe.Pointer(&p[0]), int(*done))
 617  	}
 618  	return err
 619  }
 620  
 621  var ioSync int64
 622  
 623  func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) {
 624  	var w uint32
 625  	switch whence {
 626  	case 0:
 627  		w = FILE_BEGIN
 628  	case 1:
 629  		w = FILE_CURRENT
 630  	case 2:
 631  		w = FILE_END
 632  	}
 633  	hi := int32(offset >> 32)
 634  	lo := int32(offset)
 635  	// use GetFileType to check pipe, pipe can't do seek
 636  	ft, _ := GetFileType(fd)
 637  	if ft == FILE_TYPE_PIPE {
 638  		return 0, syscall.EPIPE
 639  	}
 640  	rlo, e := SetFilePointer(fd, lo, &hi, w)
 641  	if e != nil {
 642  		return 0, e
 643  	}
 644  	return int64(hi)<<32 + int64(rlo), nil
 645  }
 646  
 647  func Close(fd Handle) (err error) {
 648  	return CloseHandle(fd)
 649  }
 650  
 651  var (
 652  	Stdin  = getStdHandle(STD_INPUT_HANDLE)
 653  	Stdout = getStdHandle(STD_OUTPUT_HANDLE)
 654  	Stderr = getStdHandle(STD_ERROR_HANDLE)
 655  )
 656  
 657  func getStdHandle(stdhandle uint32) (fd Handle) {
 658  	r, _ := GetStdHandle(stdhandle)
 659  	return r
 660  }
 661  
 662  const ImplementsGetwd = true
 663  
 664  func Getwd() (wd string, err error) {
 665  	b := make([]uint16, 300)
 666  	n, e := GetCurrentDirectory(uint32(len(b)), &b[0])
 667  	if e != nil {
 668  		return "", e
 669  	}
 670  	return string(utf16.Decode(b[0:n])), nil
 671  }
 672  
 673  func Chdir(path string) (err error) {
 674  	pathp, err := UTF16PtrFromString(path)
 675  	if err != nil {
 676  		return err
 677  	}
 678  	return SetCurrentDirectory(pathp)
 679  }
 680  
 681  func Mkdir(path string, mode uint32) (err error) {
 682  	pathp, err := UTF16PtrFromString(path)
 683  	if err != nil {
 684  		return err
 685  	}
 686  	return CreateDirectory(pathp, nil)
 687  }
 688  
 689  func Rmdir(path string) (err error) {
 690  	pathp, err := UTF16PtrFromString(path)
 691  	if err != nil {
 692  		return err
 693  	}
 694  	return RemoveDirectory(pathp)
 695  }
 696  
 697  func Unlink(path string) (err error) {
 698  	pathp, err := UTF16PtrFromString(path)
 699  	if err != nil {
 700  		return err
 701  	}
 702  	return DeleteFile(pathp)
 703  }
 704  
 705  func Rename(oldpath, newpath string) (err error) {
 706  	from, err := UTF16PtrFromString(oldpath)
 707  	if err != nil {
 708  		return err
 709  	}
 710  	to, err := UTF16PtrFromString(newpath)
 711  	if err != nil {
 712  		return err
 713  	}
 714  	return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)
 715  }
 716  
 717  func ComputerName() (name string, err error) {
 718  	var n uint32 = MAX_COMPUTERNAME_LENGTH + 1
 719  	b := make([]uint16, n)
 720  	e := GetComputerName(&b[0], &n)
 721  	if e != nil {
 722  		return "", e
 723  	}
 724  	return string(utf16.Decode(b[0:n])), nil
 725  }
 726  
 727  func DurationSinceBoot() time.Duration {
 728  	return time.Duration(getTickCount64()) * time.Millisecond
 729  }
 730  
 731  func Ftruncate(fd Handle, length int64) (err error) {
 732  	type _FILE_END_OF_FILE_INFO struct {
 733  		EndOfFile int64
 734  	}
 735  	var info _FILE_END_OF_FILE_INFO
 736  	info.EndOfFile = length
 737  	return SetFileInformationByHandle(fd, FileEndOfFileInfo, (*byte)(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info)))
 738  }
 739  
 740  func Gettimeofday(tv *Timeval) (err error) {
 741  	var ft Filetime
 742  	GetSystemTimeAsFileTime(&ft)
 743  	*tv = NsecToTimeval(ft.Nanoseconds())
 744  	return nil
 745  }
 746  
 747  func Pipe(p []Handle) (err error) {
 748  	if len(p) != 2 {
 749  		return syscall.EINVAL
 750  	}
 751  	var r, w Handle
 752  	e := CreatePipe(&r, &w, makeInheritSa(), 0)
 753  	if e != nil {
 754  		return e
 755  	}
 756  	p[0] = r
 757  	p[1] = w
 758  	return nil
 759  }
 760  
 761  func Utimes(path string, tv []Timeval) (err error) {
 762  	if len(tv) != 2 {
 763  		return syscall.EINVAL
 764  	}
 765  	pathp, e := UTF16PtrFromString(path)
 766  	if e != nil {
 767  		return e
 768  	}
 769  	h, e := CreateFile(pathp,
 770  		FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
 771  		OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
 772  	if e != nil {
 773  		return e
 774  	}
 775  	defer CloseHandle(h)
 776  	a := NsecToFiletime(tv[0].Nanoseconds())
 777  	w := NsecToFiletime(tv[1].Nanoseconds())
 778  	return SetFileTime(h, nil, &a, &w)
 779  }
 780  
 781  func UtimesNano(path string, ts []Timespec) (err error) {
 782  	if len(ts) != 2 {
 783  		return syscall.EINVAL
 784  	}
 785  	pathp, e := UTF16PtrFromString(path)
 786  	if e != nil {
 787  		return e
 788  	}
 789  	h, e := CreateFile(pathp,
 790  		FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
 791  		OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
 792  	if e != nil {
 793  		return e
 794  	}
 795  	defer CloseHandle(h)
 796  	a := NsecToFiletime(TimespecToNsec(ts[0]))
 797  	w := NsecToFiletime(TimespecToNsec(ts[1]))
 798  	return SetFileTime(h, nil, &a, &w)
 799  }
 800  
 801  func Fsync(fd Handle) (err error) {
 802  	return FlushFileBuffers(fd)
 803  }
 804  
 805  func Chmod(path string, mode uint32) (err error) {
 806  	p, e := UTF16PtrFromString(path)
 807  	if e != nil {
 808  		return e
 809  	}
 810  	attrs, e := GetFileAttributes(p)
 811  	if e != nil {
 812  		return e
 813  	}
 814  	if mode&S_IWRITE != 0 {
 815  		attrs &^= FILE_ATTRIBUTE_READONLY
 816  	} else {
 817  		attrs |= FILE_ATTRIBUTE_READONLY
 818  	}
 819  	return SetFileAttributes(p, attrs)
 820  }
 821  
 822  func LoadGetSystemTimePreciseAsFileTime() error {
 823  	return procGetSystemTimePreciseAsFileTime.Find()
 824  }
 825  
 826  func LoadCancelIoEx() error {
 827  	return procCancelIoEx.Find()
 828  }
 829  
 830  func LoadSetFileCompletionNotificationModes() error {
 831  	return procSetFileCompletionNotificationModes.Find()
 832  }
 833  
 834  func WaitForMultipleObjects(handles []Handle, waitAll bool, waitMilliseconds uint32) (event uint32, err error) {
 835  	// Every other win32 array API takes arguments as "pointer, count", except for this function. So we
 836  	// can't declare it as a usual [] type, because mksyscall will use the opposite order. We therefore
 837  	// trivially stub this ourselves.
 838  
 839  	var handlePtr *Handle
 840  	if len(handles) > 0 {
 841  		handlePtr = &handles[0]
 842  	}
 843  	return waitForMultipleObjects(uint32(len(handles)), uintptr(unsafe.Pointer(handlePtr)), waitAll, waitMilliseconds)
 844  }
 845  
 846  // net api calls
 847  
 848  const socket_error = uintptr(^uint32(0))
 849  
 850  //sys	WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
 851  //sys	WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
 852  //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
 853  //sys	WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceBeginW
 854  //sys	WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceNextW
 855  //sys	WSALookupServiceEnd(handle Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceEnd
 856  //sys	socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
 857  //sys	sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
 858  //sys	recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom
 859  //sys	Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt
 860  //sys	Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt
 861  //sys	bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind
 862  //sys	connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect
 863  //sys	getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname
 864  //sys	getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername
 865  //sys	listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen
 866  //sys	shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown
 867  //sys	Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket
 868  //sys	AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx
 869  //sys	GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs
 870  //sys	WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv
 871  //sys	WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend
 872  //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
 873  //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
 874  //sys	WSASocket(af int32, typ int32, protocol int32, protoInfo *WSAProtocolInfo, group uint32, flags uint32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.WSASocketW
 875  //sys	WSADuplicateSocket(s Handle, processID uint32, info *WSAProtocolInfo) (err error) [failretval!=0] = ws2_32.WSADuplicateSocketW
 876  //sys	GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname
 877  //sys	GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname
 878  //sys	Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs
 879  //sys	GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname
 880  //sys	DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W
 881  //sys	DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree
 882  //sys	DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W
 883  //sys	GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW
 884  //sys	FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW
 885  //sys	GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry
 886  //sys	GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo
 887  //sys	SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes
 888  //sys	WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW
 889  //sys	WSAGetOverlappedResult(h Handle, o *Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult
 890  //sys	GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses
 891  //sys	GetACP() (acp uint32) = kernel32.GetACP
 892  //sys	MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
 893  //sys	getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx
 894  //sys   GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) = iphlpapi.GetIfEntry2Ex
 895  //sys   GetIpForwardEntry2(row *MibIpForwardRow2) (errcode error) = iphlpapi.GetIpForwardEntry2
 896  //sys   GetIpForwardTable2(family uint16, table **MibIpForwardTable2) (errcode error) = iphlpapi.GetIpForwardTable2
 897  //sys   GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) = iphlpapi.GetUnicastIpAddressEntry
 898  //sys   FreeMibTable(memory unsafe.Pointer) = iphlpapi.FreeMibTable
 899  //sys   NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyIpInterfaceChange
 900  //sys   NotifyRouteChange2(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyRouteChange2
 901  //sys   NotifyUnicastIpAddressChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyUnicastIpAddressChange
 902  //sys   CancelMibChangeNotify2(notificationHandle Handle) (errcode error) = iphlpapi.CancelMibChangeNotify2
 903  //sys	IsProcessorFeaturePresent(ProcessorFeature uint32) (ret bool) = kernel32.IsProcessorFeaturePresent
 904  
 905  // For testing: clients can set this flag to force
 906  // creation of IPv6 sockets to return EAFNOSUPPORT.
 907  var SocketDisableIPv6 bool
 908  
 909  type RawSockaddrInet4 struct {
 910  	Family uint16
 911  	Port   uint16
 912  	Addr   [4]byte /* in_addr */
 913  	Zero   [8]uint8
 914  }
 915  
 916  type RawSockaddrInet6 struct {
 917  	Family   uint16
 918  	Port     uint16
 919  	Flowinfo uint32
 920  	Addr     [16]byte /* in6_addr */
 921  	Scope_id uint32
 922  }
 923  
 924  // RawSockaddrInet is a union that contains an IPv4, an IPv6 address, or an address family. See
 925  // https://learn.microsoft.com/en-us/windows/win32/api/ws2ipdef/ns-ws2ipdef-sockaddr_inet.
 926  //
 927  // A [*RawSockaddrInet] may be converted to a [*RawSockaddrInet4] or [*RawSockaddrInet6] using
 928  // unsafe, depending on the address family.
 929  type RawSockaddrInet struct {
 930  	Family uint16
 931  	Port   uint16
 932  	Data   [6]uint32
 933  }
 934  
 935  type RawSockaddr struct {
 936  	Family uint16
 937  	Data   [14]int8
 938  }
 939  
 940  type RawSockaddrAny struct {
 941  	Addr RawSockaddr
 942  	Pad  [100]int8
 943  }
 944  
 945  type Sockaddr interface {
 946  	sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs
 947  }
 948  
 949  type SockaddrInet4 struct {
 950  	Port int
 951  	Addr [4]byte
 952  	raw  RawSockaddrInet4
 953  }
 954  
 955  func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) {
 956  	if sa.Port < 0 || sa.Port > 0xFFFF {
 957  		return nil, 0, syscall.EINVAL
 958  	}
 959  	sa.raw.Family = AF_INET
 960  	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
 961  	p[0] = byte(sa.Port >> 8)
 962  	p[1] = byte(sa.Port)
 963  	sa.raw.Addr = sa.Addr
 964  	return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
 965  }
 966  
 967  type SockaddrInet6 struct {
 968  	Port   int
 969  	ZoneId uint32
 970  	Addr   [16]byte
 971  	raw    RawSockaddrInet6
 972  }
 973  
 974  func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) {
 975  	if sa.Port < 0 || sa.Port > 0xFFFF {
 976  		return nil, 0, syscall.EINVAL
 977  	}
 978  	sa.raw.Family = AF_INET6
 979  	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
 980  	p[0] = byte(sa.Port >> 8)
 981  	p[1] = byte(sa.Port)
 982  	sa.raw.Scope_id = sa.ZoneId
 983  	sa.raw.Addr = sa.Addr
 984  	return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
 985  }
 986  
 987  type RawSockaddrUnix struct {
 988  	Family uint16
 989  	Path   [UNIX_PATH_MAX]int8
 990  }
 991  
 992  type SockaddrUnix struct {
 993  	Name string
 994  	raw  RawSockaddrUnix
 995  }
 996  
 997  func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) {
 998  	name := sa.Name
 999  	n := len(name)
1000  	if n > len(sa.raw.Path) {
1001  		return nil, 0, syscall.EINVAL
1002  	}
1003  	if n == len(sa.raw.Path) && name[0] != '@' {
1004  		return nil, 0, syscall.EINVAL
1005  	}
1006  	sa.raw.Family = AF_UNIX
1007  	for i := 0; i < n; i++ {
1008  		sa.raw.Path[i] = int8(name[i])
1009  	}
1010  	// length is family (uint16), name, NUL.
1011  	sl := int32(2)
1012  	if n > 0 {
1013  		sl += int32(n) + 1
1014  	}
1015  	if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) {
1016  		// Check sl > 3 so we don't change unnamed socket behavior.
1017  		sa.raw.Path[0] = 0
1018  		// Don't count trailing NUL for abstract address.
1019  		sl--
1020  	}
1021  
1022  	return unsafe.Pointer(&sa.raw), sl, nil
1023  }
1024  
1025  type RawSockaddrBth struct {
1026  	AddressFamily  [2]byte
1027  	BtAddr         [8]byte
1028  	ServiceClassId [16]byte
1029  	Port           [4]byte
1030  }
1031  
1032  type SockaddrBth struct {
1033  	BtAddr         uint64
1034  	ServiceClassId GUID
1035  	Port           uint32
1036  
1037  	raw RawSockaddrBth
1038  }
1039  
1040  func (sa *SockaddrBth) sockaddr() (unsafe.Pointer, int32, error) {
1041  	family := AF_BTH
1042  	sa.raw = RawSockaddrBth{
1043  		AddressFamily:  *(*[2]byte)(unsafe.Pointer(&family)),
1044  		BtAddr:         *(*[8]byte)(unsafe.Pointer(&sa.BtAddr)),
1045  		Port:           *(*[4]byte)(unsafe.Pointer(&sa.Port)),
1046  		ServiceClassId: *(*[16]byte)(unsafe.Pointer(&sa.ServiceClassId)),
1047  	}
1048  	return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
1049  }
1050  
1051  func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) {
1052  	switch rsa.Addr.Family {
1053  	case AF_UNIX:
1054  		pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
1055  		sa := new(SockaddrUnix)
1056  		if pp.Path[0] == 0 {
1057  			// "Abstract" Unix domain socket.
1058  			// Rewrite leading NUL as @ for textual display.
1059  			// (This is the standard convention.)
1060  			// Not friendly to overwrite in place,
1061  			// but the callers below don't care.
1062  			pp.Path[0] = '@'
1063  		}
1064  
1065  		// Assume path ends at NUL.
1066  		// This is not technically the Linux semantics for
1067  		// abstract Unix domain sockets--they are supposed
1068  		// to be uninterpreted fixed-size binary blobs--but
1069  		// everyone uses this convention.
1070  		n := 0
1071  		for n < len(pp.Path) && pp.Path[n] != 0 {
1072  			n++
1073  		}
1074  		sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
1075  		return sa, nil
1076  
1077  	case AF_INET:
1078  		pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
1079  		sa := new(SockaddrInet4)
1080  		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
1081  		sa.Port = int(p[0])<<8 + int(p[1])
1082  		sa.Addr = pp.Addr
1083  		return sa, nil
1084  
1085  	case AF_INET6:
1086  		pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
1087  		sa := new(SockaddrInet6)
1088  		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
1089  		sa.Port = int(p[0])<<8 + int(p[1])
1090  		sa.ZoneId = pp.Scope_id
1091  		sa.Addr = pp.Addr
1092  		return sa, nil
1093  	}
1094  	return nil, syscall.EAFNOSUPPORT
1095  }
1096  
1097  func Socket(domain, typ, proto int) (fd Handle, err error) {
1098  	if domain == AF_INET6 && SocketDisableIPv6 {
1099  		return InvalidHandle, syscall.EAFNOSUPPORT
1100  	}
1101  	return socket(int32(domain), int32(typ), int32(proto))
1102  }
1103  
1104  func SetsockoptInt(fd Handle, level, opt int, value int) (err error) {
1105  	v := int32(value)
1106  	return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v)))
1107  }
1108  
1109  func Bind(fd Handle, sa Sockaddr) (err error) {
1110  	ptr, n, err := sa.sockaddr()
1111  	if err != nil {
1112  		return err
1113  	}
1114  	return bind(fd, ptr, n)
1115  }
1116  
1117  func Connect(fd Handle, sa Sockaddr) (err error) {
1118  	ptr, n, err := sa.sockaddr()
1119  	if err != nil {
1120  		return err
1121  	}
1122  	return connect(fd, ptr, n)
1123  }
1124  
1125  func GetBestInterfaceEx(sa Sockaddr, pdwBestIfIndex *uint32) (err error) {
1126  	ptr, _, err := sa.sockaddr()
1127  	if err != nil {
1128  		return err
1129  	}
1130  	return getBestInterfaceEx(ptr, pdwBestIfIndex)
1131  }
1132  
1133  func Getsockname(fd Handle) (sa Sockaddr, err error) {
1134  	var rsa RawSockaddrAny
1135  	l := int32(unsafe.Sizeof(rsa))
1136  	if err = getsockname(fd, &rsa, &l); err != nil {
1137  		return
1138  	}
1139  	return rsa.Sockaddr()
1140  }
1141  
1142  func Getpeername(fd Handle) (sa Sockaddr, err error) {
1143  	var rsa RawSockaddrAny
1144  	l := int32(unsafe.Sizeof(rsa))
1145  	if err = getpeername(fd, &rsa, &l); err != nil {
1146  		return
1147  	}
1148  	return rsa.Sockaddr()
1149  }
1150  
1151  func Listen(s Handle, n int) (err error) {
1152  	return listen(s, int32(n))
1153  }
1154  
1155  func Shutdown(fd Handle, how int) (err error) {
1156  	return shutdown(fd, int32(how))
1157  }
1158  
1159  func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) {
1160  	var rsa unsafe.Pointer
1161  	var l int32
1162  	if to != nil {
1163  		rsa, l, err = to.sockaddr()
1164  		if err != nil {
1165  			return err
1166  		}
1167  	}
1168  	return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine)
1169  }
1170  
1171  func LoadGetAddrInfo() error {
1172  	return procGetAddrInfoW.Find()
1173  }
1174  
1175  var connectExFunc struct {
1176  	once sync.Once
1177  	addr uintptr
1178  	err  error
1179  }
1180  
1181  func LoadConnectEx() error {
1182  	connectExFunc.once.Do(func() {
1183  		var s Handle
1184  		s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
1185  		if connectExFunc.err != nil {
1186  			return
1187  		}
1188  		defer CloseHandle(s)
1189  		var n uint32
1190  		connectExFunc.err = WSAIoctl(s,
1191  			SIO_GET_EXTENSION_FUNCTION_POINTER,
1192  			(*byte)(unsafe.Pointer(&WSAID_CONNECTEX)),
1193  			uint32(unsafe.Sizeof(WSAID_CONNECTEX)),
1194  			(*byte)(unsafe.Pointer(&connectExFunc.addr)),
1195  			uint32(unsafe.Sizeof(connectExFunc.addr)),
1196  			&n, nil, 0)
1197  	})
1198  	return connectExFunc.err
1199  }
1200  
1201  func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) {
1202  	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)
1203  	if r1 == 0 {
1204  		if e1 != 0 {
1205  			err = error(e1)
1206  		} else {
1207  			err = syscall.EINVAL
1208  		}
1209  	}
1210  	return
1211  }
1212  
1213  func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error {
1214  	err := LoadConnectEx()
1215  	if err != nil {
1216  		return errorspkg.New("failed to find ConnectEx: " + err.Error())
1217  	}
1218  	ptr, n, err := sa.sockaddr()
1219  	if err != nil {
1220  		return err
1221  	}
1222  	return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
1223  }
1224  
1225  var sendRecvMsgFunc struct {
1226  	once     sync.Once
1227  	sendAddr uintptr
1228  	recvAddr uintptr
1229  	err      error
1230  }
1231  
1232  func loadWSASendRecvMsg() error {
1233  	sendRecvMsgFunc.once.Do(func() {
1234  		var s Handle
1235  		s, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
1236  		if sendRecvMsgFunc.err != nil {
1237  			return
1238  		}
1239  		defer CloseHandle(s)
1240  		var n uint32
1241  		sendRecvMsgFunc.err = WSAIoctl(s,
1242  			SIO_GET_EXTENSION_FUNCTION_POINTER,
1243  			(*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)),
1244  			uint32(unsafe.Sizeof(WSAID_WSARECVMSG)),
1245  			(*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)),
1246  			uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)),
1247  			&n, nil, 0)
1248  		if sendRecvMsgFunc.err != nil {
1249  			return
1250  		}
1251  		sendRecvMsgFunc.err = WSAIoctl(s,
1252  			SIO_GET_EXTENSION_FUNCTION_POINTER,
1253  			(*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)),
1254  			uint32(unsafe.Sizeof(WSAID_WSASENDMSG)),
1255  			(*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)),
1256  			uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)),
1257  			&n, nil, 0)
1258  	})
1259  	return sendRecvMsgFunc.err
1260  }
1261  
1262  func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error {
1263  	err := loadWSASendRecvMsg()
1264  	if err != nil {
1265  		return err
1266  	}
1267  	r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
1268  	if r1 == socket_error {
1269  		err = errnoErr(e1)
1270  	}
1271  	return err
1272  }
1273  
1274  func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error {
1275  	err := loadWSASendRecvMsg()
1276  	if err != nil {
1277  		return err
1278  	}
1279  	r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0)
1280  	if r1 == socket_error {
1281  		err = errnoErr(e1)
1282  	}
1283  	return err
1284  }
1285  
1286  // Invented structures to support what package os expects.
1287  type Rusage struct {
1288  	CreationTime Filetime
1289  	ExitTime     Filetime
1290  	KernelTime   Filetime
1291  	UserTime     Filetime
1292  }
1293  
1294  type WaitStatus struct {
1295  	ExitCode uint32
1296  }
1297  
1298  func (w WaitStatus) Exited() bool { return true }
1299  
1300  func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) }
1301  
1302  func (w WaitStatus) Signal() Signal { return -1 }
1303  
1304  func (w WaitStatus) CoreDump() bool { return false }
1305  
1306  func (w WaitStatus) Stopped() bool { return false }
1307  
1308  func (w WaitStatus) Continued() bool { return false }
1309  
1310  func (w WaitStatus) StopSignal() Signal { return -1 }
1311  
1312  func (w WaitStatus) Signaled() bool { return false }
1313  
1314  func (w WaitStatus) TrapCause() int { return -1 }
1315  
1316  // Timespec is an invented structure on Windows, but here for
1317  // consistency with the corresponding package for other operating systems.
1318  type Timespec struct {
1319  	Sec  int64
1320  	Nsec int64
1321  }
1322  
1323  func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
1324  
1325  func NsecToTimespec(nsec int64) (ts Timespec) {
1326  	ts.Sec = nsec / 1e9
1327  	ts.Nsec = nsec % 1e9
1328  	return
1329  }
1330  
1331  // TODO(brainman): fix all needed for net
1332  
1333  func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS }
1334  
1335  func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) {
1336  	var rsa RawSockaddrAny
1337  	l := int32(unsafe.Sizeof(rsa))
1338  	n32, err := recvfrom(fd, p, int32(flags), &rsa, &l)
1339  	n = int(n32)
1340  	if err != nil {
1341  		return
1342  	}
1343  	from, err = rsa.Sockaddr()
1344  	return
1345  }
1346  
1347  func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) {
1348  	ptr, l, err := to.sockaddr()
1349  	if err != nil {
1350  		return err
1351  	}
1352  	return sendto(fd, p, int32(flags), ptr, l)
1353  }
1354  
1355  func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS }
1356  
1357  // The Linger struct is wrong but we only noticed after Go 1.
1358  // sysLinger is the real system call structure.
1359  
1360  // BUG(brainman): The definition of Linger is not appropriate for direct use
1361  // with Setsockopt and Getsockopt.
1362  // Use SetsockoptLinger instead.
1363  
1364  type Linger struct {
1365  	Onoff  int32
1366  	Linger int32
1367  }
1368  
1369  type sysLinger struct {
1370  	Onoff  uint16
1371  	Linger uint16
1372  }
1373  
1374  type IPMreq struct {
1375  	Multiaddr [4]byte /* in_addr */
1376  	Interface [4]byte /* in_addr */
1377  }
1378  
1379  type IPv6Mreq struct {
1380  	Multiaddr [16]byte /* in6_addr */
1381  	Interface uint32
1382  }
1383  
1384  func GetsockoptInt(fd Handle, level, opt int) (int, error) {
1385  	v := int32(0)
1386  	l := int32(unsafe.Sizeof(v))
1387  	err := Getsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), &l)
1388  	return int(v), err
1389  }
1390  
1391  func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) {
1392  	sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)}
1393  	return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys)))
1394  }
1395  
1396  func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) {
1397  	return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4)
1398  }
1399  
1400  func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) {
1401  	return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
1402  }
1403  
1404  func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) {
1405  	return syscall.EWINDOWS
1406  }
1407  
1408  func EnumProcesses(processIds []uint32, bytesReturned *uint32) error {
1409  	// EnumProcesses syscall expects the size parameter to be in bytes, but the code generated with mksyscall uses
1410  	// the length of the processIds slice instead. Hence, this wrapper function is added to fix the discrepancy.
1411  	var p *uint32
1412  	if len(processIds) > 0 {
1413  		p = &processIds[0]
1414  	}
1415  	size := uint32(len(processIds) * 4)
1416  	return enumProcesses(p, size, bytesReturned)
1417  }
1418  
1419  func Getpid() (pid int) { return int(GetCurrentProcessId()) }
1420  
1421  func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) {
1422  	// NOTE(rsc): The Win32finddata struct is wrong for the system call:
1423  	// the two paths are each one uint16 short. Use the correct struct,
1424  	// a win32finddata1, and then copy the results out.
1425  	// There is no loss of expressivity here, because the final
1426  	// uint16, if it is used, is supposed to be a NUL, and Go doesn't need that.
1427  	// For Go 1.1, we might avoid the allocation of win32finddata1 here
1428  	// by adding a final Bug [2]uint16 field to the struct and then
1429  	// adjusting the fields in the result directly.
1430  	var data1 win32finddata1
1431  	handle, err = findFirstFile1(name, &data1)
1432  	if err == nil {
1433  		copyFindData(data, &data1)
1434  	}
1435  	return
1436  }
1437  
1438  func FindNextFile(handle Handle, data *Win32finddata) (err error) {
1439  	var data1 win32finddata1
1440  	err = findNextFile1(handle, &data1)
1441  	if err == nil {
1442  		copyFindData(data, &data1)
1443  	}
1444  	return
1445  }
1446  
1447  func getProcessEntry(pid int) (*ProcessEntry32, error) {
1448  	snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
1449  	if err != nil {
1450  		return nil, err
1451  	}
1452  	defer CloseHandle(snapshot)
1453  	var procEntry ProcessEntry32
1454  	procEntry.Size = uint32(unsafe.Sizeof(procEntry))
1455  	if err = Process32First(snapshot, &procEntry); err != nil {
1456  		return nil, err
1457  	}
1458  	for {
1459  		if procEntry.ProcessID == uint32(pid) {
1460  			return &procEntry, nil
1461  		}
1462  		err = Process32Next(snapshot, &procEntry)
1463  		if err != nil {
1464  			return nil, err
1465  		}
1466  	}
1467  }
1468  
1469  func Getppid() (ppid int) {
1470  	pe, err := getProcessEntry(Getpid())
1471  	if err != nil {
1472  		return -1
1473  	}
1474  	return int(pe.ParentProcessID)
1475  }
1476  
1477  // TODO(brainman): fix all needed for os
1478  func Fchdir(fd Handle) (err error)             { return syscall.EWINDOWS }
1479  func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS }
1480  func Symlink(path, link string) (err error)    { return syscall.EWINDOWS }
1481  
1482  func Fchmod(fd Handle, mode uint32) (err error)        { return syscall.EWINDOWS }
1483  func Chown(path string, uid int, gid int) (err error)  { return syscall.EWINDOWS }
1484  func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }
1485  func Fchown(fd Handle, uid int, gid int) (err error)   { return syscall.EWINDOWS }
1486  
1487  func Getuid() (uid int)                  { return -1 }
1488  func Geteuid() (euid int)                { return -1 }
1489  func Getgid() (gid int)                  { return -1 }
1490  func Getegid() (egid int)                { return -1 }
1491  func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS }
1492  
1493  func LoadCreateSymbolicLink() error {
1494  	return procCreateSymbolicLinkW.Find()
1495  }
1496  
1497  // Readlink returns the destination of the named symbolic link.
1498  func Readlink(path string, buf []byte) (n int, err error) {
1499  	fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING,
1500  		FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0)
1501  	if err != nil {
1502  		return -1, err
1503  	}
1504  	defer CloseHandle(fd)
1505  
1506  	rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE)
1507  	var bytesReturned uint32
1508  	err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil)
1509  	if err != nil {
1510  		return -1, err
1511  	}
1512  
1513  	rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0]))
1514  	var s string
1515  	switch rdb.ReparseTag {
1516  	case IO_REPARSE_TAG_SYMLINK:
1517  		data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
1518  		p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
1519  		s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
1520  	case IO_REPARSE_TAG_MOUNT_POINT:
1521  		data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
1522  		p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
1523  		s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
1524  	default:
1525  		// the path is not a symlink or junction but another type of reparse
1526  		// point
1527  		return -1, syscall.ENOENT
1528  	}
1529  	n = copy(buf, []byte(s))
1530  
1531  	return n, nil
1532  }
1533  
1534  // GUIDFromString parses a string in the form of
1535  // "{XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" into a GUID.
1536  func GUIDFromString(str string) (GUID, error) {
1537  	guid := GUID{}
1538  	str16, err := syscall.UTF16PtrFromString(str)
1539  	if err != nil {
1540  		return guid, err
1541  	}
1542  	err = clsidFromString(str16, &guid)
1543  	if err != nil {
1544  		return guid, err
1545  	}
1546  	return guid, nil
1547  }
1548  
1549  // GenerateGUID creates a new random GUID.
1550  func GenerateGUID() (GUID, error) {
1551  	guid := GUID{}
1552  	err := coCreateGuid(&guid)
1553  	if err != nil {
1554  		return guid, err
1555  	}
1556  	return guid, nil
1557  }
1558  
1559  // String returns the canonical string form of the GUID,
1560  // in the form of "{XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}".
1561  func (guid GUID) String() string {
1562  	var str [100]uint16
1563  	chars := stringFromGUID2(&guid, &str[0], int32(len(str)))
1564  	if chars <= 1 {
1565  		return ""
1566  	}
1567  	return string(utf16.Decode(str[:chars-1]))
1568  }
1569  
1570  // KnownFolderPath returns a well-known folder path for the current user, specified by one of
1571  // the FOLDERID_ constants, and chosen and optionally created based on a KF_ flag.
1572  func KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, error) {
1573  	return Token(0).KnownFolderPath(folderID, flags)
1574  }
1575  
1576  // KnownFolderPath returns a well-known folder path for the user token, specified by one of
1577  // the FOLDERID_ constants, and chosen and optionally created based on a KF_ flag.
1578  func (t Token) KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, error) {
1579  	var p *uint16
1580  	err := shGetKnownFolderPath(folderID, flags, t, &p)
1581  	if err != nil {
1582  		return "", err
1583  	}
1584  	defer CoTaskMemFree(unsafe.Pointer(p))
1585  	return UTF16PtrToString(p), nil
1586  }
1587  
1588  // RtlGetVersion returns the version of the underlying operating system, ignoring
1589  // manifest semantics but is affected by the application compatibility layer.
1590  func RtlGetVersion() *OsVersionInfoEx {
1591  	info := &OsVersionInfoEx{}
1592  	info.osVersionInfoSize = uint32(unsafe.Sizeof(*info))
1593  	// According to documentation, this function always succeeds.
1594  	// The function doesn't even check the validity of the
1595  	// osVersionInfoSize member. Disassembling ntdll.dll indicates
1596  	// that the documentation is indeed correct about that.
1597  	_ = rtlGetVersion(info)
1598  	return info
1599  }
1600  
1601  // RtlGetNtVersionNumbers returns the version of the underlying operating system,
1602  // ignoring manifest semantics and the application compatibility layer.
1603  func RtlGetNtVersionNumbers() (majorVersion, minorVersion, buildNumber uint32) {
1604  	rtlGetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber)
1605  	buildNumber &= 0xffff
1606  	return
1607  }
1608  
1609  // GetProcessPreferredUILanguages retrieves the process preferred UI languages.
1610  func GetProcessPreferredUILanguages(flags uint32) ([]string, error) {
1611  	return getUILanguages(flags, getProcessPreferredUILanguages)
1612  }
1613  
1614  // GetThreadPreferredUILanguages retrieves the thread preferred UI languages for the current thread.
1615  func GetThreadPreferredUILanguages(flags uint32) ([]string, error) {
1616  	return getUILanguages(flags, getThreadPreferredUILanguages)
1617  }
1618  
1619  // GetUserPreferredUILanguages retrieves information about the user preferred UI languages.
1620  func GetUserPreferredUILanguages(flags uint32) ([]string, error) {
1621  	return getUILanguages(flags, getUserPreferredUILanguages)
1622  }
1623  
1624  // GetSystemPreferredUILanguages retrieves the system preferred UI languages.
1625  func GetSystemPreferredUILanguages(flags uint32) ([]string, error) {
1626  	return getUILanguages(flags, getSystemPreferredUILanguages)
1627  }
1628  
1629  func getUILanguages(flags uint32, f func(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) error) ([]string, error) {
1630  	size := uint32(128)
1631  	for {
1632  		var numLanguages uint32
1633  		buf := make([]uint16, size)
1634  		err := f(flags, &numLanguages, &buf[0], &size)
1635  		if err == ERROR_INSUFFICIENT_BUFFER {
1636  			continue
1637  		}
1638  		if err != nil {
1639  			return nil, err
1640  		}
1641  		buf = buf[:size]
1642  		if numLanguages == 0 || len(buf) == 0 { // GetProcessPreferredUILanguages may return numLanguages==0 with "\0\0"
1643  			return []string{}, nil
1644  		}
1645  		if buf[len(buf)-1] == 0 {
1646  			buf = buf[:len(buf)-1] // remove terminating null
1647  		}
1648  		languages := make([]string, 0, numLanguages)
1649  		from := 0
1650  		for i, c := range buf {
1651  			if c == 0 {
1652  				languages = append(languages, string(utf16.Decode(buf[from:i])))
1653  				from = i + 1
1654  			}
1655  		}
1656  		return languages, nil
1657  	}
1658  }
1659  
1660  func SetConsoleCursorPosition(console Handle, position Coord) error {
1661  	return setConsoleCursorPosition(console, *((*uint32)(unsafe.Pointer(&position))))
1662  }
1663  
1664  func GetStartupInfo(startupInfo *StartupInfo) error {
1665  	getStartupInfo(startupInfo)
1666  	return nil
1667  }
1668  
1669  func (s NTStatus) Errno() syscall.Errno {
1670  	return rtlNtStatusToDosErrorNoTeb(s)
1671  }
1672  
1673  func langID(pri, sub uint16) uint32 { return uint32(sub)<<10 | uint32(pri) }
1674  
1675  func (s NTStatus) Error() string {
1676  	b := make([]uint16, 300)
1677  	n, err := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_ARGUMENT_ARRAY, modntdll.Handle(), uint32(s), langID(LANG_ENGLISH, SUBLANG_ENGLISH_US), b, nil)
1678  	if err != nil {
1679  		return fmt.Sprintf("NTSTATUS 0x%08x", uint32(s))
1680  	}
1681  	// trim terminating \r and \n
1682  	for ; n > 0 && (b[n-1] == '\n' || b[n-1] == '\r'); n-- {
1683  	}
1684  	return string(utf16.Decode(b[:n]))
1685  }
1686  
1687  // NewNTUnicodeString returns a new NTUnicodeString structure for use with native
1688  // NT APIs that work over the NTUnicodeString type. Note that most Windows APIs
1689  // do not use NTUnicodeString, and instead UTF16PtrFromString should be used for
1690  // the more common *uint16 string type.
1691  func NewNTUnicodeString(s string) (*NTUnicodeString, error) {
1692  	s16, err := UTF16FromString(s)
1693  	if err != nil {
1694  		return nil, err
1695  	}
1696  	n := uint16(len(s16) * 2)
1697  	return &NTUnicodeString{
1698  		Length:        n - 2, // subtract 2 bytes for the NULL terminator
1699  		MaximumLength: n,
1700  		Buffer:        &s16[0],
1701  	}, nil
1702  }
1703  
1704  // Slice returns a uint16 slice that aliases the data in the NTUnicodeString.
1705  func (s *NTUnicodeString) Slice() []uint16 {
1706  	// Note: this rounds the length down, if it happens
1707  	// to (incorrectly) be odd. Probably safer than rounding up.
1708  	return unsafe.Slice(s.Buffer, s.MaximumLength/2)[:s.Length/2]
1709  }
1710  
1711  func (s *NTUnicodeString) String() string {
1712  	return UTF16ToString(s.Slice())
1713  }
1714  
1715  // NewNTString returns a new NTString structure for use with native
1716  // NT APIs that work over the NTString type. Note that most Windows APIs
1717  // do not use NTString, and instead UTF16PtrFromString should be used for
1718  // the more common *uint16 string type.
1719  func NewNTString(s string) (*NTString, error) {
1720  	var nts NTString
1721  	s8, err := BytePtrFromString(s)
1722  	if err != nil {
1723  		return nil, err
1724  	}
1725  	RtlInitString(&nts, s8)
1726  	return &nts, nil
1727  }
1728  
1729  // Slice returns a byte slice that aliases the data in the NTString.
1730  func (s *NTString) Slice() []byte {
1731  	slice := unsafe.Slice(s.Buffer, s.MaximumLength)
1732  	return slice[:s.Length]
1733  }
1734  
1735  func (s *NTString) String() string {
1736  	return ByteSliceToString(s.Slice())
1737  }
1738  
1739  // FindResource resolves a resource of the given name and resource type.
1740  func FindResource(module Handle, name, resType ResourceIDOrString) (Handle, error) {
1741  	var namePtr, resTypePtr uintptr
1742  	var name16, resType16 *uint16
1743  	var err error
1744  	resolvePtr := func(i interface{}, keep **uint16) (uintptr, error) {
1745  		switch v := i.(type) {
1746  		case string:
1747  			*keep, err = UTF16PtrFromString(v)
1748  			if err != nil {
1749  				return 0, err
1750  			}
1751  			return uintptr(unsafe.Pointer(*keep)), nil
1752  		case ResourceID:
1753  			return uintptr(v), nil
1754  		}
1755  		return 0, errorspkg.New("parameter must be a ResourceID or a string")
1756  	}
1757  	namePtr, err = resolvePtr(name, &name16)
1758  	if err != nil {
1759  		return 0, err
1760  	}
1761  	resTypePtr, err = resolvePtr(resType, &resType16)
1762  	if err != nil {
1763  		return 0, err
1764  	}
1765  	resInfo, err := findResource(module, namePtr, resTypePtr)
1766  	runtime.KeepAlive(name16)
1767  	runtime.KeepAlive(resType16)
1768  	return resInfo, err
1769  }
1770  
1771  func LoadResourceData(module, resInfo Handle) (data []byte, err error) {
1772  	size, err := SizeofResource(module, resInfo)
1773  	if err != nil {
1774  		return
1775  	}
1776  	resData, err := LoadResource(module, resInfo)
1777  	if err != nil {
1778  		return
1779  	}
1780  	ptr, err := LockResource(resData)
1781  	if err != nil {
1782  		return
1783  	}
1784  	data = unsafe.Slice((*byte)(unsafe.Pointer(ptr)), size)
1785  	return
1786  }
1787  
1788  // PSAPI_WORKING_SET_EX_BLOCK contains extended working set information for a page.
1789  type PSAPI_WORKING_SET_EX_BLOCK uint64
1790  
1791  // Valid returns the validity of this page.
1792  // If this bit is 1, the subsequent members are valid; otherwise they should be ignored.
1793  func (b PSAPI_WORKING_SET_EX_BLOCK) Valid() bool {
1794  	return (b & 1) == 1
1795  }
1796  
1797  // ShareCount is the number of processes that share this page. The maximum value of this member is 7.
1798  func (b PSAPI_WORKING_SET_EX_BLOCK) ShareCount() uint64 {
1799  	return b.intField(1, 3)
1800  }
1801  
1802  // Win32Protection is the memory protection attributes of the page. For a list of values, see
1803  // https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants
1804  func (b PSAPI_WORKING_SET_EX_BLOCK) Win32Protection() uint64 {
1805  	return b.intField(4, 11)
1806  }
1807  
1808  // Shared returns the shared status of this page.
1809  // If this bit is 1, the page can be shared.
1810  func (b PSAPI_WORKING_SET_EX_BLOCK) Shared() bool {
1811  	return (b & (1 << 15)) == 1
1812  }
1813  
1814  // Node is the NUMA node. The maximum value of this member is 63.
1815  func (b PSAPI_WORKING_SET_EX_BLOCK) Node() uint64 {
1816  	return b.intField(16, 6)
1817  }
1818  
1819  // Locked returns the locked status of this page.
1820  // If this bit is 1, the virtual page is locked in physical memory.
1821  func (b PSAPI_WORKING_SET_EX_BLOCK) Locked() bool {
1822  	return (b & (1 << 22)) == 1
1823  }
1824  
1825  // LargePage returns the large page status of this page.
1826  // If this bit is 1, the page is a large page.
1827  func (b PSAPI_WORKING_SET_EX_BLOCK) LargePage() bool {
1828  	return (b & (1 << 23)) == 1
1829  }
1830  
1831  // Bad returns the bad status of this page.
1832  // If this bit is 1, the page is has been reported as bad.
1833  func (b PSAPI_WORKING_SET_EX_BLOCK) Bad() bool {
1834  	return (b & (1 << 31)) == 1
1835  }
1836  
1837  // intField extracts an integer field in the PSAPI_WORKING_SET_EX_BLOCK union.
1838  func (b PSAPI_WORKING_SET_EX_BLOCK) intField(start, length int) uint64 {
1839  	var mask PSAPI_WORKING_SET_EX_BLOCK
1840  	for pos := start; pos < start+length; pos++ {
1841  		mask |= (1 << pos)
1842  	}
1843  
1844  	masked := b & mask
1845  	return uint64(masked >> start)
1846  }
1847  
1848  // PSAPI_WORKING_SET_EX_INFORMATION contains extended working set information for a process.
1849  type PSAPI_WORKING_SET_EX_INFORMATION struct {
1850  	// The virtual address.
1851  	VirtualAddress Pointer
1852  	// A PSAPI_WORKING_SET_EX_BLOCK union that indicates the attributes of the page at VirtualAddress.
1853  	VirtualAttributes PSAPI_WORKING_SET_EX_BLOCK
1854  }
1855  
1856  // CreatePseudoConsole creates a windows pseudo console.
1857  func CreatePseudoConsole(size Coord, in Handle, out Handle, flags uint32, pconsole *Handle) error {
1858  	// We need this wrapper to manually cast Coord to uint32. The autogenerated wrappers only
1859  	// accept arguments that can be casted to uintptr, and Coord can't.
1860  	return createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), in, out, flags, pconsole)
1861  }
1862  
1863  // ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`.
1864  func ResizePseudoConsole(pconsole Handle, size Coord) error {
1865  	// We need this wrapper to manually cast Coord to uint32. The autogenerated wrappers only
1866  	// accept arguments that can be casted to uintptr, and Coord can't.
1867  	return resizePseudoConsole(pconsole, *((*uint32)(unsafe.Pointer(&size))))
1868  }
1869  
1870  // DCB constants. See https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-dcb.
1871  const (
1872  	CBR_110    = 110
1873  	CBR_300    = 300
1874  	CBR_600    = 600
1875  	CBR_1200   = 1200
1876  	CBR_2400   = 2400
1877  	CBR_4800   = 4800
1878  	CBR_9600   = 9600
1879  	CBR_14400  = 14400
1880  	CBR_19200  = 19200
1881  	CBR_38400  = 38400
1882  	CBR_57600  = 57600
1883  	CBR_115200 = 115200
1884  	CBR_128000 = 128000
1885  	CBR_256000 = 256000
1886  
1887  	DTR_CONTROL_DISABLE   = 0x00000000
1888  	DTR_CONTROL_ENABLE    = 0x00000010
1889  	DTR_CONTROL_HANDSHAKE = 0x00000020
1890  
1891  	RTS_CONTROL_DISABLE   = 0x00000000
1892  	RTS_CONTROL_ENABLE    = 0x00001000
1893  	RTS_CONTROL_HANDSHAKE = 0x00002000
1894  	RTS_CONTROL_TOGGLE    = 0x00003000
1895  
1896  	NOPARITY    = 0
1897  	ODDPARITY   = 1
1898  	EVENPARITY  = 2
1899  	MARKPARITY  = 3
1900  	SPACEPARITY = 4
1901  
1902  	ONESTOPBIT   = 0
1903  	ONE5STOPBITS = 1
1904  	TWOSTOPBITS  = 2
1905  )
1906  
1907  // EscapeCommFunction constants. See https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-escapecommfunction.
1908  const (
1909  	SETXOFF  = 1
1910  	SETXON   = 2
1911  	SETRTS   = 3
1912  	CLRRTS   = 4
1913  	SETDTR   = 5
1914  	CLRDTR   = 6
1915  	SETBREAK = 8
1916  	CLRBREAK = 9
1917  )
1918  
1919  // PurgeComm constants. See https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-purgecomm.
1920  const (
1921  	PURGE_TXABORT = 0x0001
1922  	PURGE_RXABORT = 0x0002
1923  	PURGE_TXCLEAR = 0x0004
1924  	PURGE_RXCLEAR = 0x0008
1925  )
1926  
1927  // SetCommMask constants. See https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setcommmask.
1928  const (
1929  	EV_RXCHAR  = 0x0001
1930  	EV_RXFLAG  = 0x0002
1931  	EV_TXEMPTY = 0x0004
1932  	EV_CTS     = 0x0008
1933  	EV_DSR     = 0x0010
1934  	EV_RLSD    = 0x0020
1935  	EV_BREAK   = 0x0040
1936  	EV_ERR     = 0x0080
1937  	EV_RING    = 0x0100
1938  )
1939