github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/src/syscall/ztypes_windows.go (about)

     1  // Copyright 2011 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  package syscall
     6  
     7  const (
     8  	// Windows errors.
     9  	ERROR_FILE_NOT_FOUND      Errno = 2
    10  	ERROR_PATH_NOT_FOUND      Errno = 3
    11  	ERROR_ACCESS_DENIED       Errno = 5
    12  	ERROR_NO_MORE_FILES       Errno = 18
    13  	ERROR_HANDLE_EOF          Errno = 38
    14  	ERROR_NETNAME_DELETED     Errno = 64
    15  	ERROR_FILE_EXISTS         Errno = 80
    16  	ERROR_BROKEN_PIPE         Errno = 109
    17  	ERROR_BUFFER_OVERFLOW     Errno = 111
    18  	ERROR_INSUFFICIENT_BUFFER Errno = 122
    19  	ERROR_MOD_NOT_FOUND       Errno = 126
    20  	ERROR_PROC_NOT_FOUND      Errno = 127
    21  	ERROR_DIR_NOT_EMPTY       Errno = 145
    22  	ERROR_ALREADY_EXISTS      Errno = 183
    23  	ERROR_ENVVAR_NOT_FOUND    Errno = 203
    24  	ERROR_MORE_DATA           Errno = 234
    25  	ERROR_OPERATION_ABORTED   Errno = 995
    26  	ERROR_IO_PENDING          Errno = 997
    27  	ERROR_NOT_FOUND           Errno = 1168
    28  	ERROR_PRIVILEGE_NOT_HELD  Errno = 1314
    29  	WSAEACCES                 Errno = 10013
    30  	WSAECONNRESET             Errno = 10054
    31  )
    32  
    33  const (
    34  	// Invented values to support what package os expects.
    35  	O_RDONLY   = 0x00000
    36  	O_WRONLY   = 0x00001
    37  	O_RDWR     = 0x00002
    38  	O_CREAT    = 0x00040
    39  	O_EXCL     = 0x00080
    40  	O_NOCTTY   = 0x00100
    41  	O_TRUNC    = 0x00200
    42  	O_NONBLOCK = 0x00800
    43  	O_APPEND   = 0x00400
    44  	O_SYNC     = 0x01000
    45  	O_ASYNC    = 0x02000
    46  	O_CLOEXEC  = 0x80000
    47  )
    48  
    49  const (
    50  	// More invented values for signals
    51  	SIGHUP  = Signal(0x1)
    52  	SIGINT  = Signal(0x2)
    53  	SIGQUIT = Signal(0x3)
    54  	SIGILL  = Signal(0x4)
    55  	SIGTRAP = Signal(0x5)
    56  	SIGABRT = Signal(0x6)
    57  	SIGBUS  = Signal(0x7)
    58  	SIGFPE  = Signal(0x8)
    59  	SIGKILL = Signal(0x9)
    60  	SIGSEGV = Signal(0xb)
    61  	SIGPIPE = Signal(0xd)
    62  	SIGALRM = Signal(0xe)
    63  	SIGTERM = Signal(0xf)
    64  )
    65  
    66  var signals = [...]string{
    67  	1:  "hangup",
    68  	2:  "interrupt",
    69  	3:  "quit",
    70  	4:  "illegal instruction",
    71  	5:  "trace/breakpoint trap",
    72  	6:  "aborted",
    73  	7:  "bus error",
    74  	8:  "floating point exception",
    75  	9:  "killed",
    76  	10: "user defined signal 1",
    77  	11: "segmentation fault",
    78  	12: "user defined signal 2",
    79  	13: "broken pipe",
    80  	14: "alarm clock",
    81  	15: "terminated",
    82  }
    83  
    84  const (
    85  	GENERIC_READ    = 0x80000000
    86  	GENERIC_WRITE   = 0x40000000
    87  	GENERIC_EXECUTE = 0x20000000
    88  	GENERIC_ALL     = 0x10000000
    89  
    90  	FILE_LIST_DIRECTORY   = 0x00000001
    91  	FILE_APPEND_DATA      = 0x00000004
    92  	FILE_WRITE_ATTRIBUTES = 0x00000100
    93  
    94  	FILE_SHARE_READ              = 0x00000001
    95  	FILE_SHARE_WRITE             = 0x00000002
    96  	FILE_SHARE_DELETE            = 0x00000004
    97  	FILE_ATTRIBUTE_READONLY      = 0x00000001
    98  	FILE_ATTRIBUTE_HIDDEN        = 0x00000002
    99  	FILE_ATTRIBUTE_SYSTEM        = 0x00000004
   100  	FILE_ATTRIBUTE_DIRECTORY     = 0x00000010
   101  	FILE_ATTRIBUTE_ARCHIVE       = 0x00000020
   102  	FILE_ATTRIBUTE_NORMAL        = 0x00000080
   103  	FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
   104  
   105  	INVALID_FILE_ATTRIBUTES = 0xffffffff
   106  
   107  	CREATE_NEW        = 1
   108  	CREATE_ALWAYS     = 2
   109  	OPEN_EXISTING     = 3
   110  	OPEN_ALWAYS       = 4
   111  	TRUNCATE_EXISTING = 5
   112  
   113  	FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
   114  	FILE_FLAG_BACKUP_SEMANTICS   = 0x02000000
   115  	FILE_FLAG_OVERLAPPED         = 0x40000000
   116  
   117  	HANDLE_FLAG_INHERIT    = 0x00000001
   118  	STARTF_USESTDHANDLES   = 0x00000100
   119  	STARTF_USESHOWWINDOW   = 0x00000001
   120  	DUPLICATE_CLOSE_SOURCE = 0x00000001
   121  	DUPLICATE_SAME_ACCESS  = 0x00000002
   122  
   123  	STD_INPUT_HANDLE  = -10
   124  	STD_OUTPUT_HANDLE = -11
   125  	STD_ERROR_HANDLE  = -12
   126  
   127  	FILE_BEGIN   = 0
   128  	FILE_CURRENT = 1
   129  	FILE_END     = 2
   130  
   131  	LANG_ENGLISH       = 0x09
   132  	SUBLANG_ENGLISH_US = 0x01
   133  
   134  	FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
   135  	FORMAT_MESSAGE_IGNORE_INSERTS  = 512
   136  	FORMAT_MESSAGE_FROM_STRING     = 1024
   137  	FORMAT_MESSAGE_FROM_HMODULE    = 2048
   138  	FORMAT_MESSAGE_FROM_SYSTEM     = 4096
   139  	FORMAT_MESSAGE_ARGUMENT_ARRAY  = 8192
   140  	FORMAT_MESSAGE_MAX_WIDTH_MASK  = 255
   141  
   142  	MAX_PATH      = 260
   143  	MAX_LONG_PATH = 32768
   144  
   145  	MAX_COMPUTERNAME_LENGTH = 15
   146  
   147  	TIME_ZONE_ID_UNKNOWN  = 0
   148  	TIME_ZONE_ID_STANDARD = 1
   149  
   150  	TIME_ZONE_ID_DAYLIGHT = 2
   151  	IGNORE                = 0
   152  	INFINITE              = 0xffffffff
   153  
   154  	WAIT_TIMEOUT   = 258
   155  	WAIT_ABANDONED = 0x00000080
   156  	WAIT_OBJECT_0  = 0x00000000
   157  	WAIT_FAILED    = 0xFFFFFFFF
   158  
   159  	CREATE_NEW_PROCESS_GROUP   = 0x00000200
   160  	CREATE_UNICODE_ENVIRONMENT = 0x00000400
   161  
   162  	PROCESS_TERMINATE         = 1
   163  	PROCESS_QUERY_INFORMATION = 0x00000400
   164  	SYNCHRONIZE               = 0x00100000
   165  
   166  	PAGE_READONLY          = 0x02
   167  	PAGE_READWRITE         = 0x04
   168  	PAGE_WRITECOPY         = 0x08
   169  	PAGE_EXECUTE_READ      = 0x20
   170  	PAGE_EXECUTE_READWRITE = 0x40
   171  	PAGE_EXECUTE_WRITECOPY = 0x80
   172  
   173  	FILE_MAP_COPY    = 0x01
   174  	FILE_MAP_WRITE   = 0x02
   175  	FILE_MAP_READ    = 0x04
   176  	FILE_MAP_EXECUTE = 0x20
   177  
   178  	CTRL_C_EVENT     = 0
   179  	CTRL_BREAK_EVENT = 1
   180  )
   181  
   182  const (
   183  	// flags for CreateToolhelp32Snapshot
   184  	TH32CS_SNAPHEAPLIST = 0x01
   185  	TH32CS_SNAPPROCESS  = 0x02
   186  	TH32CS_SNAPTHREAD   = 0x04
   187  	TH32CS_SNAPMODULE   = 0x08
   188  	TH32CS_SNAPMODULE32 = 0x10
   189  	TH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD
   190  	TH32CS_INHERIT      = 0x80000000
   191  )
   192  
   193  const (
   194  	// do not reorder
   195  	FILE_NOTIFY_CHANGE_FILE_NAME = 1 << iota
   196  	FILE_NOTIFY_CHANGE_DIR_NAME
   197  	FILE_NOTIFY_CHANGE_ATTRIBUTES
   198  	FILE_NOTIFY_CHANGE_SIZE
   199  	FILE_NOTIFY_CHANGE_LAST_WRITE
   200  	FILE_NOTIFY_CHANGE_LAST_ACCESS
   201  	FILE_NOTIFY_CHANGE_CREATION
   202  )
   203  
   204  const (
   205  	// do not reorder
   206  	FILE_ACTION_ADDED = iota + 1
   207  	FILE_ACTION_REMOVED
   208  	FILE_ACTION_MODIFIED
   209  	FILE_ACTION_RENAMED_OLD_NAME
   210  	FILE_ACTION_RENAMED_NEW_NAME
   211  )
   212  
   213  const (
   214  	// wincrypt.h
   215  	PROV_RSA_FULL                    = 1
   216  	PROV_RSA_SIG                     = 2
   217  	PROV_DSS                         = 3
   218  	PROV_FORTEZZA                    = 4
   219  	PROV_MS_EXCHANGE                 = 5
   220  	PROV_SSL                         = 6
   221  	PROV_RSA_SCHANNEL                = 12
   222  	PROV_DSS_DH                      = 13
   223  	PROV_EC_ECDSA_SIG                = 14
   224  	PROV_EC_ECNRA_SIG                = 15
   225  	PROV_EC_ECDSA_FULL               = 16
   226  	PROV_EC_ECNRA_FULL               = 17
   227  	PROV_DH_SCHANNEL                 = 18
   228  	PROV_SPYRUS_LYNKS                = 20
   229  	PROV_RNG                         = 21
   230  	PROV_INTEL_SEC                   = 22
   231  	PROV_REPLACE_OWF                 = 23
   232  	PROV_RSA_AES                     = 24
   233  	CRYPT_VERIFYCONTEXT              = 0xF0000000
   234  	CRYPT_NEWKEYSET                  = 0x00000008
   235  	CRYPT_DELETEKEYSET               = 0x00000010
   236  	CRYPT_MACHINE_KEYSET             = 0x00000020
   237  	CRYPT_SILENT                     = 0x00000040
   238  	CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080
   239  
   240  	USAGE_MATCH_TYPE_AND = 0
   241  	USAGE_MATCH_TYPE_OR  = 1
   242  
   243  	X509_ASN_ENCODING   = 0x00000001
   244  	PKCS_7_ASN_ENCODING = 0x00010000
   245  
   246  	CERT_STORE_PROV_MEMORY = 2
   247  
   248  	CERT_STORE_ADD_ALWAYS = 4
   249  
   250  	CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004
   251  
   252  	CERT_TRUST_NO_ERROR                          = 0x00000000
   253  	CERT_TRUST_IS_NOT_TIME_VALID                 = 0x00000001
   254  	CERT_TRUST_IS_REVOKED                        = 0x00000004
   255  	CERT_TRUST_IS_NOT_SIGNATURE_VALID            = 0x00000008
   256  	CERT_TRUST_IS_NOT_VALID_FOR_USAGE            = 0x00000010
   257  	CERT_TRUST_IS_UNTRUSTED_ROOT                 = 0x00000020
   258  	CERT_TRUST_REVOCATION_STATUS_UNKNOWN         = 0x00000040
   259  	CERT_TRUST_IS_CYCLIC                         = 0x00000080
   260  	CERT_TRUST_INVALID_EXTENSION                 = 0x00000100
   261  	CERT_TRUST_INVALID_POLICY_CONSTRAINTS        = 0x00000200
   262  	CERT_TRUST_INVALID_BASIC_CONSTRAINTS         = 0x00000400
   263  	CERT_TRUST_INVALID_NAME_CONSTRAINTS          = 0x00000800
   264  	CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000
   265  	CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT   = 0x00002000
   266  	CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000
   267  	CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT      = 0x00008000
   268  	CERT_TRUST_IS_OFFLINE_REVOCATION             = 0x01000000
   269  	CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY          = 0x02000000
   270  	CERT_TRUST_IS_EXPLICIT_DISTRUST              = 0x04000000
   271  	CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT    = 0x08000000
   272  
   273  	CERT_CHAIN_POLICY_BASE              = 1
   274  	CERT_CHAIN_POLICY_AUTHENTICODE      = 2
   275  	CERT_CHAIN_POLICY_AUTHENTICODE_TS   = 3
   276  	CERT_CHAIN_POLICY_SSL               = 4
   277  	CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5
   278  	CERT_CHAIN_POLICY_NT_AUTH           = 6
   279  	CERT_CHAIN_POLICY_MICROSOFT_ROOT    = 7
   280  	CERT_CHAIN_POLICY_EV                = 8
   281  
   282  	CERT_E_EXPIRED       = 0x800B0101
   283  	CERT_E_ROLE          = 0x800B0103
   284  	CERT_E_PURPOSE       = 0x800B0106
   285  	CERT_E_UNTRUSTEDROOT = 0x800B0109
   286  	CERT_E_CN_NO_MATCH   = 0x800B010F
   287  
   288  	AUTHTYPE_CLIENT = 1
   289  	AUTHTYPE_SERVER = 2
   290  )
   291  
   292  var (
   293  	OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00")
   294  	OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00")
   295  	OID_SGC_NETSCAPE        = []byte("2.16.840.1.113730.4.1\x00")
   296  )
   297  
   298  // Invented values to support what package os expects.
   299  type Timeval struct {
   300  	Sec  int32
   301  	Usec int32
   302  }
   303  
   304  func (tv *Timeval) Nanoseconds() int64 {
   305  	return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3
   306  }
   307  
   308  func NsecToTimeval(nsec int64) (tv Timeval) {
   309  	tv.Sec = int32(nsec / 1e9)
   310  	tv.Usec = int32(nsec % 1e9 / 1e3)
   311  	return
   312  }
   313  
   314  type SecurityAttributes struct {
   315  	Length             uint32
   316  	SecurityDescriptor uintptr
   317  	InheritHandle      uint32
   318  }
   319  
   320  type Overlapped struct {
   321  	Internal     uintptr
   322  	InternalHigh uintptr
   323  	Offset       uint32
   324  	OffsetHigh   uint32
   325  	HEvent       Handle
   326  }
   327  
   328  type FileNotifyInformation struct {
   329  	NextEntryOffset uint32
   330  	Action          uint32
   331  	FileNameLength  uint32
   332  	FileName        uint16
   333  }
   334  
   335  type Filetime struct {
   336  	LowDateTime  uint32
   337  	HighDateTime uint32
   338  }
   339  
   340  // Nanoseconds returns Filetime ft in nanoseconds
   341  // since Epoch (00:00:00 UTC, January 1, 1970).
   342  func (ft *Filetime) Nanoseconds() int64 {
   343  	// 100-nanosecond intervals since January 1, 1601
   344  	nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime)
   345  	// change starting time to the Epoch (00:00:00 UTC, January 1, 1970)
   346  	nsec -= 116444736000000000
   347  	// convert into nanoseconds
   348  	nsec *= 100
   349  	return nsec
   350  }
   351  
   352  func NsecToFiletime(nsec int64) (ft Filetime) {
   353  	// convert into 100-nanosecond
   354  	nsec /= 100
   355  	// change starting time to January 1, 1601
   356  	nsec += 116444736000000000
   357  	// split into high / low
   358  	ft.LowDateTime = uint32(nsec & 0xffffffff)
   359  	ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff)
   360  	return ft
   361  }
   362  
   363  type Win32finddata struct {
   364  	FileAttributes    uint32
   365  	CreationTime      Filetime
   366  	LastAccessTime    Filetime
   367  	LastWriteTime     Filetime
   368  	FileSizeHigh      uint32
   369  	FileSizeLow       uint32
   370  	Reserved0         uint32
   371  	Reserved1         uint32
   372  	FileName          [MAX_PATH - 1]uint16
   373  	AlternateFileName [13]uint16
   374  }
   375  
   376  // This is the actual system call structure.
   377  // Win32finddata is what we committed to in Go 1.
   378  type win32finddata1 struct {
   379  	FileAttributes    uint32
   380  	CreationTime      Filetime
   381  	LastAccessTime    Filetime
   382  	LastWriteTime     Filetime
   383  	FileSizeHigh      uint32
   384  	FileSizeLow       uint32
   385  	Reserved0         uint32
   386  	Reserved1         uint32
   387  	FileName          [MAX_PATH]uint16
   388  	AlternateFileName [14]uint16
   389  }
   390  
   391  func copyFindData(dst *Win32finddata, src *win32finddata1) {
   392  	dst.FileAttributes = src.FileAttributes
   393  	dst.CreationTime = src.CreationTime
   394  	dst.LastAccessTime = src.LastAccessTime
   395  	dst.LastWriteTime = src.LastWriteTime
   396  	dst.FileSizeHigh = src.FileSizeHigh
   397  	dst.FileSizeLow = src.FileSizeLow
   398  	dst.Reserved0 = src.Reserved0
   399  	dst.Reserved1 = src.Reserved1
   400  
   401  	// The src is 1 element bigger than dst, but it must be NUL.
   402  	copy(dst.FileName[:], src.FileName[:])
   403  	copy(dst.AlternateFileName[:], src.AlternateFileName[:])
   404  }
   405  
   406  type ByHandleFileInformation struct {
   407  	FileAttributes     uint32
   408  	CreationTime       Filetime
   409  	LastAccessTime     Filetime
   410  	LastWriteTime      Filetime
   411  	VolumeSerialNumber uint32
   412  	FileSizeHigh       uint32
   413  	FileSizeLow        uint32
   414  	NumberOfLinks      uint32
   415  	FileIndexHigh      uint32
   416  	FileIndexLow       uint32
   417  }
   418  
   419  const (
   420  	GetFileExInfoStandard = 0
   421  	GetFileExMaxInfoLevel = 1
   422  )
   423  
   424  type Win32FileAttributeData struct {
   425  	FileAttributes uint32
   426  	CreationTime   Filetime
   427  	LastAccessTime Filetime
   428  	LastWriteTime  Filetime
   429  	FileSizeHigh   uint32
   430  	FileSizeLow    uint32
   431  }
   432  
   433  // ShowWindow constants
   434  const (
   435  	// winuser.h
   436  	SW_HIDE            = 0
   437  	SW_NORMAL          = 1
   438  	SW_SHOWNORMAL      = 1
   439  	SW_SHOWMINIMIZED   = 2
   440  	SW_SHOWMAXIMIZED   = 3
   441  	SW_MAXIMIZE        = 3
   442  	SW_SHOWNOACTIVATE  = 4
   443  	SW_SHOW            = 5
   444  	SW_MINIMIZE        = 6
   445  	SW_SHOWMINNOACTIVE = 7
   446  	SW_SHOWNA          = 8
   447  	SW_RESTORE         = 9
   448  	SW_SHOWDEFAULT     = 10
   449  	SW_FORCEMINIMIZE   = 11
   450  )
   451  
   452  type StartupInfo struct {
   453  	Cb            uint32
   454  	_             *uint16
   455  	Desktop       *uint16
   456  	Title         *uint16
   457  	X             uint32
   458  	Y             uint32
   459  	XSize         uint32
   460  	YSize         uint32
   461  	XCountChars   uint32
   462  	YCountChars   uint32
   463  	FillAttribute uint32
   464  	Flags         uint32
   465  	ShowWindow    uint16
   466  	_             uint16
   467  	_             *byte
   468  	StdInput      Handle
   469  	StdOutput     Handle
   470  	StdErr        Handle
   471  }
   472  
   473  type ProcessInformation struct {
   474  	Process   Handle
   475  	Thread    Handle
   476  	ProcessId uint32
   477  	ThreadId  uint32
   478  }
   479  
   480  type ProcessEntry32 struct {
   481  	Size            uint32
   482  	Usage           uint32
   483  	ProcessID       uint32
   484  	DefaultHeapID   uintptr
   485  	ModuleID        uint32
   486  	Threads         uint32
   487  	ParentProcessID uint32
   488  	PriClassBase    int32
   489  	Flags           uint32
   490  	ExeFile         [MAX_PATH]uint16
   491  }
   492  
   493  type Systemtime struct {
   494  	Year         uint16
   495  	Month        uint16
   496  	DayOfWeek    uint16
   497  	Day          uint16
   498  	Hour         uint16
   499  	Minute       uint16
   500  	Second       uint16
   501  	Milliseconds uint16
   502  }
   503  
   504  type Timezoneinformation struct {
   505  	Bias         int32
   506  	StandardName [32]uint16
   507  	StandardDate Systemtime
   508  	StandardBias int32
   509  	DaylightName [32]uint16
   510  	DaylightDate Systemtime
   511  	DaylightBias int32
   512  }
   513  
   514  // Socket related.
   515  
   516  const (
   517  	AF_UNSPEC  = 0
   518  	AF_UNIX    = 1
   519  	AF_INET    = 2
   520  	AF_INET6   = 23
   521  	AF_NETBIOS = 17
   522  
   523  	SOCK_STREAM    = 1
   524  	SOCK_DGRAM     = 2
   525  	SOCK_RAW       = 3
   526  	SOCK_SEQPACKET = 5
   527  
   528  	IPPROTO_IP   = 0
   529  	IPPROTO_IPV6 = 0x29
   530  	IPPROTO_TCP  = 6
   531  	IPPROTO_UDP  = 17
   532  
   533  	SOL_SOCKET                = 0xffff
   534  	SO_REUSEADDR              = 4
   535  	SO_KEEPALIVE              = 8
   536  	SO_DONTROUTE              = 16
   537  	SO_BROADCAST              = 32
   538  	SO_LINGER                 = 128
   539  	SO_RCVBUF                 = 0x1002
   540  	SO_SNDBUF                 = 0x1001
   541  	SO_UPDATE_ACCEPT_CONTEXT  = 0x700b
   542  	SO_UPDATE_CONNECT_CONTEXT = 0x7010
   543  
   544  	IOC_OUT                            = 0x40000000
   545  	IOC_IN                             = 0x80000000
   546  	IOC_VENDOR                         = 0x18000000
   547  	IOC_INOUT                          = IOC_IN | IOC_OUT
   548  	IOC_WS2                            = 0x08000000
   549  	SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6
   550  	SIO_KEEPALIVE_VALS                 = IOC_IN | IOC_VENDOR | 4
   551  	SIO_UDP_CONNRESET                  = IOC_IN | IOC_VENDOR | 12
   552  
   553  	// cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460
   554  
   555  	IP_TOS             = 0x3
   556  	IP_TTL             = 0x4
   557  	IP_MULTICAST_IF    = 0x9
   558  	IP_MULTICAST_TTL   = 0xa
   559  	IP_MULTICAST_LOOP  = 0xb
   560  	IP_ADD_MEMBERSHIP  = 0xc
   561  	IP_DROP_MEMBERSHIP = 0xd
   562  
   563  	IPV6_V6ONLY         = 0x1b
   564  	IPV6_UNICAST_HOPS   = 0x4
   565  	IPV6_MULTICAST_IF   = 0x9
   566  	IPV6_MULTICAST_HOPS = 0xa
   567  	IPV6_MULTICAST_LOOP = 0xb
   568  	IPV6_JOIN_GROUP     = 0xc
   569  	IPV6_LEAVE_GROUP    = 0xd
   570  
   571  	SOMAXCONN = 0x7fffffff
   572  
   573  	TCP_NODELAY = 1
   574  
   575  	SHUT_RD   = 0
   576  	SHUT_WR   = 1
   577  	SHUT_RDWR = 2
   578  
   579  	WSADESCRIPTION_LEN = 256
   580  	WSASYS_STATUS_LEN  = 128
   581  )
   582  
   583  type WSABuf struct {
   584  	Len uint32
   585  	Buf *byte
   586  }
   587  
   588  // Invented values to support what package os expects.
   589  const (
   590  	S_IFMT   = 0x1f000
   591  	S_IFIFO  = 0x1000
   592  	S_IFCHR  = 0x2000
   593  	S_IFDIR  = 0x4000
   594  	S_IFBLK  = 0x6000
   595  	S_IFREG  = 0x8000
   596  	S_IFLNK  = 0xa000
   597  	S_IFSOCK = 0xc000
   598  	S_ISUID  = 0x800
   599  	S_ISGID  = 0x400
   600  	S_ISVTX  = 0x200
   601  	S_IRUSR  = 0x100
   602  	S_IWRITE = 0x80
   603  	S_IWUSR  = 0x80
   604  	S_IXUSR  = 0x40
   605  )
   606  
   607  const (
   608  	FILE_TYPE_CHAR    = 0x0002
   609  	FILE_TYPE_DISK    = 0x0001
   610  	FILE_TYPE_PIPE    = 0x0003
   611  	FILE_TYPE_REMOTE  = 0x8000
   612  	FILE_TYPE_UNKNOWN = 0x0000
   613  )
   614  
   615  type Hostent struct {
   616  	Name     *byte
   617  	Aliases  **byte
   618  	AddrType uint16
   619  	Length   uint16
   620  	AddrList **byte
   621  }
   622  
   623  type Protoent struct {
   624  	Name    *byte
   625  	Aliases **byte
   626  	Proto   uint16
   627  }
   628  
   629  const (
   630  	DNS_TYPE_A       = 0x0001
   631  	DNS_TYPE_NS      = 0x0002
   632  	DNS_TYPE_MD      = 0x0003
   633  	DNS_TYPE_MF      = 0x0004
   634  	DNS_TYPE_CNAME   = 0x0005
   635  	DNS_TYPE_SOA     = 0x0006
   636  	DNS_TYPE_MB      = 0x0007
   637  	DNS_TYPE_MG      = 0x0008
   638  	DNS_TYPE_MR      = 0x0009
   639  	DNS_TYPE_NULL    = 0x000a
   640  	DNS_TYPE_WKS     = 0x000b
   641  	DNS_TYPE_PTR     = 0x000c
   642  	DNS_TYPE_HINFO   = 0x000d
   643  	DNS_TYPE_MINFO   = 0x000e
   644  	DNS_TYPE_MX      = 0x000f
   645  	DNS_TYPE_TEXT    = 0x0010
   646  	DNS_TYPE_RP      = 0x0011
   647  	DNS_TYPE_AFSDB   = 0x0012
   648  	DNS_TYPE_X25     = 0x0013
   649  	DNS_TYPE_ISDN    = 0x0014
   650  	DNS_TYPE_RT      = 0x0015
   651  	DNS_TYPE_NSAP    = 0x0016
   652  	DNS_TYPE_NSAPPTR = 0x0017
   653  	DNS_TYPE_SIG     = 0x0018
   654  	DNS_TYPE_KEY     = 0x0019
   655  	DNS_TYPE_PX      = 0x001a
   656  	DNS_TYPE_GPOS    = 0x001b
   657  	DNS_TYPE_AAAA    = 0x001c
   658  	DNS_TYPE_LOC     = 0x001d
   659  	DNS_TYPE_NXT     = 0x001e
   660  	DNS_TYPE_EID     = 0x001f
   661  	DNS_TYPE_NIMLOC  = 0x0020
   662  	DNS_TYPE_SRV     = 0x0021
   663  	DNS_TYPE_ATMA    = 0x0022
   664  	DNS_TYPE_NAPTR   = 0x0023
   665  	DNS_TYPE_KX      = 0x0024
   666  	DNS_TYPE_CERT    = 0x0025
   667  	DNS_TYPE_A6      = 0x0026
   668  	DNS_TYPE_DNAME   = 0x0027
   669  	DNS_TYPE_SINK    = 0x0028
   670  	DNS_TYPE_OPT     = 0x0029
   671  	DNS_TYPE_DS      = 0x002B
   672  	DNS_TYPE_RRSIG   = 0x002E
   673  	DNS_TYPE_NSEC    = 0x002F
   674  	DNS_TYPE_DNSKEY  = 0x0030
   675  	DNS_TYPE_DHCID   = 0x0031
   676  	DNS_TYPE_UINFO   = 0x0064
   677  	DNS_TYPE_UID     = 0x0065
   678  	DNS_TYPE_GID     = 0x0066
   679  	DNS_TYPE_UNSPEC  = 0x0067
   680  	DNS_TYPE_ADDRS   = 0x00f8
   681  	DNS_TYPE_TKEY    = 0x00f9
   682  	DNS_TYPE_TSIG    = 0x00fa
   683  	DNS_TYPE_IXFR    = 0x00fb
   684  	DNS_TYPE_AXFR    = 0x00fc
   685  	DNS_TYPE_MAILB   = 0x00fd
   686  	DNS_TYPE_MAILA   = 0x00fe
   687  	DNS_TYPE_ALL     = 0x00ff
   688  	DNS_TYPE_ANY     = 0x00ff
   689  	DNS_TYPE_WINS    = 0xff01
   690  	DNS_TYPE_WINSR   = 0xff02
   691  	DNS_TYPE_NBSTAT  = 0xff01
   692  )
   693  
   694  const (
   695  	DNS_INFO_NO_RECORDS = 0x251D
   696  )
   697  
   698  const (
   699  	// flags inside DNSRecord.Dw
   700  	DnsSectionQuestion   = 0x0000
   701  	DnsSectionAnswer     = 0x0001
   702  	DnsSectionAuthority  = 0x0002
   703  	DnsSectionAdditional = 0x0003
   704  )
   705  
   706  type DNSSRVData struct {
   707  	Target   *uint16
   708  	Priority uint16
   709  	Weight   uint16
   710  	Port     uint16
   711  	Pad      uint16
   712  }
   713  
   714  type DNSPTRData struct {
   715  	Host *uint16
   716  }
   717  
   718  type DNSMXData struct {
   719  	NameExchange *uint16
   720  	Preference   uint16
   721  	Pad          uint16
   722  }
   723  
   724  type DNSTXTData struct {
   725  	StringCount uint16
   726  	StringArray [1]*uint16
   727  }
   728  
   729  type DNSRecord struct {
   730  	Next     *DNSRecord
   731  	Name     *uint16
   732  	Type     uint16
   733  	Length   uint16
   734  	Dw       uint32
   735  	Ttl      uint32
   736  	Reserved uint32
   737  	Data     [40]byte
   738  }
   739  
   740  const (
   741  	TF_DISCONNECT         = 1
   742  	TF_REUSE_SOCKET       = 2
   743  	TF_WRITE_BEHIND       = 4
   744  	TF_USE_DEFAULT_WORKER = 0
   745  	TF_USE_SYSTEM_THREAD  = 16
   746  	TF_USE_KERNEL_APC     = 32
   747  )
   748  
   749  type TransmitFileBuffers struct {
   750  	Head       uintptr
   751  	HeadLength uint32
   752  	Tail       uintptr
   753  	TailLength uint32
   754  }
   755  
   756  const (
   757  	IFF_UP           = 1
   758  	IFF_BROADCAST    = 2
   759  	IFF_LOOPBACK     = 4
   760  	IFF_POINTTOPOINT = 8
   761  	IFF_MULTICAST    = 16
   762  )
   763  
   764  const SIO_GET_INTERFACE_LIST = 0x4004747F
   765  
   766  // TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old.
   767  // will be fixed to change variable type as suitable.
   768  
   769  type SockaddrGen [24]byte
   770  
   771  type InterfaceInfo struct {
   772  	Flags            uint32
   773  	Address          SockaddrGen
   774  	BroadcastAddress SockaddrGen
   775  	Netmask          SockaddrGen
   776  }
   777  
   778  type IpAddressString struct {
   779  	String [16]byte
   780  }
   781  
   782  type IpMaskString IpAddressString
   783  
   784  type IpAddrString struct {
   785  	Next      *IpAddrString
   786  	IpAddress IpAddressString
   787  	IpMask    IpMaskString
   788  	Context   uint32
   789  }
   790  
   791  const MAX_ADAPTER_NAME_LENGTH = 256
   792  const MAX_ADAPTER_DESCRIPTION_LENGTH = 128
   793  const MAX_ADAPTER_ADDRESS_LENGTH = 8
   794  
   795  type IpAdapterInfo struct {
   796  	Next                *IpAdapterInfo
   797  	ComboIndex          uint32
   798  	AdapterName         [MAX_ADAPTER_NAME_LENGTH + 4]byte
   799  	Description         [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte
   800  	AddressLength       uint32
   801  	Address             [MAX_ADAPTER_ADDRESS_LENGTH]byte
   802  	Index               uint32
   803  	Type                uint32
   804  	DhcpEnabled         uint32
   805  	CurrentIpAddress    *IpAddrString
   806  	IpAddressList       IpAddrString
   807  	GatewayList         IpAddrString
   808  	DhcpServer          IpAddrString
   809  	HaveWins            bool
   810  	PrimaryWinsServer   IpAddrString
   811  	SecondaryWinsServer IpAddrString
   812  	LeaseObtained       int64
   813  	LeaseExpires        int64
   814  }
   815  
   816  const MAXLEN_PHYSADDR = 8
   817  const MAX_INTERFACE_NAME_LEN = 256
   818  const MAXLEN_IFDESCR = 256
   819  
   820  type MibIfRow struct {
   821  	Name            [MAX_INTERFACE_NAME_LEN]uint16
   822  	Index           uint32
   823  	Type            uint32
   824  	Mtu             uint32
   825  	Speed           uint32
   826  	PhysAddrLen     uint32
   827  	PhysAddr        [MAXLEN_PHYSADDR]byte
   828  	AdminStatus     uint32
   829  	OperStatus      uint32
   830  	LastChange      uint32
   831  	InOctets        uint32
   832  	InUcastPkts     uint32
   833  	InNUcastPkts    uint32
   834  	InDiscards      uint32
   835  	InErrors        uint32
   836  	InUnknownProtos uint32
   837  	OutOctets       uint32
   838  	OutUcastPkts    uint32
   839  	OutNUcastPkts   uint32
   840  	OutDiscards     uint32
   841  	OutErrors       uint32
   842  	OutQLen         uint32
   843  	DescrLen        uint32
   844  	Descr           [MAXLEN_IFDESCR]byte
   845  }
   846  
   847  type CertContext struct {
   848  	EncodingType uint32
   849  	EncodedCert  *byte
   850  	Length       uint32
   851  	CertInfo     uintptr
   852  	Store        Handle
   853  }
   854  
   855  type CertChainContext struct {
   856  	Size                       uint32
   857  	TrustStatus                CertTrustStatus
   858  	ChainCount                 uint32
   859  	Chains                     **CertSimpleChain
   860  	LowerQualityChainCount     uint32
   861  	LowerQualityChains         **CertChainContext
   862  	HasRevocationFreshnessTime uint32
   863  	RevocationFreshnessTime    uint32
   864  }
   865  
   866  type CertSimpleChain struct {
   867  	Size                       uint32
   868  	TrustStatus                CertTrustStatus
   869  	NumElements                uint32
   870  	Elements                   **CertChainElement
   871  	TrustListInfo              uintptr
   872  	HasRevocationFreshnessTime uint32
   873  	RevocationFreshnessTime    uint32
   874  }
   875  
   876  type CertChainElement struct {
   877  	Size              uint32
   878  	CertContext       *CertContext
   879  	TrustStatus       CertTrustStatus
   880  	RevocationInfo    *CertRevocationInfo
   881  	IssuanceUsage     *CertEnhKeyUsage
   882  	ApplicationUsage  *CertEnhKeyUsage
   883  	ExtendedErrorInfo *uint16
   884  }
   885  
   886  type CertRevocationInfo struct {
   887  	Size             uint32
   888  	RevocationResult uint32
   889  	RevocationOid    *byte
   890  	OidSpecificInfo  uintptr
   891  	HasFreshnessTime uint32
   892  	FreshnessTime    uint32
   893  	CrlInfo          uintptr // *CertRevocationCrlInfo
   894  }
   895  
   896  type CertTrustStatus struct {
   897  	ErrorStatus uint32
   898  	InfoStatus  uint32
   899  }
   900  
   901  type CertUsageMatch struct {
   902  	Type  uint32
   903  	Usage CertEnhKeyUsage
   904  }
   905  
   906  type CertEnhKeyUsage struct {
   907  	Length           uint32
   908  	UsageIdentifiers **byte
   909  }
   910  
   911  type CertChainPara struct {
   912  	Size                         uint32
   913  	RequestedUsage               CertUsageMatch
   914  	RequstedIssuancePolicy       CertUsageMatch
   915  	URLRetrievalTimeout          uint32
   916  	CheckRevocationFreshnessTime uint32
   917  	RevocationFreshnessTime      uint32
   918  	CacheResync                  *Filetime
   919  }
   920  
   921  type CertChainPolicyPara struct {
   922  	Size            uint32
   923  	Flags           uint32
   924  	ExtraPolicyPara uintptr
   925  }
   926  
   927  type SSLExtraCertChainPolicyPara struct {
   928  	Size       uint32
   929  	AuthType   uint32
   930  	Checks     uint32
   931  	ServerName *uint16
   932  }
   933  
   934  type CertChainPolicyStatus struct {
   935  	Size              uint32
   936  	Error             uint32
   937  	ChainIndex        uint32
   938  	ElementIndex      uint32
   939  	ExtraPolicyStatus uintptr
   940  }
   941  
   942  const (
   943  	// do not reorder
   944  	HKEY_CLASSES_ROOT = 0x80000000 + iota
   945  	HKEY_CURRENT_USER
   946  	HKEY_LOCAL_MACHINE
   947  	HKEY_USERS
   948  	HKEY_PERFORMANCE_DATA
   949  	HKEY_CURRENT_CONFIG
   950  	HKEY_DYN_DATA
   951  
   952  	KEY_QUERY_VALUE        = 1
   953  	KEY_SET_VALUE          = 2
   954  	KEY_CREATE_SUB_KEY     = 4
   955  	KEY_ENUMERATE_SUB_KEYS = 8
   956  	KEY_NOTIFY             = 16
   957  	KEY_CREATE_LINK        = 32
   958  	KEY_WRITE              = 0x20006
   959  	KEY_EXECUTE            = 0x20019
   960  	KEY_READ               = 0x20019
   961  	KEY_WOW64_64KEY        = 0x0100
   962  	KEY_WOW64_32KEY        = 0x0200
   963  	KEY_ALL_ACCESS         = 0xf003f
   964  )
   965  
   966  const (
   967  	// do not reorder
   968  	REG_NONE = iota
   969  	REG_SZ
   970  	REG_EXPAND_SZ
   971  	REG_BINARY
   972  	REG_DWORD_LITTLE_ENDIAN
   973  	REG_DWORD_BIG_ENDIAN
   974  	REG_LINK
   975  	REG_MULTI_SZ
   976  	REG_RESOURCE_LIST
   977  	REG_FULL_RESOURCE_DESCRIPTOR
   978  	REG_RESOURCE_REQUIREMENTS_LIST
   979  	REG_QWORD_LITTLE_ENDIAN
   980  	REG_DWORD = REG_DWORD_LITTLE_ENDIAN
   981  	REG_QWORD = REG_QWORD_LITTLE_ENDIAN
   982  )
   983  
   984  type AddrinfoW struct {
   985  	Flags     int32
   986  	Family    int32
   987  	Socktype  int32
   988  	Protocol  int32
   989  	Addrlen   uintptr
   990  	Canonname *uint16
   991  	Addr      uintptr
   992  	Next      *AddrinfoW
   993  }
   994  
   995  const (
   996  	AI_PASSIVE     = 1
   997  	AI_CANONNAME   = 2
   998  	AI_NUMERICHOST = 4
   999  )
  1000  
  1001  type GUID struct {
  1002  	Data1 uint32
  1003  	Data2 uint16
  1004  	Data3 uint16
  1005  	Data4 [8]byte
  1006  }
  1007  
  1008  var WSAID_CONNECTEX = GUID{
  1009  	0x25a207b9,
  1010  	0xddf3,
  1011  	0x4660,
  1012  	[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
  1013  }
  1014  
  1015  const (
  1016  	FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
  1017  	FILE_SKIP_SET_EVENT_ON_HANDLE        = 2
  1018  )
  1019  
  1020  const (
  1021  	WSAPROTOCOL_LEN    = 255
  1022  	MAX_PROTOCOL_CHAIN = 7
  1023  	BASE_PROTOCOL      = 1
  1024  	LAYERED_PROTOCOL   = 0
  1025  
  1026  	XP1_CONNECTIONLESS           = 0x00000001
  1027  	XP1_GUARANTEED_DELIVERY      = 0x00000002
  1028  	XP1_GUARANTEED_ORDER         = 0x00000004
  1029  	XP1_MESSAGE_ORIENTED         = 0x00000008
  1030  	XP1_PSEUDO_STREAM            = 0x00000010
  1031  	XP1_GRACEFUL_CLOSE           = 0x00000020
  1032  	XP1_EXPEDITED_DATA           = 0x00000040
  1033  	XP1_CONNECT_DATA             = 0x00000080
  1034  	XP1_DISCONNECT_DATA          = 0x00000100
  1035  	XP1_SUPPORT_BROADCAST        = 0x00000200
  1036  	XP1_SUPPORT_MULTIPOINT       = 0x00000400
  1037  	XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800
  1038  	XP1_MULTIPOINT_DATA_PLANE    = 0x00001000
  1039  	XP1_QOS_SUPPORTED            = 0x00002000
  1040  	XP1_UNI_SEND                 = 0x00008000
  1041  	XP1_UNI_RECV                 = 0x00010000
  1042  	XP1_IFS_HANDLES              = 0x00020000
  1043  	XP1_PARTIAL_MESSAGE          = 0x00040000
  1044  	XP1_SAN_SUPPORT_SDP          = 0x00080000
  1045  
  1046  	PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001
  1047  	PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002
  1048  	PFL_HIDDEN                  = 0x00000004
  1049  	PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008
  1050  	PFL_NETWORKDIRECT_PROVIDER  = 0x00000010
  1051  )
  1052  
  1053  type WSAProtocolInfo struct {
  1054  	ServiceFlags1     uint32
  1055  	ServiceFlags2     uint32
  1056  	ServiceFlags3     uint32
  1057  	ServiceFlags4     uint32
  1058  	ProviderFlags     uint32
  1059  	ProviderId        GUID
  1060  	CatalogEntryId    uint32
  1061  	ProtocolChain     WSAProtocolChain
  1062  	Version           int32
  1063  	AddressFamily     int32
  1064  	MaxSockAddr       int32
  1065  	MinSockAddr       int32
  1066  	SocketType        int32
  1067  	Protocol          int32
  1068  	ProtocolMaxOffset int32
  1069  	NetworkByteOrder  int32
  1070  	SecurityScheme    int32
  1071  	MessageSize       uint32
  1072  	ProviderReserved  uint32
  1073  	ProtocolName      [WSAPROTOCOL_LEN + 1]uint16
  1074  }
  1075  
  1076  type WSAProtocolChain struct {
  1077  	ChainLen     int32
  1078  	ChainEntries [MAX_PROTOCOL_CHAIN]uint32
  1079  }
  1080  
  1081  type TCPKeepalive struct {
  1082  	OnOff    uint32
  1083  	Time     uint32
  1084  	Interval uint32
  1085  }
  1086  
  1087  type symbolicLinkReparseBuffer struct {
  1088  	SubstituteNameOffset uint16
  1089  	SubstituteNameLength uint16
  1090  	PrintNameOffset      uint16
  1091  	PrintNameLength      uint16
  1092  	Flags                uint32
  1093  	PathBuffer           [1]uint16
  1094  }
  1095  
  1096  type mountPointReparseBuffer struct {
  1097  	SubstituteNameOffset uint16
  1098  	SubstituteNameLength uint16
  1099  	PrintNameOffset      uint16
  1100  	PrintNameLength      uint16
  1101  	PathBuffer           [1]uint16
  1102  }
  1103  
  1104  type reparseDataBuffer struct {
  1105  	ReparseTag        uint32
  1106  	ReparseDataLength uint16
  1107  	Reserved          uint16
  1108  
  1109  	// GenericReparseBuffer
  1110  	reparseBuffer byte
  1111  }
  1112  
  1113  const (
  1114  	FSCTL_GET_REPARSE_POINT          = 0x900A8
  1115  	MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024
  1116  	_IO_REPARSE_TAG_MOUNT_POINT      = 0xA0000003
  1117  	IO_REPARSE_TAG_SYMLINK           = 0xA000000C
  1118  	SYMBOLIC_LINK_FLAG_DIRECTORY     = 0x1
  1119  	_SYMLINK_FLAG_RELATIVE           = 1
  1120  )