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
5package windows
6
7import (
8	"net"
9	"syscall"
10	"unsafe"
11)
12
13const (
14	// Invented values to support what package os expects.
15	O_RDONLY   = 0x00000
16	O_WRONLY   = 0x00001
17	O_RDWR     = 0x00002
18	O_CREAT    = 0x00040
19	O_EXCL     = 0x00080
20	O_NOCTTY   = 0x00100
21	O_TRUNC    = 0x00200
22	O_NONBLOCK = 0x00800
23	O_APPEND   = 0x00400
24	O_SYNC     = 0x01000
25	O_ASYNC    = 0x02000
26	O_CLOEXEC  = 0x80000
27)
28
29const (
30	// More invented values for signals
31	SIGHUP  = Signal(0x1)
32	SIGINT  = Signal(0x2)
33	SIGQUIT = Signal(0x3)
34	SIGILL  = Signal(0x4)
35	SIGTRAP = Signal(0x5)
36	SIGABRT = Signal(0x6)
37	SIGBUS  = Signal(0x7)
38	SIGFPE  = Signal(0x8)
39	SIGKILL = Signal(0x9)
40	SIGSEGV = Signal(0xb)
41	SIGPIPE = Signal(0xd)
42	SIGALRM = Signal(0xe)
43	SIGTERM = Signal(0xf)
44)
45
46var signals = [...]string{
47	1:  "hangup",
48	2:  "interrupt",
49	3:  "quit",
50	4:  "illegal instruction",
51	5:  "trace/breakpoint trap",
52	6:  "aborted",
53	7:  "bus error",
54	8:  "floating point exception",
55	9:  "killed",
56	10: "user defined signal 1",
57	11: "segmentation fault",
58	12: "user defined signal 2",
59	13: "broken pipe",
60	14: "alarm clock",
61	15: "terminated",
62}
63
64const (
65	GENERIC_READ    = 0x80000000
66	GENERIC_WRITE   = 0x40000000
67	GENERIC_EXECUTE = 0x20000000
68	GENERIC_ALL     = 0x10000000
69
70	FILE_LIST_DIRECTORY   = 0x00000001
71	FILE_APPEND_DATA      = 0x00000004
72	FILE_WRITE_ATTRIBUTES = 0x00000100
73
74	FILE_SHARE_READ   = 0x00000001
75	FILE_SHARE_WRITE  = 0x00000002
76	FILE_SHARE_DELETE = 0x00000004
77
78	FILE_ATTRIBUTE_READONLY              = 0x00000001
79	FILE_ATTRIBUTE_HIDDEN                = 0x00000002
80	FILE_ATTRIBUTE_SYSTEM                = 0x00000004
81	FILE_ATTRIBUTE_DIRECTORY             = 0x00000010
82	FILE_ATTRIBUTE_ARCHIVE               = 0x00000020
83	FILE_ATTRIBUTE_DEVICE                = 0x00000040
84	FILE_ATTRIBUTE_NORMAL                = 0x00000080
85	FILE_ATTRIBUTE_TEMPORARY             = 0x00000100
86	FILE_ATTRIBUTE_SPARSE_FILE           = 0x00000200
87	FILE_ATTRIBUTE_REPARSE_POINT         = 0x00000400
88	FILE_ATTRIBUTE_COMPRESSED            = 0x00000800
89	FILE_ATTRIBUTE_OFFLINE               = 0x00001000
90	FILE_ATTRIBUTE_NOT_CONTENT_INDEXED   = 0x00002000
91	FILE_ATTRIBUTE_ENCRYPTED             = 0x00004000
92	FILE_ATTRIBUTE_INTEGRITY_STREAM      = 0x00008000
93	FILE_ATTRIBUTE_VIRTUAL               = 0x00010000
94	FILE_ATTRIBUTE_NO_SCRUB_DATA         = 0x00020000
95	FILE_ATTRIBUTE_RECALL_ON_OPEN        = 0x00040000
96	FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = 0x00400000
97
98	INVALID_FILE_ATTRIBUTES = 0xffffffff
99
100	CREATE_NEW        = 1
101	CREATE_ALWAYS     = 2
102	OPEN_EXISTING     = 3
103	OPEN_ALWAYS       = 4
104	TRUNCATE_EXISTING = 5
105
106	FILE_FLAG_OPEN_REQUIRING_OPLOCK = 0x00040000
107	FILE_FLAG_FIRST_PIPE_INSTANCE   = 0x00080000
108	FILE_FLAG_OPEN_NO_RECALL        = 0x00100000
109	FILE_FLAG_OPEN_REPARSE_POINT    = 0x00200000
110	FILE_FLAG_SESSION_AWARE         = 0x00800000
111	FILE_FLAG_POSIX_SEMANTICS       = 0x01000000
112	FILE_FLAG_BACKUP_SEMANTICS      = 0x02000000
113	FILE_FLAG_DELETE_ON_CLOSE       = 0x04000000
114	FILE_FLAG_SEQUENTIAL_SCAN       = 0x08000000
115	FILE_FLAG_RANDOM_ACCESS         = 0x10000000
116	FILE_FLAG_NO_BUFFERING          = 0x20000000
117	FILE_FLAG_OVERLAPPED            = 0x40000000
118	FILE_FLAG_WRITE_THROUGH         = 0x80000000
119
120	HANDLE_FLAG_INHERIT    = 0x00000001
121	STARTF_USESTDHANDLES   = 0x00000100
122	STARTF_USESHOWWINDOW   = 0x00000001
123	DUPLICATE_CLOSE_SOURCE = 0x00000001
124	DUPLICATE_SAME_ACCESS  = 0x00000002
125
126	STD_INPUT_HANDLE  = -10 & (1<<32 - 1)
127	STD_OUTPUT_HANDLE = -11 & (1<<32 - 1)
128	STD_ERROR_HANDLE  = -12 & (1<<32 - 1)
129
130	FILE_BEGIN   = 0
131	FILE_CURRENT = 1
132	FILE_END     = 2
133
134	LANG_ENGLISH       = 0x09
135	SUBLANG_ENGLISH_US = 0x01
136
137	FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
138	FORMAT_MESSAGE_IGNORE_INSERTS  = 512
139	FORMAT_MESSAGE_FROM_STRING     = 1024
140	FORMAT_MESSAGE_FROM_HMODULE    = 2048
141	FORMAT_MESSAGE_FROM_SYSTEM     = 4096
142	FORMAT_MESSAGE_ARGUMENT_ARRAY  = 8192
143	FORMAT_MESSAGE_MAX_WIDTH_MASK  = 255
144
145	MAX_PATH      = 260
146	MAX_LONG_PATH = 32768
147
148	MAX_COMPUTERNAME_LENGTH = 15
149
150	TIME_ZONE_ID_UNKNOWN  = 0
151	TIME_ZONE_ID_STANDARD = 1
152
153	TIME_ZONE_ID_DAYLIGHT = 2
154	IGNORE                = 0
155	INFINITE              = 0xffffffff
156
157	WAIT_ABANDONED = 0x00000080
158	WAIT_OBJECT_0  = 0x00000000
159	WAIT_FAILED    = 0xFFFFFFFF
160
161	// Standard access rights.
162	DELETE       = 0x00010000
163	READ_CONTROL = 0x00020000
164	SYNCHRONIZE  = 0x00100000
165	WRITE_DAC    = 0x00040000
166	WRITE_OWNER  = 0x00080000
167
168	// Access rights for process.
169	PROCESS_CREATE_PROCESS            = 0x0080
170	PROCESS_CREATE_THREAD             = 0x0002
171	PROCESS_DUP_HANDLE                = 0x0040
172	PROCESS_QUERY_INFORMATION         = 0x0400
173	PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
174	PROCESS_SET_INFORMATION           = 0x0200
175	PROCESS_SET_QUOTA                 = 0x0100
176	PROCESS_SUSPEND_RESUME            = 0x0800
177	PROCESS_TERMINATE                 = 0x0001
178	PROCESS_VM_OPERATION              = 0x0008
179	PROCESS_VM_READ                   = 0x0010
180	PROCESS_VM_WRITE                  = 0x0020
181
182	// Access rights for thread.
183	THREAD_DIRECT_IMPERSONATION      = 0x0200
184	THREAD_GET_CONTEXT               = 0x0008
185	THREAD_IMPERSONATE               = 0x0100
186	THREAD_QUERY_INFORMATION         = 0x0040
187	THREAD_QUERY_LIMITED_INFORMATION = 0x0800
188	THREAD_SET_CONTEXT               = 0x0010
189	THREAD_SET_INFORMATION           = 0x0020
190	THREAD_SET_LIMITED_INFORMATION   = 0x0400
191	THREAD_SET_THREAD_TOKEN          = 0x0080
192	THREAD_SUSPEND_RESUME            = 0x0002
193	THREAD_TERMINATE                 = 0x0001
194
195	FILE_MAP_COPY    = 0x01
196	FILE_MAP_WRITE   = 0x02
197	FILE_MAP_READ    = 0x04
198	FILE_MAP_EXECUTE = 0x20
199
200	CTRL_C_EVENT        = 0
201	CTRL_BREAK_EVENT    = 1
202	CTRL_CLOSE_EVENT    = 2
203	CTRL_LOGOFF_EVENT   = 5
204	CTRL_SHUTDOWN_EVENT = 6
205
206	// Windows reserves errors >= 1<<29 for application use.
207	APPLICATION_ERROR = 1 << 29
208)
209
210const (
211	// Process creation flags.
212	CREATE_BREAKAWAY_FROM_JOB        = 0x01000000
213	CREATE_DEFAULT_ERROR_MODE        = 0x04000000
214	CREATE_NEW_CONSOLE               = 0x00000010
215	CREATE_NEW_PROCESS_GROUP         = 0x00000200
216	CREATE_NO_WINDOW                 = 0x08000000
217	CREATE_PROTECTED_PROCESS         = 0x00040000
218	CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000
219	CREATE_SEPARATE_WOW_VDM          = 0x00000800
220	CREATE_SHARED_WOW_VDM            = 0x00001000
221	CREATE_SUSPENDED                 = 0x00000004
222	CREATE_UNICODE_ENVIRONMENT       = 0x00000400
223	DEBUG_ONLY_THIS_PROCESS          = 0x00000002
224	DEBUG_PROCESS                    = 0x00000001
225	DETACHED_PROCESS                 = 0x00000008
226	EXTENDED_STARTUPINFO_PRESENT     = 0x00080000
227	INHERIT_PARENT_AFFINITY          = 0x00010000
228)
229
230const (
231	// flags for CreateToolhelp32Snapshot
232	TH32CS_SNAPHEAPLIST = 0x01
233	TH32CS_SNAPPROCESS  = 0x02
234	TH32CS_SNAPTHREAD   = 0x04
235	TH32CS_SNAPMODULE   = 0x08
236	TH32CS_SNAPMODULE32 = 0x10
237	TH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD
238	TH32CS_INHERIT      = 0x80000000
239)
240
241const (
242	// filters for ReadDirectoryChangesW
243	FILE_NOTIFY_CHANGE_FILE_NAME   = 0x001
244	FILE_NOTIFY_CHANGE_DIR_NAME    = 0x002
245	FILE_NOTIFY_CHANGE_ATTRIBUTES  = 0x004
246	FILE_NOTIFY_CHANGE_SIZE        = 0x008
247	FILE_NOTIFY_CHANGE_LAST_WRITE  = 0x010
248	FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020
249	FILE_NOTIFY_CHANGE_CREATION    = 0x040
250	FILE_NOTIFY_CHANGE_SECURITY    = 0x100
251)
252
253const (
254	// do not reorder
255	FILE_ACTION_ADDED = iota + 1
256	FILE_ACTION_REMOVED
257	FILE_ACTION_MODIFIED
258	FILE_ACTION_RENAMED_OLD_NAME
259	FILE_ACTION_RENAMED_NEW_NAME
260)
261
262const (
263	// wincrypt.h
264	PROV_RSA_FULL                    = 1
265	PROV_RSA_SIG                     = 2
266	PROV_DSS                         = 3
267	PROV_FORTEZZA                    = 4
268	PROV_MS_EXCHANGE                 = 5
269	PROV_SSL                         = 6
270	PROV_RSA_SCHANNEL                = 12
271	PROV_DSS_DH                      = 13
272	PROV_EC_ECDSA_SIG                = 14
273	PROV_EC_ECNRA_SIG                = 15
274	PROV_EC_ECDSA_FULL               = 16
275	PROV_EC_ECNRA_FULL               = 17
276	PROV_DH_SCHANNEL                 = 18
277	PROV_SPYRUS_LYNKS                = 20
278	PROV_RNG                         = 21
279	PROV_INTEL_SEC                   = 22
280	PROV_REPLACE_OWF                 = 23
281	PROV_RSA_AES                     = 24
282	CRYPT_VERIFYCONTEXT              = 0xF0000000
283	CRYPT_NEWKEYSET                  = 0x00000008
284	CRYPT_DELETEKEYSET               = 0x00000010
285	CRYPT_MACHINE_KEYSET             = 0x00000020
286	CRYPT_SILENT                     = 0x00000040
287	CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080
288
289	USAGE_MATCH_TYPE_AND = 0
290	USAGE_MATCH_TYPE_OR  = 1
291
292	/* msgAndCertEncodingType values for CertOpenStore function */
293	X509_ASN_ENCODING   = 0x00000001
294	PKCS_7_ASN_ENCODING = 0x00010000
295
296	/* storeProvider values for CertOpenStore function */
297	CERT_STORE_PROV_MSG               = 1
298	CERT_STORE_PROV_MEMORY            = 2
299	CERT_STORE_PROV_FILE              = 3
300	CERT_STORE_PROV_REG               = 4
301	CERT_STORE_PROV_PKCS7             = 5
302	CERT_STORE_PROV_SERIALIZED        = 6
303	CERT_STORE_PROV_FILENAME_A        = 7
304	CERT_STORE_PROV_FILENAME_W        = 8
305	CERT_STORE_PROV_FILENAME          = CERT_STORE_PROV_FILENAME_W
306	CERT_STORE_PROV_SYSTEM_A          = 9
307	CERT_STORE_PROV_SYSTEM_W          = 10
308	CERT_STORE_PROV_SYSTEM            = CERT_STORE_PROV_SYSTEM_W
309	CERT_STORE_PROV_COLLECTION        = 11
310	CERT_STORE_PROV_SYSTEM_REGISTRY_A = 12
311	CERT_STORE_PROV_SYSTEM_REGISTRY_W = 13
312	CERT_STORE_PROV_SYSTEM_REGISTRY   = CERT_STORE_PROV_SYSTEM_REGISTRY_W
313	CERT_STORE_PROV_PHYSICAL_W        = 14
314	CERT_STORE_PROV_PHYSICAL          = CERT_STORE_PROV_PHYSICAL_W
315	CERT_STORE_PROV_SMART_CARD_W      = 15
316	CERT_STORE_PROV_SMART_CARD        = CERT_STORE_PROV_SMART_CARD_W
317	CERT_STORE_PROV_LDAP_W            = 16
318	CERT_STORE_PROV_LDAP              = CERT_STORE_PROV_LDAP_W
319	CERT_STORE_PROV_PKCS12            = 17
320
321	/* store characteristics (low WORD of flag) for CertOpenStore function */
322	CERT_STORE_NO_CRYPT_RELEASE_FLAG            = 0x00000001
323	CERT_STORE_SET_LOCALIZED_NAME_FLAG          = 0x00000002
324	CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004
325	CERT_STORE_DELETE_FLAG                      = 0x00000010
326	CERT_STORE_UNSAFE_PHYSICAL_FLAG             = 0x00000020
327	CERT_STORE_SHARE_STORE_FLAG                 = 0x00000040
328	CERT_STORE_SHARE_CONTEXT_FLAG               = 0x00000080
329	CERT_STORE_MANIFOLD_FLAG                    = 0x00000100
330	CERT_STORE_ENUM_ARCHIVED_FLAG               = 0x00000200
331	CERT_STORE_UPDATE_KEYID_FLAG                = 0x00000400
332	CERT_STORE_BACKUP_RESTORE_FLAG              = 0x00000800
333	CERT_STORE_MAXIMUM_ALLOWED_FLAG             = 0x00001000
334	CERT_STORE_CREATE_NEW_FLAG                  = 0x00002000
335	CERT_STORE_OPEN_EXISTING_FLAG               = 0x00004000
336	CERT_STORE_READONLY_FLAG                    = 0x00008000
337
338	/* store locations (high WORD of flag) for CertOpenStore function */
339	CERT_SYSTEM_STORE_CURRENT_USER               = 0x00010000
340	CERT_SYSTEM_STORE_LOCAL_MACHINE              = 0x00020000
341	CERT_SYSTEM_STORE_CURRENT_SERVICE            = 0x00040000
342	CERT_SYSTEM_STORE_SERVICES                   = 0x00050000
343	CERT_SYSTEM_STORE_USERS                      = 0x00060000
344	CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY  = 0x00070000
345	CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 0x00080000
346	CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE   = 0x00090000
347	CERT_SYSTEM_STORE_UNPROTECTED_FLAG           = 0x40000000
348	CERT_SYSTEM_STORE_RELOCATE_FLAG              = 0x80000000
349
350	/* Miscellaneous high-WORD flags for CertOpenStore function */
351	CERT_REGISTRY_STORE_REMOTE_FLAG      = 0x00010000
352	CERT_REGISTRY_STORE_SERIALIZED_FLAG  = 0x00020000
353	CERT_REGISTRY_STORE_ROAMING_FLAG     = 0x00040000
354	CERT_REGISTRY_STORE_MY_IE_DIRTY_FLAG = 0x00080000
355	CERT_REGISTRY_STORE_LM_GPT_FLAG      = 0x01000000
356	CERT_REGISTRY_STORE_CLIENT_GPT_FLAG  = 0x80000000
357	CERT_FILE_STORE_COMMIT_ENABLE_FLAG   = 0x00010000
358	CERT_LDAP_STORE_SIGN_FLAG            = 0x00010000
359	CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG  = 0x00020000
360	CERT_LDAP_STORE_OPENED_FLAG          = 0x00040000
361	CERT_LDAP_STORE_UNBIND_FLAG          = 0x00080000
362
363	/* addDisposition values for CertAddCertificateContextToStore function */
364	CERT_STORE_ADD_NEW                                 = 1
365	CERT_STORE_ADD_USE_EXISTING                        = 2
366	CERT_STORE_ADD_REPLACE_EXISTING                    = 3
367	CERT_STORE_ADD_ALWAYS                              = 4
368	CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5
369	CERT_STORE_ADD_NEWER                               = 6
370	CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES            = 7
371
372	/* ErrorStatus values for CertTrustStatus struct */
373	CERT_TRUST_NO_ERROR                          = 0x00000000
374	CERT_TRUST_IS_NOT_TIME_VALID                 = 0x00000001
375	CERT_TRUST_IS_REVOKED                        = 0x00000004
376	CERT_TRUST_IS_NOT_SIGNATURE_VALID            = 0x00000008
377	CERT_TRUST_IS_NOT_VALID_FOR_USAGE            = 0x00000010
378	CERT_TRUST_IS_UNTRUSTED_ROOT                 = 0x00000020
379	CERT_TRUST_REVOCATION_STATUS_UNKNOWN         = 0x00000040
380	CERT_TRUST_IS_CYCLIC                         = 0x00000080
381	CERT_TRUST_INVALID_EXTENSION                 = 0x00000100
382	CERT_TRUST_INVALID_POLICY_CONSTRAINTS        = 0x00000200
383	CERT_TRUST_INVALID_BASIC_CONSTRAINTS         = 0x00000400
384	CERT_TRUST_INVALID_NAME_CONSTRAINTS          = 0x00000800
385	CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000
386	CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT   = 0x00002000
387	CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000
388	CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT      = 0x00008000
389	CERT_TRUST_IS_PARTIAL_CHAIN                  = 0x00010000
390	CERT_TRUST_CTL_IS_NOT_TIME_VALID             = 0x00020000
391	CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID        = 0x00040000
392	CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE        = 0x00080000
393	CERT_TRUST_HAS_WEAK_SIGNATURE                = 0x00100000
394	CERT_TRUST_IS_OFFLINE_REVOCATION             = 0x01000000
395	CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY          = 0x02000000
396	CERT_TRUST_IS_EXPLICIT_DISTRUST              = 0x04000000
397	CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT    = 0x08000000
398
399	/* InfoStatus values for CertTrustStatus struct */
400	CERT_TRUST_HAS_EXACT_MATCH_ISSUER        = 0x00000001
401	CERT_TRUST_HAS_KEY_MATCH_ISSUER          = 0x00000002
402	CERT_TRUST_HAS_NAME_MATCH_ISSUER         = 0x00000004
403	CERT_TRUST_IS_SELF_SIGNED                = 0x00000008
404	CERT_TRUST_HAS_PREFERRED_ISSUER          = 0x00000100
405	CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY     = 0x00000400
406	CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS    = 0x00000400
407	CERT_TRUST_IS_PEER_TRUSTED               = 0x00000800
408	CERT_TRUST_HAS_CRL_VALIDITY_EXTENDED     = 0x00001000
409	CERT_TRUST_IS_FROM_EXCLUSIVE_TRUST_STORE = 0x00002000
410	CERT_TRUST_IS_CA_TRUSTED                 = 0x00004000
411	CERT_TRUST_IS_COMPLEX_CHAIN              = 0x00010000
412
413	/* policyOID values for CertVerifyCertificateChainPolicy function */
414	CERT_CHAIN_POLICY_BASE              = 1
415	CERT_CHAIN_POLICY_AUTHENTICODE      = 2
416	CERT_CHAIN_POLICY_AUTHENTICODE_TS   = 3
417	CERT_CHAIN_POLICY_SSL               = 4
418	CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5
419	CERT_CHAIN_POLICY_NT_AUTH           = 6
420	CERT_CHAIN_POLICY_MICROSOFT_ROOT    = 7
421	CERT_CHAIN_POLICY_EV                = 8
422	CERT_CHAIN_POLICY_SSL_F12           = 9
423
424	/* AuthType values for SSLExtraCertChainPolicyPara struct */
425	AUTHTYPE_CLIENT = 1
426	AUTHTYPE_SERVER = 2
427
428	/* Checks values for SSLExtraCertChainPolicyPara struct */
429	SECURITY_FLAG_IGNORE_REVOCATION        = 0x00000080
430	SECURITY_FLAG_IGNORE_UNKNOWN_CA        = 0x00000100
431	SECURITY_FLAG_IGNORE_WRONG_USAGE       = 0x00000200
432	SECURITY_FLAG_IGNORE_CERT_CN_INVALID   = 0x00001000
433	SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000
434)
435
436const (
437	// flags for SetErrorMode
438	SEM_FAILCRITICALERRORS     = 0x0001
439	SEM_NOALIGNMENTFAULTEXCEPT = 0x0004
440	SEM_NOGPFAULTERRORBOX      = 0x0002
441	SEM_NOOPENFILEERRORBOX     = 0x8000
442)
443
444const (
445	// Priority class.
446	ABOVE_NORMAL_PRIORITY_CLASS   = 0x00008000
447	BELOW_NORMAL_PRIORITY_CLASS   = 0x00004000
448	HIGH_PRIORITY_CLASS           = 0x00000080
449	IDLE_PRIORITY_CLASS           = 0x00000040
450	NORMAL_PRIORITY_CLASS         = 0x00000020
451	PROCESS_MODE_BACKGROUND_BEGIN = 0x00100000
452	PROCESS_MODE_BACKGROUND_END   = 0x00200000
453	REALTIME_PRIORITY_CLASS       = 0x00000100
454)
455
456var (
457	OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00")
458	OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00")
459	OID_SGC_NETSCAPE        = []byte("2.16.840.1.113730.4.1\x00")
460)
461
462// Pointer represents a pointer to an arbitrary Windows type.
463//
464// Pointer-typed fields may point to one of many different types. It's
465// up to the caller to provide a pointer to the appropriate type, cast
466// to Pointer. The caller must obey the unsafe.Pointer rules while
467// doing so.
468type Pointer *struct{}
469
470// Invented values to support what package os expects.
471type Timeval struct {
472	Sec  int32
473	Usec int32
474}
475
476func (tv *Timeval) Nanoseconds() int64 {
477	return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3
478}
479
480func NsecToTimeval(nsec int64) (tv Timeval) {
481	tv.Sec = int32(nsec / 1e9)
482	tv.Usec = int32(nsec % 1e9 / 1e3)
483	return
484}
485
486type SecurityAttributes struct {
487	Length             uint32
488	SecurityDescriptor uintptr
489	InheritHandle      uint32
490}
491
492type Overlapped struct {
493	Internal     uintptr
494	InternalHigh uintptr
495	Offset       uint32
496	OffsetHigh   uint32
497	HEvent       Handle
498}
499
500type FileNotifyInformation struct {
501	NextEntryOffset uint32
502	Action          uint32
503	FileNameLength  uint32
504	FileName        uint16
505}
506
507type Filetime struct {
508	LowDateTime  uint32
509	HighDateTime uint32
510}
511
512// Nanoseconds returns Filetime ft in nanoseconds
513// since Epoch (00:00:00 UTC, January 1, 1970).
514func (ft *Filetime) Nanoseconds() int64 {
515	// 100-nanosecond intervals since January 1, 1601
516	nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime)
517	// change starting time to the Epoch (00:00:00 UTC, January 1, 1970)
518	nsec -= 116444736000000000
519	// convert into nanoseconds
520	nsec *= 100
521	return nsec
522}
523
524func NsecToFiletime(nsec int64) (ft Filetime) {
525	// convert into 100-nanosecond
526	nsec /= 100
527	// change starting time to January 1, 1601
528	nsec += 116444736000000000
529	// split into high / low
530	ft.LowDateTime = uint32(nsec & 0xffffffff)
531	ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff)
532	return ft
533}
534
535type Win32finddata struct {
536	FileAttributes    uint32
537	CreationTime      Filetime
538	LastAccessTime    Filetime
539	LastWriteTime     Filetime
540	FileSizeHigh      uint32
541	FileSizeLow       uint32
542	Reserved0         uint32
543	Reserved1         uint32
544	FileName          [MAX_PATH - 1]uint16
545	AlternateFileName [13]uint16
546}
547
548// This is the actual system call structure.
549// Win32finddata is what we committed to in Go 1.
550type win32finddata1 struct {
551	FileAttributes    uint32
552	CreationTime      Filetime
553	LastAccessTime    Filetime
554	LastWriteTime     Filetime
555	FileSizeHigh      uint32
556	FileSizeLow       uint32
557	Reserved0         uint32
558	Reserved1         uint32
559	FileName          [MAX_PATH]uint16
560	AlternateFileName [14]uint16
561}
562
563func copyFindData(dst *Win32finddata, src *win32finddata1) {
564	dst.FileAttributes = src.FileAttributes
565	dst.CreationTime = src.CreationTime
566	dst.LastAccessTime = src.LastAccessTime
567	dst.LastWriteTime = src.LastWriteTime
568	dst.FileSizeHigh = src.FileSizeHigh
569	dst.FileSizeLow = src.FileSizeLow
570	dst.Reserved0 = src.Reserved0
571	dst.Reserved1 = src.Reserved1
572
573	// The src is 1 element bigger than dst, but it must be NUL.
574	copy(dst.FileName[:], src.FileName[:])
575	copy(dst.AlternateFileName[:], src.AlternateFileName[:])
576}
577
578type ByHandleFileInformation struct {
579	FileAttributes     uint32
580	CreationTime       Filetime
581	LastAccessTime     Filetime
582	LastWriteTime      Filetime
583	VolumeSerialNumber uint32
584	FileSizeHigh       uint32
585	FileSizeLow        uint32
586	NumberOfLinks      uint32
587	FileIndexHigh      uint32
588	FileIndexLow       uint32
589}
590
591const (
592	GetFileExInfoStandard = 0
593	GetFileExMaxInfoLevel = 1
594)
595
596type Win32FileAttributeData struct {
597	FileAttributes uint32
598	CreationTime   Filetime
599	LastAccessTime Filetime
600	LastWriteTime  Filetime
601	FileSizeHigh   uint32
602	FileSizeLow    uint32
603}
604
605// ShowWindow constants
606const (
607	// winuser.h
608	SW_HIDE            = 0
609	SW_NORMAL          = 1
610	SW_SHOWNORMAL      = 1
611	SW_SHOWMINIMIZED   = 2
612	SW_SHOWMAXIMIZED   = 3
613	SW_MAXIMIZE        = 3
614	SW_SHOWNOACTIVATE  = 4
615	SW_SHOW            = 5
616	SW_MINIMIZE        = 6
617	SW_SHOWMINNOACTIVE = 7
618	SW_SHOWNA          = 8
619	SW_RESTORE         = 9
620	SW_SHOWDEFAULT     = 10
621	SW_FORCEMINIMIZE   = 11
622)
623
624type StartupInfo struct {
625	Cb            uint32
626	_             *uint16
627	Desktop       *uint16
628	Title         *uint16
629	X             uint32
630	Y             uint32
631	XSize         uint32
632	YSize         uint32
633	XCountChars   uint32
634	YCountChars   uint32
635	FillAttribute uint32
636	Flags         uint32
637	ShowWindow    uint16
638	_             uint16
639	_             *byte
640	StdInput      Handle
641	StdOutput     Handle
642	StdErr        Handle
643}
644
645type ProcessInformation struct {
646	Process   Handle
647	Thread    Handle
648	ProcessId uint32
649	ThreadId  uint32
650}
651
652type ProcessEntry32 struct {
653	Size            uint32
654	Usage           uint32
655	ProcessID       uint32
656	DefaultHeapID   uintptr
657	ModuleID        uint32
658	Threads         uint32
659	ParentProcessID uint32
660	PriClassBase    int32
661	Flags           uint32
662	ExeFile         [MAX_PATH]uint16
663}
664
665type ThreadEntry32 struct {
666	Size           uint32
667	Usage          uint32
668	ThreadID       uint32
669	OwnerProcessID uint32
670	BasePri        int32
671	DeltaPri       int32
672	Flags          uint32
673}
674
675type Systemtime struct {
676	Year         uint16
677	Month        uint16
678	DayOfWeek    uint16
679	Day          uint16
680	Hour         uint16
681	Minute       uint16
682	Second       uint16
683	Milliseconds uint16
684}
685
686type Timezoneinformation struct {
687	Bias         int32
688	StandardName [32]uint16
689	StandardDate Systemtime
690	StandardBias int32
691	DaylightName [32]uint16
692	DaylightDate Systemtime
693	DaylightBias int32
694}
695
696// Socket related.
697
698const (
699	AF_UNSPEC  = 0
700	AF_UNIX    = 1
701	AF_INET    = 2
702	AF_INET6   = 23
703	AF_NETBIOS = 17
704
705	SOCK_STREAM    = 1
706	SOCK_DGRAM     = 2
707	SOCK_RAW       = 3
708	SOCK_SEQPACKET = 5
709
710	IPPROTO_IP   = 0
711	IPPROTO_IPV6 = 0x29
712	IPPROTO_TCP  = 6
713	IPPROTO_UDP  = 17
714
715	SOL_SOCKET                = 0xffff
716	SO_REUSEADDR              = 4
717	SO_KEEPALIVE              = 8
718	SO_DONTROUTE              = 16
719	SO_BROADCAST              = 32
720	SO_LINGER                 = 128
721	SO_RCVBUF                 = 0x1002
722	SO_SNDBUF                 = 0x1001
723	SO_UPDATE_ACCEPT_CONTEXT  = 0x700b
724	SO_UPDATE_CONNECT_CONTEXT = 0x7010
725
726	IOC_OUT                            = 0x40000000
727	IOC_IN                             = 0x80000000
728	IOC_VENDOR                         = 0x18000000
729	IOC_INOUT                          = IOC_IN | IOC_OUT
730	IOC_WS2                            = 0x08000000
731	SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6
732	SIO_KEEPALIVE_VALS                 = IOC_IN | IOC_VENDOR | 4
733	SIO_UDP_CONNRESET                  = IOC_IN | IOC_VENDOR | 12
734
735	// cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460
736
737	IP_TOS             = 0x3
738	IP_TTL             = 0x4
739	IP_MULTICAST_IF    = 0x9
740	IP_MULTICAST_TTL   = 0xa
741	IP_MULTICAST_LOOP  = 0xb
742	IP_ADD_MEMBERSHIP  = 0xc
743	IP_DROP_MEMBERSHIP = 0xd
744
745	IPV6_V6ONLY         = 0x1b
746	IPV6_UNICAST_HOPS   = 0x4
747	IPV6_MULTICAST_IF   = 0x9
748	IPV6_MULTICAST_HOPS = 0xa
749	IPV6_MULTICAST_LOOP = 0xb
750	IPV6_JOIN_GROUP     = 0xc
751	IPV6_LEAVE_GROUP    = 0xd
752
753	MSG_OOB       = 0x1
754	MSG_PEEK      = 0x2
755	MSG_DONTROUTE = 0x4
756	MSG_WAITALL   = 0x8
757
758	MSG_TRUNC  = 0x0100
759	MSG_CTRUNC = 0x0200
760	MSG_BCAST  = 0x0400
761	MSG_MCAST  = 0x0800
762
763	SOMAXCONN = 0x7fffffff
764
765	TCP_NODELAY = 1
766
767	SHUT_RD   = 0
768	SHUT_WR   = 1
769	SHUT_RDWR = 2
770
771	WSADESCRIPTION_LEN = 256
772	WSASYS_STATUS_LEN  = 128
773)
774
775type WSABuf struct {
776	Len uint32
777	Buf *byte
778}
779
780type WSAMsg struct {
781	Name        *syscall.RawSockaddrAny
782	Namelen     int32
783	Buffers     *WSABuf
784	BufferCount uint32
785	Control     WSABuf
786	Flags       uint32
787}
788
789// Invented values to support what package os expects.
790const (
791	S_IFMT   = 0x1f000
792	S_IFIFO  = 0x1000
793	S_IFCHR  = 0x2000
794	S_IFDIR  = 0x4000
795	S_IFBLK  = 0x6000
796	S_IFREG  = 0x8000
797	S_IFLNK  = 0xa000
798	S_IFSOCK = 0xc000
799	S_ISUID  = 0x800
800	S_ISGID  = 0x400
801	S_ISVTX  = 0x200
802	S_IRUSR  = 0x100
803	S_IWRITE = 0x80
804	S_IWUSR  = 0x80
805	S_IXUSR  = 0x40
806)
807
808const (
809	FILE_TYPE_CHAR    = 0x0002
810	FILE_TYPE_DISK    = 0x0001
811	FILE_TYPE_PIPE    = 0x0003
812	FILE_TYPE_REMOTE  = 0x8000
813	FILE_TYPE_UNKNOWN = 0x0000
814)
815
816type Hostent struct {
817	Name     *byte
818	Aliases  **byte
819	AddrType uint16
820	Length   uint16
821	AddrList **byte
822}
823
824type Protoent struct {
825	Name    *byte
826	Aliases **byte
827	Proto   uint16
828}
829
830const (
831	DNS_TYPE_A       = 0x0001
832	DNS_TYPE_NS      = 0x0002
833	DNS_TYPE_MD      = 0x0003
834	DNS_TYPE_MF      = 0x0004
835	DNS_TYPE_CNAME   = 0x0005
836	DNS_TYPE_SOA     = 0x0006
837	DNS_TYPE_MB      = 0x0007
838	DNS_TYPE_MG      = 0x0008
839	DNS_TYPE_MR      = 0x0009
840	DNS_TYPE_NULL    = 0x000a
841	DNS_TYPE_WKS     = 0x000b
842	DNS_TYPE_PTR     = 0x000c
843	DNS_TYPE_HINFO   = 0x000d
844	DNS_TYPE_MINFO   = 0x000e
845	DNS_TYPE_MX      = 0x000f
846	DNS_TYPE_TEXT    = 0x0010
847	DNS_TYPE_RP      = 0x0011
848	DNS_TYPE_AFSDB   = 0x0012
849	DNS_TYPE_X25     = 0x0013
850	DNS_TYPE_ISDN    = 0x0014
851	DNS_TYPE_RT      = 0x0015
852	DNS_TYPE_NSAP    = 0x0016
853	DNS_TYPE_NSAPPTR = 0x0017
854	DNS_TYPE_SIG     = 0x0018
855	DNS_TYPE_KEY     = 0x0019
856	DNS_TYPE_PX      = 0x001a
857	DNS_TYPE_GPOS    = 0x001b
858	DNS_TYPE_AAAA    = 0x001c
859	DNS_TYPE_LOC     = 0x001d
860	DNS_TYPE_NXT     = 0x001e
861	DNS_TYPE_EID     = 0x001f
862	DNS_TYPE_NIMLOC  = 0x0020
863	DNS_TYPE_SRV     = 0x0021
864	DNS_TYPE_ATMA    = 0x0022
865	DNS_TYPE_NAPTR   = 0x0023
866	DNS_TYPE_KX      = 0x0024
867	DNS_TYPE_CERT    = 0x0025
868	DNS_TYPE_A6      = 0x0026
869	DNS_TYPE_DNAME   = 0x0027
870	DNS_TYPE_SINK    = 0x0028
871	DNS_TYPE_OPT     = 0x0029
872	DNS_TYPE_DS      = 0x002B
873	DNS_TYPE_RRSIG   = 0x002E
874	DNS_TYPE_NSEC    = 0x002F
875	DNS_TYPE_DNSKEY  = 0x0030
876	DNS_TYPE_DHCID   = 0x0031
877	DNS_TYPE_UINFO   = 0x0064
878	DNS_TYPE_UID     = 0x0065
879	DNS_TYPE_GID     = 0x0066
880	DNS_TYPE_UNSPEC  = 0x0067
881	DNS_TYPE_ADDRS   = 0x00f8
882	DNS_TYPE_TKEY    = 0x00f9
883	DNS_TYPE_TSIG    = 0x00fa
884	DNS_TYPE_IXFR    = 0x00fb
885	DNS_TYPE_AXFR    = 0x00fc
886	DNS_TYPE_MAILB   = 0x00fd
887	DNS_TYPE_MAILA   = 0x00fe
888	DNS_TYPE_ALL     = 0x00ff
889	DNS_TYPE_ANY     = 0x00ff
890	DNS_TYPE_WINS    = 0xff01
891	DNS_TYPE_WINSR   = 0xff02
892	DNS_TYPE_NBSTAT  = 0xff01
893)
894
895const (
896	// flags inside DNSRecord.Dw
897	DnsSectionQuestion   = 0x0000
898	DnsSectionAnswer     = 0x0001
899	DnsSectionAuthority  = 0x0002
900	DnsSectionAdditional = 0x0003
901)
902
903type DNSSRVData struct {
904	Target   *uint16
905	Priority uint16
906	Weight   uint16
907	Port     uint16
908	Pad      uint16
909}
910
911type DNSPTRData struct {
912	Host *uint16
913}
914
915type DNSMXData struct {
916	NameExchange *uint16
917	Preference   uint16
918	Pad          uint16
919}
920
921type DNSTXTData struct {
922	StringCount uint16
923	StringArray [1]*uint16
924}
925
926type DNSRecord struct {
927	Next     *DNSRecord
928	Name     *uint16
929	Type     uint16
930	Length   uint16
931	Dw       uint32
932	Ttl      uint32
933	Reserved uint32
934	Data     [40]byte
935}
936
937const (
938	TF_DISCONNECT         = 1
939	TF_REUSE_SOCKET       = 2
940	TF_WRITE_BEHIND       = 4
941	TF_USE_DEFAULT_WORKER = 0
942	TF_USE_SYSTEM_THREAD  = 16
943	TF_USE_KERNEL_APC     = 32
944)
945
946type TransmitFileBuffers struct {
947	Head       uintptr
948	HeadLength uint32
949	Tail       uintptr
950	TailLength uint32
951}
952
953const (
954	IFF_UP           = 1
955	IFF_BROADCAST    = 2
956	IFF_LOOPBACK     = 4
957	IFF_POINTTOPOINT = 8
958	IFF_MULTICAST    = 16
959)
960
961const SIO_GET_INTERFACE_LIST = 0x4004747F
962
963// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old.
964// will be fixed to change variable type as suitable.
965
966type SockaddrGen [24]byte
967
968type InterfaceInfo struct {
969	Flags            uint32
970	Address          SockaddrGen
971	BroadcastAddress SockaddrGen
972	Netmask          SockaddrGen
973}
974
975type IpAddressString struct {
976	String [16]byte
977}
978
979type IpMaskString IpAddressString
980
981type IpAddrString struct {
982	Next      *IpAddrString
983	IpAddress IpAddressString
984	IpMask    IpMaskString
985	Context   uint32
986}
987
988const MAX_ADAPTER_NAME_LENGTH = 256
989const MAX_ADAPTER_DESCRIPTION_LENGTH = 128
990const MAX_ADAPTER_ADDRESS_LENGTH = 8
991
992type IpAdapterInfo struct {
993	Next                *IpAdapterInfo
994	ComboIndex          uint32
995	AdapterName         [MAX_ADAPTER_NAME_LENGTH + 4]byte
996	Description         [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte
997	AddressLength       uint32
998	Address             [MAX_ADAPTER_ADDRESS_LENGTH]byte
999	Index               uint32
1000	Type                uint32
1001	DhcpEnabled         uint32
1002	CurrentIpAddress    *IpAddrString
1003	IpAddressList       IpAddrString
1004	GatewayList         IpAddrString
1005	DhcpServer          IpAddrString
1006	HaveWins            bool
1007	PrimaryWinsServer   IpAddrString
1008	SecondaryWinsServer IpAddrString
1009	LeaseObtained       int64
1010	LeaseExpires        int64
1011}
1012
1013const MAXLEN_PHYSADDR = 8
1014const MAX_INTERFACE_NAME_LEN = 256
1015const MAXLEN_IFDESCR = 256
1016
1017type MibIfRow struct {
1018	Name            [MAX_INTERFACE_NAME_LEN]uint16
1019	Index           uint32
1020	Type            uint32
1021	Mtu             uint32
1022	Speed           uint32
1023	PhysAddrLen     uint32
1024	PhysAddr        [MAXLEN_PHYSADDR]byte
1025	AdminStatus     uint32
1026	OperStatus      uint32
1027	LastChange      uint32
1028	InOctets        uint32
1029	InUcastPkts     uint32
1030	InNUcastPkts    uint32
1031	InDiscards      uint32
1032	InErrors        uint32
1033	InUnknownProtos uint32
1034	OutOctets       uint32
1035	OutUcastPkts    uint32
1036	OutNUcastPkts   uint32
1037	OutDiscards     uint32
1038	OutErrors       uint32
1039	OutQLen         uint32
1040	DescrLen        uint32
1041	Descr           [MAXLEN_IFDESCR]byte
1042}
1043
1044type CertInfo struct {
1045	// Not implemented
1046}
1047
1048type CertContext struct {
1049	EncodingType uint32
1050	EncodedCert  *byte
1051	Length       uint32
1052	CertInfo     *CertInfo
1053	Store        Handle
1054}
1055
1056type CertChainContext struct {
1057	Size                       uint32
1058	TrustStatus                CertTrustStatus
1059	ChainCount                 uint32
1060	Chains                     **CertSimpleChain
1061	LowerQualityChainCount     uint32
1062	LowerQualityChains         **CertChainContext
1063	HasRevocationFreshnessTime uint32
1064	RevocationFreshnessTime    uint32
1065}
1066
1067type CertTrustListInfo struct {
1068	// Not implemented
1069}
1070
1071type CertSimpleChain struct {
1072	Size                       uint32
1073	TrustStatus                CertTrustStatus
1074	NumElements                uint32
1075	Elements                   **CertChainElement
1076	TrustListInfo              *CertTrustListInfo
1077	HasRevocationFreshnessTime uint32
1078	RevocationFreshnessTime    uint32
1079}
1080
1081type CertChainElement struct {
1082	Size              uint32
1083	CertContext       *CertContext
1084	TrustStatus       CertTrustStatus
1085	RevocationInfo    *CertRevocationInfo
1086	IssuanceUsage     *CertEnhKeyUsage
1087	ApplicationUsage  *CertEnhKeyUsage
1088	ExtendedErrorInfo *uint16
1089}
1090
1091type CertRevocationCrlInfo struct {
1092	// Not implemented
1093}
1094
1095type CertRevocationInfo struct {
1096	Size             uint32
1097	RevocationResult uint32
1098	RevocationOid    *byte
1099	OidSpecificInfo  Pointer
1100	HasFreshnessTime uint32
1101	FreshnessTime    uint32
1102	CrlInfo          *CertRevocationCrlInfo
1103}
1104
1105type CertTrustStatus struct {
1106	ErrorStatus uint32
1107	InfoStatus  uint32
1108}
1109
1110type CertUsageMatch struct {
1111	Type  uint32
1112	Usage CertEnhKeyUsage
1113}
1114
1115type CertEnhKeyUsage struct {
1116	Length           uint32
1117	UsageIdentifiers **byte
1118}
1119
1120type CertChainPara struct {
1121	Size                         uint32
1122	RequestedUsage               CertUsageMatch
1123	RequstedIssuancePolicy       CertUsageMatch
1124	URLRetrievalTimeout          uint32
1125	CheckRevocationFreshnessTime uint32
1126	RevocationFreshnessTime      uint32
1127	CacheResync                  *Filetime
1128}
1129
1130type CertChainPolicyPara struct {
1131	Size            uint32
1132	Flags           uint32
1133	ExtraPolicyPara Pointer
1134}
1135
1136type SSLExtraCertChainPolicyPara struct {
1137	Size       uint32
1138	AuthType   uint32
1139	Checks     uint32
1140	ServerName *uint16
1141}
1142
1143type CertChainPolicyStatus struct {
1144	Size              uint32
1145	Error             uint32
1146	ChainIndex        uint32
1147	ElementIndex      uint32
1148	ExtraPolicyStatus Pointer
1149}
1150
1151const (
1152	// do not reorder
1153	HKEY_CLASSES_ROOT = 0x80000000 + iota
1154	HKEY_CURRENT_USER
1155	HKEY_LOCAL_MACHINE
1156	HKEY_USERS
1157	HKEY_PERFORMANCE_DATA
1158	HKEY_CURRENT_CONFIG
1159	HKEY_DYN_DATA
1160
1161	KEY_QUERY_VALUE        = 1
1162	KEY_SET_VALUE          = 2
1163	KEY_CREATE_SUB_KEY     = 4
1164	KEY_ENUMERATE_SUB_KEYS = 8
1165	KEY_NOTIFY             = 16
1166	KEY_CREATE_LINK        = 32
1167	KEY_WRITE              = 0x20006
1168	KEY_EXECUTE            = 0x20019
1169	KEY_READ               = 0x20019
1170	KEY_WOW64_64KEY        = 0x0100
1171	KEY_WOW64_32KEY        = 0x0200
1172	KEY_ALL_ACCESS         = 0xf003f
1173)
1174
1175const (
1176	// do not reorder
1177	REG_NONE = iota
1178	REG_SZ
1179	REG_EXPAND_SZ
1180	REG_BINARY
1181	REG_DWORD_LITTLE_ENDIAN
1182	REG_DWORD_BIG_ENDIAN
1183	REG_LINK
1184	REG_MULTI_SZ
1185	REG_RESOURCE_LIST
1186	REG_FULL_RESOURCE_DESCRIPTOR
1187	REG_RESOURCE_REQUIREMENTS_LIST
1188	REG_QWORD_LITTLE_ENDIAN
1189	REG_DWORD = REG_DWORD_LITTLE_ENDIAN
1190	REG_QWORD = REG_QWORD_LITTLE_ENDIAN
1191)
1192
1193type AddrinfoW struct {
1194	Flags     int32
1195	Family    int32
1196	Socktype  int32
1197	Protocol  int32
1198	Addrlen   uintptr
1199	Canonname *uint16
1200	Addr      uintptr
1201	Next      *AddrinfoW
1202}
1203
1204const (
1205	AI_PASSIVE     = 1
1206	AI_CANONNAME   = 2
1207	AI_NUMERICHOST = 4
1208)
1209
1210type GUID struct {
1211	Data1 uint32
1212	Data2 uint16
1213	Data3 uint16
1214	Data4 [8]byte
1215}
1216
1217var WSAID_CONNECTEX = GUID{
1218	0x25a207b9,
1219	0xddf3,
1220	0x4660,
1221	[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
1222}
1223
1224var WSAID_WSASENDMSG = GUID{
1225	0xa441e712,
1226	0x754f,
1227	0x43ca,
1228	[8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},
1229}
1230
1231var WSAID_WSARECVMSG = GUID{
1232	0xf689d7c8,
1233	0x6f1f,
1234	0x436b,
1235	[8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},
1236}
1237
1238const (
1239	FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
1240	FILE_SKIP_SET_EVENT_ON_HANDLE        = 2
1241)
1242
1243const (
1244	WSAPROTOCOL_LEN    = 255
1245	MAX_PROTOCOL_CHAIN = 7
1246	BASE_PROTOCOL      = 1
1247	LAYERED_PROTOCOL   = 0
1248
1249	XP1_CONNECTIONLESS           = 0x00000001
1250	XP1_GUARANTEED_DELIVERY      = 0x00000002
1251	XP1_GUARANTEED_ORDER         = 0x00000004
1252	XP1_MESSAGE_ORIENTED         = 0x00000008
1253	XP1_PSEUDO_STREAM            = 0x00000010
1254	XP1_GRACEFUL_CLOSE           = 0x00000020
1255	XP1_EXPEDITED_DATA           = 0x00000040
1256	XP1_CONNECT_DATA             = 0x00000080
1257	XP1_DISCONNECT_DATA          = 0x00000100
1258	XP1_SUPPORT_BROADCAST        = 0x00000200
1259	XP1_SUPPORT_MULTIPOINT       = 0x00000400
1260	XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800
1261	XP1_MULTIPOINT_DATA_PLANE    = 0x00001000
1262	XP1_QOS_SUPPORTED            = 0x00002000
1263	XP1_UNI_SEND                 = 0x00008000
1264	XP1_UNI_RECV                 = 0x00010000
1265	XP1_IFS_HANDLES              = 0x00020000
1266	XP1_PARTIAL_MESSAGE          = 0x00040000
1267	XP1_SAN_SUPPORT_SDP          = 0x00080000
1268
1269	PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001
1270	PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002
1271	PFL_HIDDEN                  = 0x00000004
1272	PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008
1273	PFL_NETWORKDIRECT_PROVIDER  = 0x00000010
1274)
1275
1276type WSAProtocolInfo struct {
1277	ServiceFlags1     uint32
1278	ServiceFlags2     uint32
1279	ServiceFlags3     uint32
1280	ServiceFlags4     uint32
1281	ProviderFlags     uint32
1282	ProviderId        GUID
1283	CatalogEntryId    uint32
1284	ProtocolChain     WSAProtocolChain
1285	Version           int32
1286	AddressFamily     int32
1287	MaxSockAddr       int32
1288	MinSockAddr       int32
1289	SocketType        int32
1290	Protocol          int32
1291	ProtocolMaxOffset int32
1292	NetworkByteOrder  int32
1293	SecurityScheme    int32
1294	MessageSize       uint32
1295	ProviderReserved  uint32
1296	ProtocolName      [WSAPROTOCOL_LEN + 1]uint16
1297}
1298
1299type WSAProtocolChain struct {
1300	ChainLen     int32
1301	ChainEntries [MAX_PROTOCOL_CHAIN]uint32
1302}
1303
1304type TCPKeepalive struct {
1305	OnOff    uint32
1306	Time     uint32
1307	Interval uint32
1308}
1309
1310type symbolicLinkReparseBuffer struct {
1311	SubstituteNameOffset uint16
1312	SubstituteNameLength uint16
1313	PrintNameOffset      uint16
1314	PrintNameLength      uint16
1315	Flags                uint32
1316	PathBuffer           [1]uint16
1317}
1318
1319type mountPointReparseBuffer struct {
1320	SubstituteNameOffset uint16
1321	SubstituteNameLength uint16
1322	PrintNameOffset      uint16
1323	PrintNameLength      uint16
1324	PathBuffer           [1]uint16
1325}
1326
1327type reparseDataBuffer struct {
1328	ReparseTag        uint32
1329	ReparseDataLength uint16
1330	Reserved          uint16
1331
1332	// GenericReparseBuffer
1333	reparseBuffer byte
1334}
1335
1336const (
1337	FSCTL_GET_REPARSE_POINT          = 0x900A8
1338	MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024
1339	IO_REPARSE_TAG_MOUNT_POINT       = 0xA0000003
1340	IO_REPARSE_TAG_SYMLINK           = 0xA000000C
1341	SYMBOLIC_LINK_FLAG_DIRECTORY     = 0x1
1342)
1343
1344const (
1345	ComputerNameNetBIOS                   = 0
1346	ComputerNameDnsHostname               = 1
1347	ComputerNameDnsDomain                 = 2
1348	ComputerNameDnsFullyQualified         = 3
1349	ComputerNamePhysicalNetBIOS           = 4
1350	ComputerNamePhysicalDnsHostname       = 5
1351	ComputerNamePhysicalDnsDomain         = 6
1352	ComputerNamePhysicalDnsFullyQualified = 7
1353	ComputerNameMax                       = 8
1354)
1355
1356// For MessageBox()
1357const (
1358	MB_OK                   = 0x00000000
1359	MB_OKCANCEL             = 0x00000001
1360	MB_ABORTRETRYIGNORE     = 0x00000002
1361	MB_YESNOCANCEL          = 0x00000003
1362	MB_YESNO                = 0x00000004
1363	MB_RETRYCANCEL          = 0x00000005
1364	MB_CANCELTRYCONTINUE    = 0x00000006
1365	MB_ICONHAND             = 0x00000010
1366	MB_ICONQUESTION         = 0x00000020
1367	MB_ICONEXCLAMATION      = 0x00000030
1368	MB_ICONASTERISK         = 0x00000040
1369	MB_USERICON             = 0x00000080
1370	MB_ICONWARNING          = MB_ICONEXCLAMATION
1371	MB_ICONERROR            = MB_ICONHAND
1372	MB_ICONINFORMATION      = MB_ICONASTERISK
1373	MB_ICONSTOP             = MB_ICONHAND
1374	MB_DEFBUTTON1           = 0x00000000
1375	MB_DEFBUTTON2           = 0x00000100
1376	MB_DEFBUTTON3           = 0x00000200
1377	MB_DEFBUTTON4           = 0x00000300
1378	MB_APPLMODAL            = 0x00000000
1379	MB_SYSTEMMODAL          = 0x00001000
1380	MB_TASKMODAL            = 0x00002000
1381	MB_HELP                 = 0x00004000
1382	MB_NOFOCUS              = 0x00008000
1383	MB_SETFOREGROUND        = 0x00010000
1384	MB_DEFAULT_DESKTOP_ONLY = 0x00020000
1385	MB_TOPMOST              = 0x00040000
1386	MB_RIGHT                = 0x00080000
1387	MB_RTLREADING           = 0x00100000
1388	MB_SERVICE_NOTIFICATION = 0x00200000
1389)
1390
1391const (
1392	MOVEFILE_REPLACE_EXISTING      = 0x1
1393	MOVEFILE_COPY_ALLOWED          = 0x2
1394	MOVEFILE_DELAY_UNTIL_REBOOT    = 0x4
1395	MOVEFILE_WRITE_THROUGH         = 0x8
1396	MOVEFILE_CREATE_HARDLINK       = 0x10
1397	MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
1398)
1399
1400const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
1401
1402const (
1403	IF_TYPE_OTHER              = 1
1404	IF_TYPE_ETHERNET_CSMACD    = 6
1405	IF_TYPE_ISO88025_TOKENRING = 9
1406	IF_TYPE_PPP                = 23
1407	IF_TYPE_SOFTWARE_LOOPBACK  = 24
1408	IF_TYPE_ATM                = 37
1409	IF_TYPE_IEEE80211          = 71
1410	IF_TYPE_TUNNEL             = 131
1411	IF_TYPE_IEEE1394           = 144
1412)
1413
1414type SocketAddress struct {
1415	Sockaddr       *syscall.RawSockaddrAny
1416	SockaddrLength int32
1417}
1418
1419// IP returns an IPv4 or IPv6 address, or nil if the underlying SocketAddress is neither.
1420func (addr *SocketAddress) IP() net.IP {
1421	if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet4{}) && addr.Sockaddr.Addr.Family == AF_INET {
1422		return (*RawSockaddrInet4)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
1423	} else if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet6{}) && addr.Sockaddr.Addr.Family == AF_INET6 {
1424		return (*RawSockaddrInet6)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
1425	}
1426	return nil
1427}
1428
1429type IpAdapterUnicastAddress struct {
1430	Length             uint32
1431	Flags              uint32
1432	Next               *IpAdapterUnicastAddress
1433	Address            SocketAddress
1434	PrefixOrigin       int32
1435	SuffixOrigin       int32
1436	DadState           int32
1437	ValidLifetime      uint32
1438	PreferredLifetime  uint32
1439	LeaseLifetime      uint32
1440	OnLinkPrefixLength uint8
1441}
1442
1443type IpAdapterAnycastAddress struct {
1444	Length  uint32
1445	Flags   uint32
1446	Next    *IpAdapterAnycastAddress
1447	Address SocketAddress
1448}
1449
1450type IpAdapterMulticastAddress struct {
1451	Length  uint32
1452	Flags   uint32
1453	Next    *IpAdapterMulticastAddress
1454	Address SocketAddress
1455}
1456
1457type IpAdapterDnsServerAdapter struct {
1458	Length   uint32
1459	Reserved uint32
1460	Next     *IpAdapterDnsServerAdapter
1461	Address  SocketAddress
1462}
1463
1464type IpAdapterPrefix struct {
1465	Length       uint32
1466	Flags        uint32
1467	Next         *IpAdapterPrefix
1468	Address      SocketAddress
1469	PrefixLength uint32
1470}
1471
1472type IpAdapterAddresses struct {
1473	Length                uint32
1474	IfIndex               uint32
1475	Next                  *IpAdapterAddresses
1476	AdapterName           *byte
1477	FirstUnicastAddress   *IpAdapterUnicastAddress
1478	FirstAnycastAddress   *IpAdapterAnycastAddress
1479	FirstMulticastAddress *IpAdapterMulticastAddress
1480	FirstDnsServerAddress *IpAdapterDnsServerAdapter
1481	DnsSuffix             *uint16
1482	Description           *uint16
1483	FriendlyName          *uint16
1484	PhysicalAddress       [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
1485	PhysicalAddressLength uint32
1486	Flags                 uint32
1487	Mtu                   uint32
1488	IfType                uint32
1489	OperStatus            uint32
1490	Ipv6IfIndex           uint32
1491	ZoneIndices           [16]uint32
1492	FirstPrefix           *IpAdapterPrefix
1493	/* more fields might be present here. */
1494}
1495
1496const (
1497	IfOperStatusUp             = 1
1498	IfOperStatusDown           = 2
1499	IfOperStatusTesting        = 3
1500	IfOperStatusUnknown        = 4
1501	IfOperStatusDormant        = 5
1502	IfOperStatusNotPresent     = 6
1503	IfOperStatusLowerLayerDown = 7
1504)
1505
1506// Console related constants used for the mode parameter to SetConsoleMode. See
1507// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
1508
1509const (
1510	ENABLE_PROCESSED_INPUT        = 0x1
1511	ENABLE_LINE_INPUT             = 0x2
1512	ENABLE_ECHO_INPUT             = 0x4
1513	ENABLE_WINDOW_INPUT           = 0x8
1514	ENABLE_MOUSE_INPUT            = 0x10
1515	ENABLE_INSERT_MODE            = 0x20
1516	ENABLE_QUICK_EDIT_MODE        = 0x40
1517	ENABLE_EXTENDED_FLAGS         = 0x80
1518	ENABLE_AUTO_POSITION          = 0x100
1519	ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200
1520
1521	ENABLE_PROCESSED_OUTPUT            = 0x1
1522	ENABLE_WRAP_AT_EOL_OUTPUT          = 0x2
1523	ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
1524	DISABLE_NEWLINE_AUTO_RETURN        = 0x8
1525	ENABLE_LVB_GRID_WORLDWIDE          = 0x10
1526)
1527
1528type Coord struct {
1529	X int16
1530	Y int16
1531}
1532
1533type SmallRect struct {
1534	Left   int16
1535	Top    int16
1536	Right  int16
1537	Bottom int16
1538}
1539
1540// Used with GetConsoleScreenBuffer to retrieve information about a console
1541// screen buffer. See
1542// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str
1543// for details.
1544
1545type ConsoleScreenBufferInfo struct {
1546	Size              Coord
1547	CursorPosition    Coord
1548	Attributes        uint16
1549	Window            SmallRect
1550	MaximumWindowSize Coord
1551}
1552
1553const UNIX_PATH_MAX = 108 // defined in afunix.h
1554
1555const (
1556	// flags for JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags
1557	JOB_OBJECT_LIMIT_ACTIVE_PROCESS             = 0x00000008
1558	JOB_OBJECT_LIMIT_AFFINITY                   = 0x00000010
1559	JOB_OBJECT_LIMIT_BREAKAWAY_OK               = 0x00000800
1560	JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400
1561	JOB_OBJECT_LIMIT_JOB_MEMORY                 = 0x00000200
1562	JOB_OBJECT_LIMIT_JOB_TIME                   = 0x00000004
1563	JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE          = 0x00002000
1564	JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME          = 0x00000040
1565	JOB_OBJECT_LIMIT_PRIORITY_CLASS             = 0x00000020
1566	JOB_OBJECT_LIMIT_PROCESS_MEMORY             = 0x00000100
1567	JOB_OBJECT_LIMIT_PROCESS_TIME               = 0x00000002
1568	JOB_OBJECT_LIMIT_SCHEDULING_CLASS           = 0x00000080
1569	JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK        = 0x00001000
1570	JOB_OBJECT_LIMIT_SUBSET_AFFINITY            = 0x00004000
1571	JOB_OBJECT_LIMIT_WORKINGSET                 = 0x00000001
1572)
1573
1574type JOBOBJECT_BASIC_LIMIT_INFORMATION struct {
1575	PerProcessUserTimeLimit int64
1576	PerJobUserTimeLimit     int64
1577	LimitFlags              uint32
1578	MinimumWorkingSetSize   uintptr
1579	MaximumWorkingSetSize   uintptr
1580	ActiveProcessLimit      uint32
1581	Affinity                uintptr
1582	PriorityClass           uint32
1583	SchedulingClass         uint32
1584}
1585
1586type IO_COUNTERS struct {
1587	ReadOperationCount  uint64
1588	WriteOperationCount uint64
1589	OtherOperationCount uint64
1590	ReadTransferCount   uint64
1591	WriteTransferCount  uint64
1592	OtherTransferCount  uint64
1593}
1594
1595type JOBOBJECT_EXTENDED_LIMIT_INFORMATION struct {
1596	BasicLimitInformation JOBOBJECT_BASIC_LIMIT_INFORMATION
1597	IoInfo                IO_COUNTERS
1598	ProcessMemoryLimit    uintptr
1599	JobMemoryLimit        uintptr
1600	PeakProcessMemoryUsed uintptr
1601	PeakJobMemoryUsed     uintptr
1602}
1603
1604const (
1605	// UIRestrictionsClass
1606	JOB_OBJECT_UILIMIT_DESKTOP          = 0x00000040
1607	JOB_OBJECT_UILIMIT_DISPLAYSETTINGS  = 0x00000010
1608	JOB_OBJECT_UILIMIT_EXITWINDOWS      = 0x00000080
1609	JOB_OBJECT_UILIMIT_GLOBALATOMS      = 0x00000020
1610	JOB_OBJECT_UILIMIT_HANDLES          = 0x00000001
1611	JOB_OBJECT_UILIMIT_READCLIPBOARD    = 0x00000002
1612	JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x00000008
1613	JOB_OBJECT_UILIMIT_WRITECLIPBOARD   = 0x00000004
1614)
1615
1616type JOBOBJECT_BASIC_UI_RESTRICTIONS struct {
1617	UIRestrictionsClass uint32
1618}
1619
1620const (
1621	// JobObjectInformationClass
1622	JobObjectAssociateCompletionPortInformation = 7
1623	JobObjectBasicLimitInformation              = 2
1624	JobObjectBasicUIRestrictions                = 4
1625	JobObjectCpuRateControlInformation          = 15
1626	JobObjectEndOfJobTimeInformation            = 6
1627	JobObjectExtendedLimitInformation           = 9
1628	JobObjectGroupInformation                   = 11
1629	JobObjectGroupInformationEx                 = 14
1630	JobObjectLimitViolationInformation2         = 35
1631	JobObjectNetRateControlInformation          = 32
1632	JobObjectNotificationLimitInformation       = 12
1633	JobObjectNotificationLimitInformation2      = 34
1634	JobObjectSecurityLimitInformation           = 5
1635)
1636
1637const (
1638	KF_FLAG_DEFAULT                          = 0x00000000
1639	KF_FLAG_FORCE_APP_DATA_REDIRECTION       = 0x00080000
1640	KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET = 0x00040000
1641	KF_FLAG_FORCE_PACKAGE_REDIRECTION        = 0x00020000
1642	KF_FLAG_NO_PACKAGE_REDIRECTION           = 0x00010000
1643	KF_FLAG_FORCE_APPCONTAINER_REDIRECTION   = 0x00020000
1644	KF_FLAG_NO_APPCONTAINER_REDIRECTION      = 0x00010000
1645	KF_FLAG_CREATE                           = 0x00008000
1646	KF_FLAG_DONT_VERIFY                      = 0x00004000
1647	KF_FLAG_DONT_UNEXPAND                    = 0x00002000
1648	KF_FLAG_NO_ALIAS                         = 0x00001000
1649	KF_FLAG_INIT                             = 0x00000800
1650	KF_FLAG_DEFAULT_PATH                     = 0x00000400
1651	KF_FLAG_NOT_PARENT_RELATIVE              = 0x00000200
1652	KF_FLAG_SIMPLE_IDLIST                    = 0x00000100
1653	KF_FLAG_ALIAS_ONLY                       = 0x80000000
1654)
1655
1656type OsVersionInfoEx struct {
1657	osVersionInfoSize uint32
1658	MajorVersion      uint32
1659	MinorVersion      uint32
1660	BuildNumber       uint32
1661	PlatformId        uint32
1662	CsdVersion        [128]uint16
1663	ServicePackMajor  uint16
1664	ServicePackMinor  uint16
1665	SuiteMask         uint16
1666	ProductType       byte
1667	_                 byte
1668}
1669