text: // Copyright 2011 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  package windows
  
  import "syscall"
  
  const (
  	// Windows errors.
  	ERROR_FILE_NOT_FOUND         syscall.Errno = 2
  	ERROR_PATH_NOT_FOUND         syscall.Errno = 3
  	ERROR_ACCESS_DENIED          syscall.Errno = 5
  	ERROR_NO_MORE_FILES          syscall.Errno = 18
  	ERROR_HANDLE_EOF             syscall.Errno = 38
  	ERROR_NETNAME_DELETED        syscall.Errno = 64
  	ERROR_FILE_EXISTS            syscall.Errno = 80
  	ERROR_BROKEN_PIPE            syscall.Errno = 109
  	ERROR_BUFFER_OVERFLOW        syscall.Errno = 111
  	ERROR_INSUFFICIENT_BUFFER    syscall.Errno = 122
  	ERROR_MOD_NOT_FOUND          syscall.Errno = 126
  	ERROR_PROC_NOT_FOUND         syscall.Errno = 127
  	ERROR_ALREADY_EXISTS         syscall.Errno = 183
  	ERROR_ENVVAR_NOT_FOUND       syscall.Errno = 203
  	ERROR_MORE_DATA              syscall.Errno = 234
  	ERROR_OPERATION_ABORTED      syscall.Errno = 995
  	ERROR_IO_PENDING             syscall.Errno = 997
  	ERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066
  	ERROR_NOT_FOUND              syscall.Errno = 1168
  	ERROR_PRIVILEGE_NOT_HELD     syscall.Errno = 1314
  	WSAEACCES                    syscall.Errno = 10013
  	WSAEMSGSIZE                  syscall.Errno = 10040
  	WSAECONNRESET                syscall.Errno = 10054
  )
  
  const (
  	// Invented values to support what package os expects.
  	O_RDONLY   = 0x00000
  	O_WRONLY   = 0x00001
  	O_RDWR     = 0x00002
  	O_CREAT    = 0x00040
  	O_EXCL     = 0x00080
  	O_NOCTTY   = 0x00100
  	O_TRUNC    = 0x00200
  	O_NONBLOCK = 0x00800
  	O_APPEND   = 0x00400
  	O_SYNC     = 0x01000
  	O_ASYNC    = 0x02000
  	O_CLOEXEC  = 0x80000
  )
  
  const (
  	// More invented values for signals
  	SIGHUP  = Signal(0x1)
  	SIGINT  = Signal(0x2)
  	SIGQUIT = Signal(0x3)
  	SIGILL  = Signal(0x4)
  	SIGTRAP = Signal(0x5)
  	SIGABRT = Signal(0x6)
  	SIGBUS  = Signal(0x7)
  	SIGFPE  = Signal(0x8)
  	SIGKILL = Signal(0x9)
  	SIGSEGV = Signal(0xb)
  	SIGPIPE = Signal(0xd)
  	SIGALRM = Signal(0xe)
  	SIGTERM = Signal(0xf)
  )
  
  var signals = [...]string{
  	1:  "hangup",
  	2:  "interrupt",
  	3:  "quit",
  	4:  "illegal instruction",
  	5:  "trace/breakpoint trap",
  	6:  "aborted",
  	7:  "bus error",
  	8:  "floating point exception",
  	9:  "killed",
  	10: "user defined signal 1",
  	11: "segmentation fault",
  	12: "user defined signal 2",
  	13: "broken pipe",
  	14: "alarm clock",
  	15: "terminated",
  }
  
  const (
  	GENERIC_READ    = 0x80000000
  	GENERIC_WRITE   = 0x40000000
  	GENERIC_EXECUTE = 0x20000000
  	GENERIC_ALL     = 0x10000000
  
  	FILE_LIST_DIRECTORY   = 0x00000001
  	FILE_APPEND_DATA      = 0x00000004
  	FILE_WRITE_ATTRIBUTES = 0x00000100
  
  	FILE_SHARE_READ   = 0x00000001
  	FILE_SHARE_WRITE  = 0x00000002
  	FILE_SHARE_DELETE = 0x00000004
  
  	FILE_ATTRIBUTE_READONLY              = 0x00000001
  	FILE_ATTRIBUTE_HIDDEN                = 0x00000002
  	FILE_ATTRIBUTE_SYSTEM                = 0x00000004
  	FILE_ATTRIBUTE_DIRECTORY             = 0x00000010
  	FILE_ATTRIBUTE_ARCHIVE               = 0x00000020
  	FILE_ATTRIBUTE_DEVICE                = 0x00000040
  	FILE_ATTRIBUTE_NORMAL                = 0x00000080
  	FILE_ATTRIBUTE_TEMPORARY             = 0x00000100
  	FILE_ATTRIBUTE_SPARSE_FILE           = 0x00000200
  	FILE_ATTRIBUTE_REPARSE_POINT         = 0x00000400
  	FILE_ATTRIBUTE_COMPRESSED            = 0x00000800
  	FILE_ATTRIBUTE_OFFLINE               = 0x00001000
  	FILE_ATTRIBUTE_NOT_CONTENT_INDEXED   = 0x00002000
  	FILE_ATTRIBUTE_ENCRYPTED             = 0x00004000
  	FILE_ATTRIBUTE_INTEGRITY_STREAM      = 0x00008000
  	FILE_ATTRIBUTE_VIRTUAL               = 0x00010000
  	FILE_ATTRIBUTE_NO_SCRUB_DATA         = 0x00020000
  	FILE_ATTRIBUTE_RECALL_ON_OPEN        = 0x00040000
  	FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = 0x00400000
  
  	INVALID_FILE_ATTRIBUTES = 0xffffffff
  
  	CREATE_NEW        = 1
  	CREATE_ALWAYS     = 2
  	OPEN_EXISTING     = 3
  	OPEN_ALWAYS       = 4
  	TRUNCATE_EXISTING = 5
  
  	FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
  	FILE_FLAG_BACKUP_SEMANTICS   = 0x02000000
  	FILE_FLAG_OVERLAPPED         = 0x40000000
  
  	HANDLE_FLAG_INHERIT    = 0x00000001
  	STARTF_USESTDHANDLES   = 0x00000100
  	STARTF_USESHOWWINDOW   = 0x00000001
  	DUPLICATE_CLOSE_SOURCE = 0x00000001
  	DUPLICATE_SAME_ACCESS  = 0x00000002
  
  	STD_INPUT_HANDLE  = -10 & (1<<32 - 1)
  	STD_OUTPUT_HANDLE = -11 & (1<<32 - 1)
  	STD_ERROR_HANDLE  = -12 & (1<<32 - 1)
  
  	FILE_BEGIN   = 0
  	FILE_CURRENT = 1
  	FILE_END     = 2
  
  	LANG_ENGLISH       = 0x09
  	SUBLANG_ENGLISH_US = 0x01
  
  	FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
  	FORMAT_MESSAGE_IGNORE_INSERTS  = 512
  	FORMAT_MESSAGE_FROM_STRING     = 1024
  	FORMAT_MESSAGE_FROM_HMODULE    = 2048
  	FORMAT_MESSAGE_FROM_SYSTEM     = 4096
  	FORMAT_MESSAGE_ARGUMENT_ARRAY  = 8192
  	FORMAT_MESSAGE_MAX_WIDTH_MASK  = 255
  
  	MAX_PATH      = 260
  	MAX_LONG_PATH = 32768
  
  	MAX_COMPUTERNAME_LENGTH = 15
  
  	TIME_ZONE_ID_UNKNOWN  = 0
  	TIME_ZONE_ID_STANDARD = 1
  
  	TIME_ZONE_ID_DAYLIGHT = 2
  	IGNORE                = 0
  	INFINITE              = 0xffffffff
  
  	WAIT_TIMEOUT   = 258
  	WAIT_ABANDONED = 0x00000080
  	WAIT_OBJECT_0  = 0x00000000
  	WAIT_FAILED    = 0xFFFFFFFF
  
  	PROCESS_TERMINATE         = 1
  	PROCESS_QUERY_INFORMATION = 0x00000400
  	SYNCHRONIZE               = 0x00100000
  
  	FILE_MAP_COPY    = 0x01
  	FILE_MAP_WRITE   = 0x02
  	FILE_MAP_READ    = 0x04
  	FILE_MAP_EXECUTE = 0x20
  
  	CTRL_C_EVENT     = 0
  	CTRL_BREAK_EVENT = 1
  
  	// Windows reserves errors >= 1<<29 for application use.
  	APPLICATION_ERROR = 1 << 29
  )
  
  const (
  	// Process creation flags.
  	CREATE_BREAKAWAY_FROM_JOB        = 0x01000000
  	CREATE_DEFAULT_ERROR_MODE        = 0x04000000
  	CREATE_NEW_CONSOLE               = 0x00000010
  	CREATE_NEW_PROCESS_GROUP         = 0x00000200
  	CREATE_NO_WINDOW                 = 0x08000000
  	CREATE_PROTECTED_PROCESS         = 0x00040000
  	CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000
  	CREATE_SEPARATE_WOW_VDM          = 0x00000800
  	CREATE_SHARED_WOW_VDM            = 0x00001000
  	CREATE_SUSPENDED                 = 0x00000004
  	CREATE_UNICODE_ENVIRONMENT       = 0x00000400
  	DEBUG_ONLY_THIS_PROCESS          = 0x00000002
  	DEBUG_PROCESS                    = 0x00000001
  	DETACHED_PROCESS                 = 0x00000008
  	EXTENDED_STARTUPINFO_PRESENT     = 0x00080000
  	INHERIT_PARENT_AFFINITY          = 0x00010000
  )
  
  const (
  	// flags for CreateToolhelp32Snapshot
  	TH32CS_SNAPHEAPLIST = 0x01
  	TH32CS_SNAPPROCESS  = 0x02
  	TH32CS_SNAPTHREAD   = 0x04
  	TH32CS_SNAPMODULE   = 0x08
  	TH32CS_SNAPMODULE32 = 0x10
  	TH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD
  	TH32CS_INHERIT      = 0x80000000
  )
  
  const (
  	// filters for ReadDirectoryChangesW
  	FILE_NOTIFY_CHANGE_FILE_NAME   = 0x001
  	FILE_NOTIFY_CHANGE_DIR_NAME    = 0x002
  	FILE_NOTIFY_CHANGE_ATTRIBUTES  = 0x004
  	FILE_NOTIFY_CHANGE_SIZE        = 0x008
  	FILE_NOTIFY_CHANGE_LAST_WRITE  = 0x010
  	FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020
  	FILE_NOTIFY_CHANGE_CREATION    = 0x040
  	FILE_NOTIFY_CHANGE_SECURITY    = 0x100
  )
  
  const (
  	// do not reorder
  	FILE_ACTION_ADDED = iota + 1
  	FILE_ACTION_REMOVED
  	FILE_ACTION_MODIFIED
  	FILE_ACTION_RENAMED_OLD_NAME
  	FILE_ACTION_RENAMED_NEW_NAME
  )
  
  const (
  	// wincrypt.h
  	PROV_RSA_FULL                    = 1
  	PROV_RSA_SIG                     = 2
  	PROV_DSS                         = 3
  	PROV_FORTEZZA                    = 4
  	PROV_MS_EXCHANGE                 = 5
  	PROV_SSL                         = 6
  	PROV_RSA_SCHANNEL                = 12
  	PROV_DSS_DH                      = 13
  	PROV_EC_ECDSA_SIG                = 14
  	PROV_EC_ECNRA_SIG                = 15
  	PROV_EC_ECDSA_FULL               = 16
  	PROV_EC_ECNRA_FULL               = 17
  	PROV_DH_SCHANNEL                 = 18
  	PROV_SPYRUS_LYNKS                = 20
  	PROV_RNG                         = 21
  	PROV_INTEL_SEC                   = 22
  	PROV_REPLACE_OWF                 = 23
  	PROV_RSA_AES                     = 24
  	CRYPT_VERIFYCONTEXT              = 0xF0000000
  	CRYPT_NEWKEYSET                  = 0x00000008
  	CRYPT_DELETEKEYSET               = 0x00000010
  	CRYPT_MACHINE_KEYSET             = 0x00000020
  	CRYPT_SILENT                     = 0x00000040
  	CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080
  
  	USAGE_MATCH_TYPE_AND = 0
  	USAGE_MATCH_TYPE_OR  = 1
  
  	/* msgAndCertEncodingType values for CertOpenStore function */
  	X509_ASN_ENCODING   = 0x00000001
  	PKCS_7_ASN_ENCODING = 0x00010000
  
  	/* storeProvider values for CertOpenStore function */
  	CERT_STORE_PROV_MSG               = 1
  	CERT_STORE_PROV_MEMORY            = 2
  	CERT_STORE_PROV_FILE              = 3
  	CERT_STORE_PROV_REG               = 4
  	CERT_STORE_PROV_PKCS7             = 5
  	CERT_STORE_PROV_SERIALIZED        = 6
  	CERT_STORE_PROV_FILENAME_A        = 7
  	CERT_STORE_PROV_FILENAME_W        = 8
  	CERT_STORE_PROV_FILENAME          = CERT_STORE_PROV_FILENAME_W
  	CERT_STORE_PROV_SYSTEM_A          = 9
  	CERT_STORE_PROV_SYSTEM_W          = 10
  	CERT_STORE_PROV_SYSTEM            = CERT_STORE_PROV_SYSTEM_W
  	CERT_STORE_PROV_COLLECTION        = 11
  	CERT_STORE_PROV_SYSTEM_REGISTRY_A = 12
  	CERT_STORE_PROV_SYSTEM_REGISTRY_W = 13
  	CERT_STORE_PROV_SYSTEM_REGISTRY   = CERT_STORE_PROV_SYSTEM_REGISTRY_W
  	CERT_STORE_PROV_PHYSICAL_W        = 14
  	CERT_STORE_PROV_PHYSICAL          = CERT_STORE_PROV_PHYSICAL_W
  	CERT_STORE_PROV_SMART_CARD_W      = 15
  	CERT_STORE_PROV_SMART_CARD        = CERT_STORE_PROV_SMART_CARD_W
  	CERT_STORE_PROV_LDAP_W            = 16
  	CERT_STORE_PROV_LDAP              = CERT_STORE_PROV_LDAP_W
  	CERT_STORE_PROV_PKCS12            = 17
  
  	/* store characteristics (low WORD of flag) for CertOpenStore function */
  	CERT_STORE_NO_CRYPT_RELEASE_FLAG            = 0x00000001
  	CERT_STORE_SET_LOCALIZED_NAME_FLAG          = 0x00000002
  	CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004
  	CERT_STORE_DELETE_FLAG                      = 0x00000010
  	CERT_STORE_UNSAFE_PHYSICAL_FLAG             = 0x00000020
  	CERT_STORE_SHARE_STORE_FLAG                 = 0x00000040
  	CERT_STORE_SHARE_CONTEXT_FLAG               = 0x00000080
  	CERT_STORE_MANIFOLD_FLAG                    = 0x00000100
  	CERT_STORE_ENUM_ARCHIVED_FLAG               = 0x00000200
  	CERT_STORE_UPDATE_KEYID_FLAG                = 0x00000400
  	CERT_STORE_BACKUP_RESTORE_FLAG              = 0x00000800
  	CERT_STORE_MAXIMUM_ALLOWED_FLAG             = 0x00001000
  	CERT_STORE_CREATE_NEW_FLAG                  = 0x00002000
  	CERT_STORE_OPEN_EXISTING_FLAG               = 0x00004000
  	CERT_STORE_READONLY_FLAG                    = 0x00008000
  
  	/* store locations (high WORD of flag) for CertOpenStore function */
  	CERT_SYSTEM_STORE_CURRENT_USER               = 0x00010000
  	CERT_SYSTEM_STORE_LOCAL_MACHINE              = 0x00020000
  	CERT_SYSTEM_STORE_CURRENT_SERVICE            = 0x00040000
  	CERT_SYSTEM_STORE_SERVICES                   = 0x00050000
  	CERT_SYSTEM_STORE_USERS                      = 0x00060000
  	CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY  = 0x00070000
  	CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 0x00080000
  	CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE   = 0x00090000
  	CERT_SYSTEM_STORE_UNPROTECTED_FLAG           = 0x40000000
  	CERT_SYSTEM_STORE_RELOCATE_FLAG              = 0x80000000
  
  	/* Miscellaneous high-WORD flags for CertOpenStore function */
  	CERT_REGISTRY_STORE_REMOTE_FLAG      = 0x00010000
  	CERT_REGISTRY_STORE_SERIALIZED_FLAG  = 0x00020000
  	CERT_REGISTRY_STORE_ROAMING_FLAG     = 0x00040000
  	CERT_REGISTRY_STORE_MY_IE_DIRTY_FLAG = 0x00080000
  	CERT_REGISTRY_STORE_LM_GPT_FLAG      = 0x01000000
  	CERT_REGISTRY_STORE_CLIENT_GPT_FLAG  = 0x80000000
  	CERT_FILE_STORE_COMMIT_ENABLE_FLAG   = 0x00010000
  	CERT_LDAP_STORE_SIGN_FLAG            = 0x00010000
  	CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG  = 0x00020000
  	CERT_LDAP_STORE_OPENED_FLAG          = 0x00040000
  	CERT_LDAP_STORE_UNBIND_FLAG          = 0x00080000
  
  	/* addDisposition values for CertAddCertificateContextToStore function */
  	CERT_STORE_ADD_NEW                                 = 1
  	CERT_STORE_ADD_USE_EXISTING                        = 2
  	CERT_STORE_ADD_REPLACE_EXISTING                    = 3
  	CERT_STORE_ADD_ALWAYS                              = 4
  	CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5
  	CERT_STORE_ADD_NEWER                               = 6
  	CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES            = 7
  
  	/* ErrorStatus values for CertTrustStatus struct */
  	CERT_TRUST_NO_ERROR                          = 0x00000000
  	CERT_TRUST_IS_NOT_TIME_VALID                 = 0x00000001
  	CERT_TRUST_IS_REVOKED                        = 0x00000004
  	CERT_TRUST_IS_NOT_SIGNATURE_VALID            = 0x00000008
  	CERT_TRUST_IS_NOT_VALID_FOR_USAGE            = 0x00000010
  	CERT_TRUST_IS_UNTRUSTED_ROOT                 = 0x00000020
  	CERT_TRUST_REVOCATION_STATUS_UNKNOWN         = 0x00000040
  	CERT_TRUST_IS_CYCLIC                         = 0x00000080
  	CERT_TRUST_INVALID_EXTENSION                 = 0x00000100
  	CERT_TRUST_INVALID_POLICY_CONSTRAINTS        = 0x00000200
  	CERT_TRUST_INVALID_BASIC_CONSTRAINTS         = 0x00000400
  	CERT_TRUST_INVALID_NAME_CONSTRAINTS          = 0x00000800
  	CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000
  	CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT   = 0x00002000
  	CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000
  	CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT      = 0x00008000
  	CERT_TRUST_IS_PARTIAL_CHAIN                  = 0x00010000
  	CERT_TRUST_CTL_IS_NOT_TIME_VALID             = 0x00020000
  	CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID        = 0x00040000
  	CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE        = 0x00080000
  	CERT_TRUST_HAS_WEAK_SIGNATURE                = 0x00100000
  	CERT_TRUST_IS_OFFLINE_REVOCATION             = 0x01000000
  	CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY          = 0x02000000
  	CERT_TRUST_IS_EXPLICIT_DISTRUST              = 0x04000000
  	CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT    = 0x08000000
  
  	/* InfoStatus values for CertTrustStatus struct */
  	CERT_TRUST_HAS_EXACT_MATCH_ISSUER        = 0x00000001
  	CERT_TRUST_HAS_KEY_MATCH_ISSUER          = 0x00000002
  	CERT_TRUST_HAS_NAME_MATCH_ISSUER         = 0x00000004
  	CERT_TRUST_IS_SELF_SIGNED                = 0x00000008
  	CERT_TRUST_HAS_PREFERRED_ISSUER          = 0x00000100
  	CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY     = 0x00000400
  	CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS    = 0x00000400
  	CERT_TRUST_IS_PEER_TRUSTED               = 0x00000800
  	CERT_TRUST_HAS_CRL_VALIDITY_EXTENDED     = 0x00001000
  	CERT_TRUST_IS_FROM_EXCLUSIVE_TRUST_STORE = 0x00002000
  	CERT_TRUST_IS_CA_TRUSTED                 = 0x00004000
  	CERT_TRUST_IS_COMPLEX_CHAIN              = 0x00010000
  
  	/* policyOID values for CertVerifyCertificateChainPolicy function */
  	CERT_CHAIN_POLICY_BASE              = 1
  	CERT_CHAIN_POLICY_AUTHENTICODE      = 2
  	CERT_CHAIN_POLICY_AUTHENTICODE_TS   = 3
  	CERT_CHAIN_POLICY_SSL               = 4
  	CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5
  	CERT_CHAIN_POLICY_NT_AUTH           = 6
  	CERT_CHAIN_POLICY_MICROSOFT_ROOT    = 7
  	CERT_CHAIN_POLICY_EV                = 8
  	CERT_CHAIN_POLICY_SSL_F12           = 9
  
  	CERT_E_EXPIRED       = 0x800B0101
  	CERT_E_ROLE          = 0x800B0103
  	CERT_E_PURPOSE       = 0x800B0106
  	CERT_E_UNTRUSTEDROOT = 0x800B0109
  	CERT_E_CN_NO_MATCH   = 0x800B010F
  
  	/* AuthType values for SSLExtraCertChainPolicyPara struct */
  	AUTHTYPE_CLIENT = 1
  	AUTHTYPE_SERVER = 2
  
  	/* Checks values for SSLExtraCertChainPolicyPara struct */
  	SECURITY_FLAG_IGNORE_REVOCATION        = 0x00000080
  	SECURITY_FLAG_IGNORE_UNKNOWN_CA        = 0x00000100
  	SECURITY_FLAG_IGNORE_WRONG_USAGE       = 0x00000200
  	SECURITY_FLAG_IGNORE_CERT_CN_INVALID   = 0x00001000
  	SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000
  )
  
  var (
  	OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00")
  	OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00")
  	OID_SGC_NETSCAPE        = []byte("2.16.840.1.113730.4.1\x00")
  )
  
  // Pointer represents a pointer to an arbitrary Windows type.
  //
  // Pointer-typed fields may point to one of many different types. It's
  // up to the caller to provide a pointer to the appropriate type, cast
  // to Pointer. The caller must obey the unsafe.Pointer rules while
  // doing so.
  type Pointer *struct{}
  
  // Invented values to support what package os expects.
  type Timeval struct {
  	Sec  int32
  	Usec int32
  }
  
  func (tv *Timeval) Nanoseconds() int64 {
  	return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3
  }
  
  func NsecToTimeval(nsec int64) (tv Timeval) {
  	tv.Sec = int32(nsec / 1e9)
  	tv.Usec = int32(nsec % 1e9 / 1e3)
  	return
  }
  
  type SecurityAttributes struct {
  	Length             uint32
  	SecurityDescriptor uintptr
  	InheritHandle      uint32
  }
  
  type Overlapped struct {
  	Internal     uintptr
  	InternalHigh uintptr
  	Offset       uint32
  	OffsetHigh   uint32
  	HEvent       Handle
  }
  
  type FileNotifyInformation struct {
  	NextEntryOffset uint32
  	Action          uint32
  	FileNameLength  uint32
  	FileName        uint16
  }
  
  type Filetime struct {
  	LowDateTime  uint32
  	HighDateTime uint32
  }
  
  // Nanoseconds returns Filetime ft in nanoseconds
  // since Epoch (00:00:00 UTC, January 1, 1970).
  func (ft *Filetime) Nanoseconds() int64 {
  	// 100-nanosecond intervals since January 1, 1601
  	nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime)
  	// change starting time to the Epoch (00:00:00 UTC, January 1, 1970)
  	nsec -= 116444736000000000
  	// convert into nanoseconds
  	nsec *= 100
  	return nsec
  }
  
  func NsecToFiletime(nsec int64) (ft Filetime) {
  	// convert into 100-nanosecond
  	nsec /= 100
  	// change starting time to January 1, 1601
  	nsec += 116444736000000000
  	// split into high / low
  	ft.LowDateTime = uint32(nsec & 0xffffffff)
  	ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff)
  	return ft
  }
  
  type Win32finddata struct {
  	FileAttributes    uint32
  	CreationTime      Filetime
  	LastAccessTime    Filetime
  	LastWriteTime     Filetime
  	FileSizeHigh      uint32
  	FileSizeLow       uint32
  	Reserved0         uint32
  	Reserved1         uint32
  	FileName          [MAX_PATH - 1]uint16
  	AlternateFileName [13]uint16
  }
  
  // This is the actual system call structure.
  // Win32finddata is what we committed to in Go 1.
  type win32finddata1 struct {
  	FileAttributes    uint32
  	CreationTime      Filetime
  	LastAccessTime    Filetime
  	LastWriteTime     Filetime
  	FileSizeHigh      uint32
  	FileSizeLow       uint32
  	Reserved0         uint32
  	Reserved1         uint32
  	FileName          [MAX_PATH]uint16
  	AlternateFileName [14]uint16
  }
  
  func copyFindData(dst *Win32finddata, src *win32finddata1) {
  	dst.FileAttributes = src.FileAttributes
  	dst.CreationTime = src.CreationTime
  	dst.LastAccessTime = src.LastAccessTime
  	dst.LastWriteTime = src.LastWriteTime
  	dst.FileSizeHigh = src.FileSizeHigh
  	dst.FileSizeLow = src.FileSizeLow
  	dst.Reserved0 = src.Reserved0
  	dst.Reserved1 = src.Reserved1
  
  	// The src is 1 element bigger than dst, but it must be NUL.
  	copy(dst.FileName[:], src.FileName[:])
  	copy(dst.AlternateFileName[:], src.AlternateFileName[:])
  }
  
  type ByHandleFileInformation struct {
  	FileAttributes     uint32
  	CreationTime       Filetime
  	LastAccessTime     Filetime
  	LastWriteTime      Filetime
  	VolumeSerialNumber uint32
  	FileSizeHigh       uint32
  	FileSizeLow        uint32
  	NumberOfLinks      uint32
  	FileIndexHigh      uint32
  	FileIndexLow       uint32
  }
  
  const (
  	GetFileExInfoStandard = 0
  	GetFileExMaxInfoLevel = 1
  )
  
  type Win32FileAttributeData struct {
  	FileAttributes uint32
  	CreationTime   Filetime
  	LastAccessTime Filetime
  	LastWriteTime  Filetime
  	FileSizeHigh   uint32
  	FileSizeLow    uint32
  }
  
  // ShowWindow constants
  const (
  	// winuser.h
  	SW_HIDE            = 0
  	SW_NORMAL          = 1
  	SW_SHOWNORMAL      = 1
  	SW_SHOWMINIMIZED   = 2
  	SW_SHOWMAXIMIZED   = 3
  	SW_MAXIMIZE        = 3
  	SW_SHOWNOACTIVATE  = 4
  	SW_SHOW            = 5
  	SW_MINIMIZE        = 6
  	SW_SHOWMINNOACTIVE = 7
  	SW_SHOWNA          = 8
  	SW_RESTORE         = 9
  	SW_SHOWDEFAULT     = 10
  	SW_FORCEMINIMIZE   = 11
  )
  
  type StartupInfo struct {
  	Cb            uint32
  	_             *uint16
  	Desktop       *uint16
  	Title         *uint16
  	X             uint32
  	Y             uint32
  	XSize         uint32
  	YSize         uint32
  	XCountChars   uint32
  	YCountChars   uint32
  	FillAttribute uint32
  	Flags         uint32
  	ShowWindow    uint16
  	_             uint16
  	_             *byte
  	StdInput      Handle
  	StdOutput     Handle
  	StdErr        Handle
  }
  
  type ProcessInformation struct {
  	Process   Handle
  	Thread    Handle
  	ProcessId uint32
  	ThreadId  uint32
  }
  
  type ProcessEntry32 struct {
  	Size            uint32
  	Usage           uint32
  	ProcessID       uint32
  	DefaultHeapID   uintptr
  	ModuleID        uint32
  	Threads         uint32
  	ParentProcessID uint32
  	PriClassBase    int32
  	Flags           uint32
  	ExeFile         [MAX_PATH]uint16
  }
  
  type Systemtime struct {
  	Year         uint16
  	Month        uint16
  	DayOfWeek    uint16
  	Day          uint16
  	Hour         uint16
  	Minute       uint16
  	Second       uint16
  	Milliseconds uint16
  }
  
  type Timezoneinformation struct {
  	Bias         int32
  	StandardName [32]uint16
  	StandardDate Systemtime
  	StandardBias int32
  	DaylightName [32]uint16
  	DaylightDate Systemtime
  	DaylightBias int32
  }
  
  // Socket related.
  
  const (
  	AF_UNSPEC  = 0
  	AF_UNIX    = 1
  	AF_INET    = 2
  	AF_INET6   = 23
  	AF_NETBIOS = 17
  
  	SOCK_STREAM    = 1
  	SOCK_DGRAM     = 2
  	SOCK_RAW       = 3
  	SOCK_SEQPACKET = 5
  
  	IPPROTO_IP   = 0
  	IPPROTO_IPV6 = 0x29
  	IPPROTO_TCP  = 6
  	IPPROTO_UDP  = 17
  
  	SOL_SOCKET                = 0xffff
  	SO_REUSEADDR              = 4
  	SO_KEEPALIVE              = 8
  	SO_DONTROUTE              = 16
  	SO_BROADCAST              = 32
  	SO_LINGER                 = 128
  	SO_RCVBUF                 = 0x1002
  	SO_SNDBUF                 = 0x1001
  	SO_UPDATE_ACCEPT_CONTEXT  = 0x700b
  	SO_UPDATE_CONNECT_CONTEXT = 0x7010
  
  	IOC_OUT                            = 0x40000000
  	IOC_IN                             = 0x80000000
  	IOC_VENDOR                         = 0x18000000
  	IOC_INOUT                          = IOC_IN | IOC_OUT
  	IOC_WS2                            = 0x08000000
  	SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6
  	SIO_KEEPALIVE_VALS                 = IOC_IN | IOC_VENDOR | 4
  	SIO_UDP_CONNRESET                  = IOC_IN | IOC_VENDOR | 12
  
  	// cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460
  
  	IP_TOS             = 0x3
  	IP_TTL             = 0x4
  	IP_MULTICAST_IF    = 0x9
  	IP_MULTICAST_TTL   = 0xa
  	IP_MULTICAST_LOOP  = 0xb
  	IP_ADD_MEMBERSHIP  = 0xc
  	IP_DROP_MEMBERSHIP = 0xd
  
  	IPV6_V6ONLY         = 0x1b
  	IPV6_UNICAST_HOPS   = 0x4
  	IPV6_MULTICAST_IF   = 0x9
  	IPV6_MULTICAST_HOPS = 0xa
  	IPV6_MULTICAST_LOOP = 0xb
  	IPV6_JOIN_GROUP     = 0xc
  	IPV6_LEAVE_GROUP    = 0xd
  
  	MSG_OOB       = 0x1
  	MSG_PEEK      = 0x2
  	MSG_DONTROUTE = 0x4
  	MSG_WAITALL   = 0x8
  
  	MSG_TRUNC  = 0x0100
  	MSG_CTRUNC = 0x0200
  	MSG_BCAST  = 0x0400
  	MSG_MCAST  = 0x0800
  
  	SOMAXCONN = 0x7fffffff
  
  	TCP_NODELAY = 1
  
  	SHUT_RD   = 0
  	SHUT_WR   = 1
  	SHUT_RDWR = 2
  
  	WSADESCRIPTION_LEN = 256
  	WSASYS_STATUS_LEN  = 128
  )
  
  type WSABuf struct {
  	Len uint32
  	Buf *byte
  }
  
  type WSAMsg struct {
  	Name        *syscall.RawSockaddrAny
  	Namelen     int32
  	Buffers     *WSABuf
  	BufferCount uint32
  	Control     WSABuf
  	Flags       uint32
  }
  
  // Invented values to support what package os expects.
  const (
  	S_IFMT   = 0x1f000
  	S_IFIFO  = 0x1000
  	S_IFCHR  = 0x2000
  	S_IFDIR  = 0x4000
  	S_IFBLK  = 0x6000
  	S_IFREG  = 0x8000
  	S_IFLNK  = 0xa000
  	S_IFSOCK = 0xc000
  	S_ISUID  = 0x800
  	S_ISGID  = 0x400
  	S_ISVTX  = 0x200
  	S_IRUSR  = 0x100
  	S_IWRITE = 0x80
  	S_IWUSR  = 0x80
  	S_IXUSR  = 0x40
  )
  
  const (
  	FILE_TYPE_CHAR    = 0x0002
  	FILE_TYPE_DISK    = 0x0001
  	FILE_TYPE_PIPE    = 0x0003
  	FILE_TYPE_REMOTE  = 0x8000
  	FILE_TYPE_UNKNOWN = 0x0000
  )
  
  type Hostent struct {
  	Name     *byte
  	Aliases  **byte
  	AddrType uint16
  	Length   uint16
  	AddrList **byte
  }
  
  type Protoent struct {
  	Name    *byte
  	Aliases **byte
  	Proto   uint16
  }
  
  const (
  	DNS_TYPE_A       = 0x0001
  	DNS_TYPE_NS      = 0x0002
  	DNS_TYPE_MD      = 0x0003
  	DNS_TYPE_MF      = 0x0004
  	DNS_TYPE_CNAME   = 0x0005
  	DNS_TYPE_SOA     = 0x0006
  	DNS_TYPE_MB      = 0x0007
  	DNS_TYPE_MG      = 0x0008
  	DNS_TYPE_MR      = 0x0009
  	DNS_TYPE_NULL    = 0x000a
  	DNS_TYPE_WKS     = 0x000b
  	DNS_TYPE_PTR     = 0x000c
  	DNS_TYPE_HINFO   = 0x000d
  	DNS_TYPE_MINFO   = 0x000e
  	DNS_TYPE_MX      = 0x000f
  	DNS_TYPE_TEXT    = 0x0010
  	DNS_TYPE_RP      = 0x0011
  	DNS_TYPE_AFSDB   = 0x0012
  	DNS_TYPE_X25     = 0x0013
  	DNS_TYPE_ISDN    = 0x0014
  	DNS_TYPE_RT      = 0x0015
  	DNS_TYPE_NSAP    = 0x0016
  	DNS_TYPE_NSAPPTR = 0x0017
  	DNS_TYPE_SIG     = 0x0018
  	DNS_TYPE_KEY     = 0x0019
  	DNS_TYPE_PX      = 0x001a
  	DNS_TYPE_GPOS    = 0x001b
  	DNS_TYPE_AAAA    = 0x001c
  	DNS_TYPE_LOC     = 0x001d
  	DNS_TYPE_NXT     = 0x001e
  	DNS_TYPE_EID     = 0x001f
  	DNS_TYPE_NIMLOC  = 0x0020
  	DNS_TYPE_SRV     = 0x0021
  	DNS_TYPE_ATMA    = 0x0022
  	DNS_TYPE_NAPTR   = 0x0023
  	DNS_TYPE_KX      = 0x0024
  	DNS_TYPE_CERT    = 0x0025
  	DNS_TYPE_A6      = 0x0026
  	DNS_TYPE_DNAME   = 0x0027
  	DNS_TYPE_SINK    = 0x0028
  	DNS_TYPE_OPT     = 0x0029
  	DNS_TYPE_DS      = 0x002B
  	DNS_TYPE_RRSIG   = 0x002E
  	DNS_TYPE_NSEC    = 0x002F
  	DNS_TYPE_DNSKEY  = 0x0030
  	DNS_TYPE_DHCID   = 0x0031
  	DNS_TYPE_UINFO   = 0x0064
  	DNS_TYPE_UID     = 0x0065
  	DNS_TYPE_GID     = 0x0066
  	DNS_TYPE_UNSPEC  = 0x0067
  	DNS_TYPE_ADDRS   = 0x00f8
  	DNS_TYPE_TKEY    = 0x00f9
  	DNS_TYPE_TSIG    = 0x00fa
  	DNS_TYPE_IXFR    = 0x00fb
  	DNS_TYPE_AXFR    = 0x00fc
  	DNS_TYPE_MAILB   = 0x00fd
  	DNS_TYPE_MAILA   = 0x00fe
  	DNS_TYPE_ALL     = 0x00ff
  	DNS_TYPE_ANY     = 0x00ff
  	DNS_TYPE_WINS    = 0xff01
  	DNS_TYPE_WINSR   = 0xff02
  	DNS_TYPE_NBSTAT  = 0xff01
  )
  
  const (
  	DNS_INFO_NO_RECORDS = 0x251D
  )
  
  const (
  	// flags inside DNSRecord.Dw
  	DnsSectionQuestion   = 0x0000
  	DnsSectionAnswer     = 0x0001
  	DnsSectionAuthority  = 0x0002
  	DnsSectionAdditional = 0x0003
  )
  
  type DNSSRVData struct {
  	Target   *uint16
  	Priority uint16
  	Weight   uint16
  	Port     uint16
  	Pad      uint16
  }
  
  type DNSPTRData struct {
  	Host *uint16
  }
  
  type DNSMXData struct {
  	NameExchange *uint16
  	Preference   uint16
  	Pad          uint16
  }
  
  type DNSTXTData struct {
  	StringCount uint16
  	StringArray [1]*uint16
  }
  
  type DNSRecord struct {
  	Next     *DNSRecord
  	Name     *uint16
  	Type     uint16
  	Length   uint16
  	Dw       uint32
  	Ttl      uint32
  	Reserved uint32
  	Data     [40]byte
  }
  
  const (
  	TF_DISCONNECT         = 1
  	TF_REUSE_SOCKET       = 2
  	TF_WRITE_BEHIND       = 4
  	TF_USE_DEFAULT_WORKER = 0
  	TF_USE_SYSTEM_THREAD  = 16
  	TF_USE_KERNEL_APC     = 32
  )
  
  type TransmitFileBuffers struct {
  	Head       uintptr
  	HeadLength uint32
  	Tail       uintptr
  	TailLength uint32
  }
  
  const (
  	IFF_UP           = 1
  	IFF_BROADCAST    = 2
  	IFF_LOOPBACK     = 4
  	IFF_POINTTOPOINT = 8
  	IFF_MULTICAST    = 16
  )
  
  const SIO_GET_INTERFACE_LIST = 0x4004747F
  
  // TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old.
  // will be fixed to change variable type as suitable.
  
  type SockaddrGen [24]byte
  
  type InterfaceInfo struct {
  	Flags            uint32
  	Address          SockaddrGen
  	BroadcastAddress SockaddrGen
  	Netmask          SockaddrGen
  }
  
  type IpAddressString struct {
  	String [16]byte
  }
  
  type IpMaskString IpAddressString
  
  type IpAddrString struct {
  	Next      *IpAddrString
  	IpAddress IpAddressString
  	IpMask    IpMaskString
  	Context   uint32
  }
  
  const MAX_ADAPTER_NAME_LENGTH = 256
  const MAX_ADAPTER_DESCRIPTION_LENGTH = 128
  const MAX_ADAPTER_ADDRESS_LENGTH = 8
  
  type IpAdapterInfo struct {
  	Next                *IpAdapterInfo
  	ComboIndex          uint32
  	AdapterName         [MAX_ADAPTER_NAME_LENGTH + 4]byte
  	Description         [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte
  	AddressLength       uint32
  	Address             [MAX_ADAPTER_ADDRESS_LENGTH]byte
  	Index               uint32
  	Type                uint32
  	DhcpEnabled         uint32
  	CurrentIpAddress    *IpAddrString
  	IpAddressList       IpAddrString
  	GatewayList         IpAddrString
  	DhcpServer          IpAddrString
  	HaveWins            bool
  	PrimaryWinsServer   IpAddrString
  	SecondaryWinsServer IpAddrString
  	LeaseObtained       int64
  	LeaseExpires        int64
  }
  
  const MAXLEN_PHYSADDR = 8
  const MAX_INTERFACE_NAME_LEN = 256
  const MAXLEN_IFDESCR = 256
  
  type MibIfRow struct {
  	Name            [MAX_INTERFACE_NAME_LEN]uint16
  	Index           uint32
  	Type            uint32
  	Mtu             uint32
  	Speed           uint32
  	PhysAddrLen     uint32
  	PhysAddr        [MAXLEN_PHYSADDR]byte
  	AdminStatus     uint32
  	OperStatus      uint32
  	LastChange      uint32
  	InOctets        uint32
  	InUcastPkts     uint32
  	InNUcastPkts    uint32
  	InDiscards      uint32
  	InErrors        uint32
  	InUnknownProtos uint32
  	OutOctets       uint32
  	OutUcastPkts    uint32
  	OutNUcastPkts   uint32
  	OutDiscards     uint32
  	OutErrors       uint32
  	OutQLen         uint32
  	DescrLen        uint32
  	Descr           [MAXLEN_IFDESCR]byte
  }
  
  type CertInfo struct {
  	// Not implemented
  }
  
  type CertContext struct {
  	EncodingType uint32
  	EncodedCert  *byte
  	Length       uint32
  	CertInfo     *CertInfo
  	Store        Handle
  }
  
  type CertChainContext struct {
  	Size                       uint32
  	TrustStatus                CertTrustStatus
  	ChainCount                 uint32
  	Chains                     **CertSimpleChain
  	LowerQualityChainCount     uint32
  	LowerQualityChains         **CertChainContext
  	HasRevocationFreshnessTime uint32
  	RevocationFreshnessTime    uint32
  }
  
  type CertTrustListInfo struct {
  	// Not implemented
  }
  
  type CertSimpleChain struct {
  	Size                       uint32
  	TrustStatus                CertTrustStatus
  	NumElements                uint32
  	Elements                   **CertChainElement
  	TrustListInfo              *CertTrustListInfo
  	HasRevocationFreshnessTime uint32
  	RevocationFreshnessTime    uint32
  }
  
  type CertChainElement struct {
  	Size              uint32
  	CertContext       *CertContext
  	TrustStatus       CertTrustStatus
  	RevocationInfo    *CertRevocationInfo
  	IssuanceUsage     *CertEnhKeyUsage
  	ApplicationUsage  *CertEnhKeyUsage
  	ExtendedErrorInfo *uint16
  }
  
  type CertRevocationCrlInfo struct {
  	// Not implemented
  }
  
  type CertRevocationInfo struct {
  	Size             uint32
  	RevocationResult uint32
  	RevocationOid    *byte
  	OidSpecificInfo  Pointer
  	HasFreshnessTime uint32
  	FreshnessTime    uint32
  	CrlInfo          *CertRevocationCrlInfo
  }
  
  type CertTrustStatus struct {
  	ErrorStatus uint32
  	InfoStatus  uint32
  }
  
  type CertUsageMatch struct {
  	Type  uint32
  	Usage CertEnhKeyUsage
  }
  
  type CertEnhKeyUsage struct {
  	Length           uint32
  	UsageIdentifiers **byte
  }
  
  type CertChainPara struct {
  	Size                         uint32
  	RequestedUsage               CertUsageMatch
  	RequstedIssuancePolicy       CertUsageMatch
  	URLRetrievalTimeout          uint32
  	CheckRevocationFreshnessTime uint32
  	RevocationFreshnessTime      uint32
  	CacheResync                  *Filetime
  }
  
  type CertChainPolicyPara struct {
  	Size            uint32
  	Flags           uint32
  	ExtraPolicyPara Pointer
  }
  
  type SSLExtraCertChainPolicyPara struct {
  	Size       uint32
  	AuthType   uint32
  	Checks     uint32
  	ServerName *uint16
  }
  
  type CertChainPolicyStatus struct {
  	Size              uint32
  	Error             uint32
  	ChainIndex        uint32
  	ElementIndex      uint32
  	ExtraPolicyStatus Pointer
  }
  
  const (
  	// do not reorder
  	HKEY_CLASSES_ROOT = 0x80000000 + iota
  	HKEY_CURRENT_USER
  	HKEY_LOCAL_MACHINE
  	HKEY_USERS
  	HKEY_PERFORMANCE_DATA
  	HKEY_CURRENT_CONFIG
  	HKEY_DYN_DATA
  
  	KEY_QUERY_VALUE        = 1
  	KEY_SET_VALUE          = 2
  	KEY_CREATE_SUB_KEY     = 4
  	KEY_ENUMERATE_SUB_KEYS = 8
  	KEY_NOTIFY             = 16
  	KEY_CREATE_LINK        = 32
  	KEY_WRITE              = 0x20006
  	KEY_EXECUTE            = 0x20019
  	KEY_READ               = 0x20019
  	KEY_WOW64_64KEY        = 0x0100
  	KEY_WOW64_32KEY        = 0x0200
  	KEY_ALL_ACCESS         = 0xf003f
  )
  
  const (
  	// do not reorder
  	REG_NONE = iota
  	REG_SZ
  	REG_EXPAND_SZ
  	REG_BINARY
  	REG_DWORD_LITTLE_ENDIAN
  	REG_DWORD_BIG_ENDIAN
  	REG_LINK
  	REG_MULTI_SZ
  	REG_RESOURCE_LIST
  	REG_FULL_RESOURCE_DESCRIPTOR
  	REG_RESOURCE_REQUIREMENTS_LIST
  	REG_QWORD_LITTLE_ENDIAN
  	REG_DWORD = REG_DWORD_LITTLE_ENDIAN
  	REG_QWORD = REG_QWORD_LITTLE_ENDIAN
  )
  
  type AddrinfoW struct {
  	Flags     int32
  	Family    int32
  	Socktype  int32
  	Protocol  int32
  	Addrlen   uintptr
  	Canonname *uint16
  	Addr      uintptr
  	Next      *AddrinfoW
  }
  
  const (
  	AI_PASSIVE     = 1
  	AI_CANONNAME   = 2
  	AI_NUMERICHOST = 4
  )
  
  type GUID struct {
  	Data1 uint32
  	Data2 uint16
  	Data3 uint16
  	Data4 [8]byte
  }
  
  var WSAID_CONNECTEX = GUID{
  	0x25a207b9,
  	0xddf3,
  	0x4660,
  	[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
  }
  
  var WSAID_WSASENDMSG = GUID{
  	0xa441e712,
  	0x754f,
  	0x43ca,
  	[8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},
  }
  
  var WSAID_WSARECVMSG = GUID{
  	0xf689d7c8,
  	0x6f1f,
  	0x436b,
  	[8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},
  }
  
  const (
  	FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
  	FILE_SKIP_SET_EVENT_ON_HANDLE        = 2
  )
  
  const (
  	WSAPROTOCOL_LEN    = 255
  	MAX_PROTOCOL_CHAIN = 7
  	BASE_PROTOCOL      = 1
  	LAYERED_PROTOCOL   = 0
  
  	XP1_CONNECTIONLESS           = 0x00000001
  	XP1_GUARANTEED_DELIVERY      = 0x00000002
  	XP1_GUARANTEED_ORDER         = 0x00000004
  	XP1_MESSAGE_ORIENTED         = 0x00000008
  	XP1_PSEUDO_STREAM            = 0x00000010
  	XP1_GRACEFUL_CLOSE           = 0x00000020
  	XP1_EXPEDITED_DATA           = 0x00000040
  	XP1_CONNECT_DATA             = 0x00000080
  	XP1_DISCONNECT_DATA          = 0x00000100
  	XP1_SUPPORT_BROADCAST        = 0x00000200
  	XP1_SUPPORT_MULTIPOINT       = 0x00000400
  	XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800
  	XP1_MULTIPOINT_DATA_PLANE    = 0x00001000
  	XP1_QOS_SUPPORTED            = 0x00002000
  	XP1_UNI_SEND                 = 0x00008000
  	XP1_UNI_RECV                 = 0x00010000
  	XP1_IFS_HANDLES              = 0x00020000
  	XP1_PARTIAL_MESSAGE          = 0x00040000
  	XP1_SAN_SUPPORT_SDP          = 0x00080000
  
  	PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001
  	PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002
  	PFL_HIDDEN                  = 0x00000004
  	PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008
  	PFL_NETWORKDIRECT_PROVIDER  = 0x00000010
  )
  
  type WSAProtocolInfo struct {
  	ServiceFlags1     uint32
  	ServiceFlags2     uint32
  	ServiceFlags3     uint32
  	ServiceFlags4     uint32
  	ProviderFlags     uint32
  	ProviderId        GUID
  	CatalogEntryId    uint32
  	ProtocolChain     WSAProtocolChain
  	Version           int32
  	AddressFamily     int32
  	MaxSockAddr       int32
  	MinSockAddr       int32
  	SocketType        int32
  	Protocol          int32
  	ProtocolMaxOffset int32
  	NetworkByteOrder  int32
  	SecurityScheme    int32
  	MessageSize       uint32
  	ProviderReserved  uint32
  	ProtocolName      [WSAPROTOCOL_LEN + 1]uint16
  }
  
  type WSAProtocolChain struct {
  	ChainLen     int32
  	ChainEntries [MAX_PROTOCOL_CHAIN]uint32
  }
  
  type TCPKeepalive struct {
  	OnOff    uint32
  	Time     uint32
  	Interval uint32
  }
  
  type symbolicLinkReparseBuffer struct {
  	SubstituteNameOffset uint16
  	SubstituteNameLength uint16
  	PrintNameOffset      uint16
  	PrintNameLength      uint16
  	Flags                uint32
  	PathBuffer           [1]uint16
  }
  
  type mountPointReparseBuffer struct {
  	SubstituteNameOffset uint16
  	SubstituteNameLength uint16
  	PrintNameOffset      uint16
  	PrintNameLength      uint16
  	PathBuffer           [1]uint16
  }
  
  type reparseDataBuffer struct {
  	ReparseTag        uint32
  	ReparseDataLength uint16
  	Reserved          uint16
  
  	// GenericReparseBuffer
  	reparseBuffer byte
  }
  
  const (
  	FSCTL_GET_REPARSE_POINT          = 0x900A8
  	MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024
  	IO_REPARSE_TAG_MOUNT_POINT       = 0xA0000003
  	IO_REPARSE_TAG_SYMLINK           = 0xA000000C
  	SYMBOLIC_LINK_FLAG_DIRECTORY     = 0x1
  )
  
  const (
  	ComputerNameNetBIOS                   = 0
  	ComputerNameDnsHostname               = 1
  	ComputerNameDnsDomain                 = 2
  	ComputerNameDnsFullyQualified         = 3
  	ComputerNamePhysicalNetBIOS           = 4
  	ComputerNamePhysicalDnsHostname       = 5
  	ComputerNamePhysicalDnsDomain         = 6
  	ComputerNamePhysicalDnsFullyQualified = 7
  	ComputerNameMax                       = 8
  )
  
  const (
  	MOVEFILE_REPLACE_EXISTING      = 0x1
  	MOVEFILE_COPY_ALLOWED          = 0x2
  	MOVEFILE_DELAY_UNTIL_REBOOT    = 0x4
  	MOVEFILE_WRITE_THROUGH         = 0x8
  	MOVEFILE_CREATE_HARDLINK       = 0x10
  	MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
  )
  
  const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
  
  const (
  	IF_TYPE_OTHER              = 1
  	IF_TYPE_ETHERNET_CSMACD    = 6
  	IF_TYPE_ISO88025_TOKENRING = 9
  	IF_TYPE_PPP                = 23
  	IF_TYPE_SOFTWARE_LOOPBACK  = 24
  	IF_TYPE_ATM                = 37
  	IF_TYPE_IEEE80211          = 71
  	IF_TYPE_TUNNEL             = 131
  	IF_TYPE_IEEE1394           = 144
  )
  
  type SocketAddress struct {
  	Sockaddr       *syscall.RawSockaddrAny
  	SockaddrLength int32
  }
  
  type IpAdapterUnicastAddress struct {
  	Length             uint32
  	Flags              uint32
  	Next               *IpAdapterUnicastAddress
  	Address            SocketAddress
  	PrefixOrigin       int32
  	SuffixOrigin       int32
  	DadState           int32
  	ValidLifetime      uint32
  	PreferredLifetime  uint32
  	LeaseLifetime      uint32
  	OnLinkPrefixLength uint8
  }
  
  type IpAdapterAnycastAddress struct {
  	Length  uint32
  	Flags   uint32
  	Next    *IpAdapterAnycastAddress
  	Address SocketAddress
  }
  
  type IpAdapterMulticastAddress struct {
  	Length  uint32
  	Flags   uint32
  	Next    *IpAdapterMulticastAddress
  	Address SocketAddress
  }
  
  type IpAdapterDnsServerAdapter struct {
  	Length   uint32
  	Reserved uint32
  	Next     *IpAdapterDnsServerAdapter
  	Address  SocketAddress
  }
  
  type IpAdapterPrefix struct {
  	Length       uint32
  	Flags        uint32
  	Next         *IpAdapterPrefix
  	Address      SocketAddress
  	PrefixLength uint32
  }
  
  type IpAdapterAddresses struct {
  	Length                uint32
  	IfIndex               uint32
  	Next                  *IpAdapterAddresses
  	AdapterName           *byte
  	FirstUnicastAddress   *IpAdapterUnicastAddress
  	FirstAnycastAddress   *IpAdapterAnycastAddress
  	FirstMulticastAddress *IpAdapterMulticastAddress
  	FirstDnsServerAddress *IpAdapterDnsServerAdapter
  	DnsSuffix             *uint16
  	Description           *uint16
  	FriendlyName          *uint16
  	PhysicalAddress       [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
  	PhysicalAddressLength uint32
  	Flags                 uint32
  	Mtu                   uint32
  	IfType                uint32
  	OperStatus            uint32
  	Ipv6IfIndex           uint32
  	ZoneIndices           [16]uint32
  	FirstPrefix           *IpAdapterPrefix
  	/* more fields might be present here. */
  }
  
  const (
  	IfOperStatusUp             = 1
  	IfOperStatusDown           = 2
  	IfOperStatusTesting        = 3
  	IfOperStatusUnknown        = 4
  	IfOperStatusDormant        = 5
  	IfOperStatusNotPresent     = 6
  	IfOperStatusLowerLayerDown = 7
  )
  
  // Console related constants used for the mode parameter to SetConsoleMode. See
  // https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
  
  const (
  	ENABLE_PROCESSED_INPUT        = 0x1
  	ENABLE_LINE_INPUT             = 0x2
  	ENABLE_ECHO_INPUT             = 0x4
  	ENABLE_WINDOW_INPUT           = 0x8
  	ENABLE_MOUSE_INPUT            = 0x10
  	ENABLE_INSERT_MODE            = 0x20
  	ENABLE_QUICK_EDIT_MODE        = 0x40
  	ENABLE_EXTENDED_FLAGS         = 0x80
  	ENABLE_AUTO_POSITION          = 0x100
  	ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200
  
  	ENABLE_PROCESSED_OUTPUT            = 0x1
  	ENABLE_WRAP_AT_EOL_OUTPUT          = 0x2
  	ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
  	DISABLE_NEWLINE_AUTO_RETURN        = 0x8
  	ENABLE_LVB_GRID_WORLDWIDE          = 0x10
  )
  
  type Coord struct {
  	X int16
  	Y int16
  }
  
  type SmallRect struct {
  	Left   int16
  	Top    int16
  	Right  int16
  	Bottom int16
  }
  
  // Used with GetConsoleScreenBuffer to retrieve information about a console
  // screen buffer. See
  // https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str
  // for details.
  
  type ConsoleScreenBufferInfo struct {
  	Size              Coord
  	CursorPosition    Coord
  	Attributes        uint16
  	Window            SmallRect
  	MaximumWindowSize Coord
  }
  
  const UNIX_PATH_MAX = 108 // defined in afunix.h
  