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
1193const (
1194	EVENT_MODIFY_STATE = 0x0002
1195	EVENT_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3
1196
1197	MUTANT_QUERY_STATE = 0x0001
1198	MUTANT_ALL_ACCESS  = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MUTANT_QUERY_STATE
1199
1200	SEMAPHORE_MODIFY_STATE = 0x0002
1201	SEMAPHORE_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3
1202
1203	TIMER_QUERY_STATE  = 0x0001
1204	TIMER_MODIFY_STATE = 0x0002
1205	TIMER_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | TIMER_QUERY_STATE | TIMER_MODIFY_STATE
1206
1207	MUTEX_MODIFY_STATE = MUTANT_QUERY_STATE
1208	MUTEX_ALL_ACCESS   = MUTANT_ALL_ACCESS
1209
1210	CREATE_EVENT_MANUAL_RESET  = 0x1
1211	CREATE_EVENT_INITIAL_SET   = 0x2
1212	CREATE_MUTEX_INITIAL_OWNER = 0x1
1213)
1214
1215type AddrinfoW struct {
1216	Flags     int32
1217	Family    int32
1218	Socktype  int32
1219	Protocol  int32
1220	Addrlen   uintptr
1221	Canonname *uint16
1222	Addr      uintptr
1223	Next      *AddrinfoW
1224}
1225
1226const (
1227	AI_PASSIVE     = 1
1228	AI_CANONNAME   = 2
1229	AI_NUMERICHOST = 4
1230)
1231
1232type GUID struct {
1233	Data1 uint32
1234	Data2 uint16
1235	Data3 uint16
1236	Data4 [8]byte
1237}
1238
1239var WSAID_CONNECTEX = GUID{
1240	0x25a207b9,
1241	0xddf3,
1242	0x4660,
1243	[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
1244}
1245
1246var WSAID_WSASENDMSG = GUID{
1247	0xa441e712,
1248	0x754f,
1249	0x43ca,
1250	[8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},
1251}
1252
1253var WSAID_WSARECVMSG = GUID{
1254	0xf689d7c8,
1255	0x6f1f,
1256	0x436b,
1257	[8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},
1258}
1259
1260const (
1261	FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
1262	FILE_SKIP_SET_EVENT_ON_HANDLE        = 2
1263)
1264
1265const (
1266	WSAPROTOCOL_LEN    = 255
1267	MAX_PROTOCOL_CHAIN = 7
1268	BASE_PROTOCOL      = 1
1269	LAYERED_PROTOCOL   = 0
1270
1271	XP1_CONNECTIONLESS           = 0x00000001
1272	XP1_GUARANTEED_DELIVERY      = 0x00000002
1273	XP1_GUARANTEED_ORDER         = 0x00000004
1274	XP1_MESSAGE_ORIENTED         = 0x00000008
1275	XP1_PSEUDO_STREAM            = 0x00000010
1276	XP1_GRACEFUL_CLOSE           = 0x00000020
1277	XP1_EXPEDITED_DATA           = 0x00000040
1278	XP1_CONNECT_DATA             = 0x00000080
1279	XP1_DISCONNECT_DATA          = 0x00000100
1280	XP1_SUPPORT_BROADCAST        = 0x00000200
1281	XP1_SUPPORT_MULTIPOINT       = 0x00000400
1282	XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800
1283	XP1_MULTIPOINT_DATA_PLANE    = 0x00001000
1284	XP1_QOS_SUPPORTED            = 0x00002000
1285	XP1_UNI_SEND                 = 0x00008000
1286	XP1_UNI_RECV                 = 0x00010000
1287	XP1_IFS_HANDLES              = 0x00020000
1288	XP1_PARTIAL_MESSAGE          = 0x00040000
1289	XP1_SAN_SUPPORT_SDP          = 0x00080000
1290
1291	PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001
1292	PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002
1293	PFL_HIDDEN                  = 0x00000004
1294	PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008
1295	PFL_NETWORKDIRECT_PROVIDER  = 0x00000010
1296)
1297
1298type WSAProtocolInfo struct {
1299	ServiceFlags1     uint32
1300	ServiceFlags2     uint32
1301	ServiceFlags3     uint32
1302	ServiceFlags4     uint32
1303	ProviderFlags     uint32
1304	ProviderId        GUID
1305	CatalogEntryId    uint32
1306	ProtocolChain     WSAProtocolChain
1307	Version           int32
1308	AddressFamily     int32
1309	MaxSockAddr       int32
1310	MinSockAddr       int32
1311	SocketType        int32
1312	Protocol          int32
1313	ProtocolMaxOffset int32
1314	NetworkByteOrder  int32
1315	SecurityScheme    int32
1316	MessageSize       uint32
1317	ProviderReserved  uint32
1318	ProtocolName      [WSAPROTOCOL_LEN + 1]uint16
1319}
1320
1321type WSAProtocolChain struct {
1322	ChainLen     int32
1323	ChainEntries [MAX_PROTOCOL_CHAIN]uint32
1324}
1325
1326type TCPKeepalive struct {
1327	OnOff    uint32
1328	Time     uint32
1329	Interval uint32
1330}
1331
1332type symbolicLinkReparseBuffer struct {
1333	SubstituteNameOffset uint16
1334	SubstituteNameLength uint16
1335	PrintNameOffset      uint16
1336	PrintNameLength      uint16
1337	Flags                uint32
1338	PathBuffer           [1]uint16
1339}
1340
1341type mountPointReparseBuffer struct {
1342	SubstituteNameOffset uint16
1343	SubstituteNameLength uint16
1344	PrintNameOffset      uint16
1345	PrintNameLength      uint16
1346	PathBuffer           [1]uint16
1347}
1348
1349type reparseDataBuffer struct {
1350	ReparseTag        uint32
1351	ReparseDataLength uint16
1352	Reserved          uint16
1353
1354	// GenericReparseBuffer
1355	reparseBuffer byte
1356}
1357
1358const (
1359	FSCTL_GET_REPARSE_POINT          = 0x900A8
1360	MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024
1361	IO_REPARSE_TAG_MOUNT_POINT       = 0xA0000003
1362	IO_REPARSE_TAG_SYMLINK           = 0xA000000C
1363	SYMBOLIC_LINK_FLAG_DIRECTORY     = 0x1
1364)
1365
1366const (
1367	ComputerNameNetBIOS                   = 0
1368	ComputerNameDnsHostname               = 1
1369	ComputerNameDnsDomain                 = 2
1370	ComputerNameDnsFullyQualified         = 3
1371	ComputerNamePhysicalNetBIOS           = 4
1372	ComputerNamePhysicalDnsHostname       = 5
1373	ComputerNamePhysicalDnsDomain         = 6
1374	ComputerNamePhysicalDnsFullyQualified = 7
1375	ComputerNameMax                       = 8
1376)
1377
1378// For MessageBox()
1379const (
1380	MB_OK                   = 0x00000000
1381	MB_OKCANCEL             = 0x00000001
1382	MB_ABORTRETRYIGNORE     = 0x00000002
1383	MB_YESNOCANCEL          = 0x00000003
1384	MB_YESNO                = 0x00000004
1385	MB_RETRYCANCEL          = 0x00000005
1386	MB_CANCELTRYCONTINUE    = 0x00000006
1387	MB_ICONHAND             = 0x00000010
1388	MB_ICONQUESTION         = 0x00000020
1389	MB_ICONEXCLAMATION      = 0x00000030
1390	MB_ICONASTERISK         = 0x00000040
1391	MB_USERICON             = 0x00000080
1392	MB_ICONWARNING          = MB_ICONEXCLAMATION
1393	MB_ICONERROR            = MB_ICONHAND
1394	MB_ICONINFORMATION      = MB_ICONASTERISK
1395	MB_ICONSTOP             = MB_ICONHAND
1396	MB_DEFBUTTON1           = 0x00000000
1397	MB_DEFBUTTON2           = 0x00000100
1398	MB_DEFBUTTON3           = 0x00000200
1399	MB_DEFBUTTON4           = 0x00000300
1400	MB_APPLMODAL            = 0x00000000
1401	MB_SYSTEMMODAL          = 0x00001000
1402	MB_TASKMODAL            = 0x00002000
1403	MB_HELP                 = 0x00004000
1404	MB_NOFOCUS              = 0x00008000
1405	MB_SETFOREGROUND        = 0x00010000
1406	MB_DEFAULT_DESKTOP_ONLY = 0x00020000
1407	MB_TOPMOST              = 0x00040000
1408	MB_RIGHT                = 0x00080000
1409	MB_RTLREADING           = 0x00100000
1410	MB_SERVICE_NOTIFICATION = 0x00200000
1411)
1412
1413const (
1414	MOVEFILE_REPLACE_EXISTING      = 0x1
1415	MOVEFILE_COPY_ALLOWED          = 0x2
1416	MOVEFILE_DELAY_UNTIL_REBOOT    = 0x4
1417	MOVEFILE_WRITE_THROUGH         = 0x8
1418	MOVEFILE_CREATE_HARDLINK       = 0x10
1419	MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
1420)
1421
1422const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
1423
1424const (
1425	IF_TYPE_OTHER              = 1
1426	IF_TYPE_ETHERNET_CSMACD    = 6
1427	IF_TYPE_ISO88025_TOKENRING = 9
1428	IF_TYPE_PPP                = 23
1429	IF_TYPE_SOFTWARE_LOOPBACK  = 24
1430	IF_TYPE_ATM                = 37
1431	IF_TYPE_IEEE80211          = 71
1432	IF_TYPE_TUNNEL             = 131
1433	IF_TYPE_IEEE1394           = 144
1434)
1435
1436type SocketAddress struct {
1437	Sockaddr       *syscall.RawSockaddrAny
1438	SockaddrLength int32
1439}
1440
1441// IP returns an IPv4 or IPv6 address, or nil if the underlying SocketAddress is neither.
1442func (addr *SocketAddress) IP() net.IP {
1443	if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet4{}) && addr.Sockaddr.Addr.Family == AF_INET {
1444		return (*RawSockaddrInet4)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
1445	} else if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet6{}) && addr.Sockaddr.Addr.Family == AF_INET6 {
1446		return (*RawSockaddrInet6)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
1447	}
1448	return nil
1449}
1450
1451type IpAdapterUnicastAddress struct {
1452	Length             uint32
1453	Flags              uint32
1454	Next               *IpAdapterUnicastAddress
1455	Address            SocketAddress
1456	PrefixOrigin       int32
1457	SuffixOrigin       int32
1458	DadState           int32
1459	ValidLifetime      uint32
1460	PreferredLifetime  uint32
1461	LeaseLifetime      uint32
1462	OnLinkPrefixLength uint8
1463}
1464
1465type IpAdapterAnycastAddress struct {
1466	Length  uint32
1467	Flags   uint32
1468	Next    *IpAdapterAnycastAddress
1469	Address SocketAddress
1470}
1471
1472type IpAdapterMulticastAddress struct {
1473	Length  uint32
1474	Flags   uint32
1475	Next    *IpAdapterMulticastAddress
1476	Address SocketAddress
1477}
1478
1479type IpAdapterDnsServerAdapter struct {
1480	Length   uint32
1481	Reserved uint32
1482	Next     *IpAdapterDnsServerAdapter
1483	Address  SocketAddress
1484}
1485
1486type IpAdapterPrefix struct {
1487	Length       uint32
1488	Flags        uint32
1489	Next         *IpAdapterPrefix
1490	Address      SocketAddress
1491	PrefixLength uint32
1492}
1493
1494type IpAdapterAddresses struct {
1495	Length                uint32
1496	IfIndex               uint32
1497	Next                  *IpAdapterAddresses
1498	AdapterName           *byte
1499	FirstUnicastAddress   *IpAdapterUnicastAddress
1500	FirstAnycastAddress   *IpAdapterAnycastAddress
1501	FirstMulticastAddress *IpAdapterMulticastAddress
1502	FirstDnsServerAddress *IpAdapterDnsServerAdapter
1503	DnsSuffix             *uint16
1504	Description           *uint16
1505	FriendlyName          *uint16
1506	PhysicalAddress       [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
1507	PhysicalAddressLength uint32
1508	Flags                 uint32
1509	Mtu                   uint32
1510	IfType                uint32
1511	OperStatus            uint32
1512	Ipv6IfIndex           uint32
1513	ZoneIndices           [16]uint32
1514	FirstPrefix           *IpAdapterPrefix
1515	/* more fields might be present here. */
1516}
1517
1518const (
1519	IfOperStatusUp             = 1
1520	IfOperStatusDown           = 2
1521	IfOperStatusTesting        = 3
1522	IfOperStatusUnknown        = 4
1523	IfOperStatusDormant        = 5
1524	IfOperStatusNotPresent     = 6
1525	IfOperStatusLowerLayerDown = 7
1526)
1527
1528// Console related constants used for the mode parameter to SetConsoleMode. See
1529// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
1530
1531const (
1532	ENABLE_PROCESSED_INPUT        = 0x1
1533	ENABLE_LINE_INPUT             = 0x2
1534	ENABLE_ECHO_INPUT             = 0x4
1535	ENABLE_WINDOW_INPUT           = 0x8
1536	ENABLE_MOUSE_INPUT            = 0x10
1537	ENABLE_INSERT_MODE            = 0x20
1538	ENABLE_QUICK_EDIT_MODE        = 0x40
1539	ENABLE_EXTENDED_FLAGS         = 0x80
1540	ENABLE_AUTO_POSITION          = 0x100
1541	ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200
1542
1543	ENABLE_PROCESSED_OUTPUT            = 0x1
1544	ENABLE_WRAP_AT_EOL_OUTPUT          = 0x2
1545	ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
1546	DISABLE_NEWLINE_AUTO_RETURN        = 0x8
1547	ENABLE_LVB_GRID_WORLDWIDE          = 0x10
1548)
1549
1550type Coord struct {
1551	X int16
1552	Y int16
1553}
1554
1555type SmallRect struct {
1556	Left   int16
1557	Top    int16
1558	Right  int16
1559	Bottom int16
1560}
1561
1562// Used with GetConsoleScreenBuffer to retrieve information about a console
1563// screen buffer. See
1564// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str
1565// for details.
1566
1567type ConsoleScreenBufferInfo struct {
1568	Size              Coord
1569	CursorPosition    Coord
1570	Attributes        uint16
1571	Window            SmallRect
1572	MaximumWindowSize Coord
1573}
1574
1575const UNIX_PATH_MAX = 108 // defined in afunix.h
1576
1577const (
1578	// flags for JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags
1579	JOB_OBJECT_LIMIT_ACTIVE_PROCESS             = 0x00000008
1580	JOB_OBJECT_LIMIT_AFFINITY                   = 0x00000010
1581	JOB_OBJECT_LIMIT_BREAKAWAY_OK               = 0x00000800
1582	JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400
1583	JOB_OBJECT_LIMIT_JOB_MEMORY                 = 0x00000200
1584	JOB_OBJECT_LIMIT_JOB_TIME                   = 0x00000004
1585	JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE          = 0x00002000
1586	JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME          = 0x00000040
1587	JOB_OBJECT_LIMIT_PRIORITY_CLASS             = 0x00000020
1588	JOB_OBJECT_LIMIT_PROCESS_MEMORY             = 0x00000100
1589	JOB_OBJECT_LIMIT_PROCESS_TIME               = 0x00000002
1590	JOB_OBJECT_LIMIT_SCHEDULING_CLASS           = 0x00000080
1591	JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK        = 0x00001000
1592	JOB_OBJECT_LIMIT_SUBSET_AFFINITY            = 0x00004000
1593	JOB_OBJECT_LIMIT_WORKINGSET                 = 0x00000001
1594)
1595
1596type JOBOBJECT_BASIC_LIMIT_INFORMATION struct {
1597	PerProcessUserTimeLimit int64
1598	PerJobUserTimeLimit     int64
1599	LimitFlags              uint32
1600	MinimumWorkingSetSize   uintptr
1601	MaximumWorkingSetSize   uintptr
1602	ActiveProcessLimit      uint32
1603	Affinity                uintptr
1604	PriorityClass           uint32
1605	SchedulingClass         uint32
1606}
1607
1608type IO_COUNTERS struct {
1609	ReadOperationCount  uint64
1610	WriteOperationCount uint64
1611	OtherOperationCount uint64
1612	ReadTransferCount   uint64
1613	WriteTransferCount  uint64
1614	OtherTransferCount  uint64
1615}
1616
1617type JOBOBJECT_EXTENDED_LIMIT_INFORMATION struct {
1618	BasicLimitInformation JOBOBJECT_BASIC_LIMIT_INFORMATION
1619	IoInfo                IO_COUNTERS
1620	ProcessMemoryLimit    uintptr
1621	JobMemoryLimit        uintptr
1622	PeakProcessMemoryUsed uintptr
1623	PeakJobMemoryUsed     uintptr
1624}
1625
1626const (
1627	// UIRestrictionsClass
1628	JOB_OBJECT_UILIMIT_DESKTOP          = 0x00000040
1629	JOB_OBJECT_UILIMIT_DISPLAYSETTINGS  = 0x00000010
1630	JOB_OBJECT_UILIMIT_EXITWINDOWS      = 0x00000080
1631	JOB_OBJECT_UILIMIT_GLOBALATOMS      = 0x00000020
1632	JOB_OBJECT_UILIMIT_HANDLES          = 0x00000001
1633	JOB_OBJECT_UILIMIT_READCLIPBOARD    = 0x00000002
1634	JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x00000008
1635	JOB_OBJECT_UILIMIT_WRITECLIPBOARD   = 0x00000004
1636)
1637
1638type JOBOBJECT_BASIC_UI_RESTRICTIONS struct {
1639	UIRestrictionsClass uint32
1640}
1641
1642const (
1643	// JobObjectInformationClass
1644	JobObjectAssociateCompletionPortInformation = 7
1645	JobObjectBasicLimitInformation              = 2
1646	JobObjectBasicUIRestrictions                = 4
1647	JobObjectCpuRateControlInformation          = 15
1648	JobObjectEndOfJobTimeInformation            = 6
1649	JobObjectExtendedLimitInformation           = 9
1650	JobObjectGroupInformation                   = 11
1651	JobObjectGroupInformationEx                 = 14
1652	JobObjectLimitViolationInformation2         = 35
1653	JobObjectNetRateControlInformation          = 32
1654	JobObjectNotificationLimitInformation       = 12
1655	JobObjectNotificationLimitInformation2      = 34
1656	JobObjectSecurityLimitInformation           = 5
1657)
1658
1659const (
1660	KF_FLAG_DEFAULT                          = 0x00000000
1661	KF_FLAG_FORCE_APP_DATA_REDIRECTION       = 0x00080000
1662	KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET = 0x00040000
1663	KF_FLAG_FORCE_PACKAGE_REDIRECTION        = 0x00020000
1664	KF_FLAG_NO_PACKAGE_REDIRECTION           = 0x00010000
1665	KF_FLAG_FORCE_APPCONTAINER_REDIRECTION   = 0x00020000
1666	KF_FLAG_NO_APPCONTAINER_REDIRECTION      = 0x00010000
1667	KF_FLAG_CREATE                           = 0x00008000
1668	KF_FLAG_DONT_VERIFY                      = 0x00004000
1669	KF_FLAG_DONT_UNEXPAND                    = 0x00002000
1670	KF_FLAG_NO_ALIAS                         = 0x00001000
1671	KF_FLAG_INIT                             = 0x00000800
1672	KF_FLAG_DEFAULT_PATH                     = 0x00000400
1673	KF_FLAG_NOT_PARENT_RELATIVE              = 0x00000200
1674	KF_FLAG_SIMPLE_IDLIST                    = 0x00000100
1675	KF_FLAG_ALIAS_ONLY                       = 0x80000000
1676)
1677
1678type OsVersionInfoEx struct {
1679	osVersionInfoSize uint32
1680	MajorVersion      uint32
1681	MinorVersion      uint32
1682	BuildNumber       uint32
1683	PlatformId        uint32
1684	CsdVersion        [128]uint16
1685	ServicePackMajor  uint16
1686	ServicePackMinor  uint16
1687	SuiteMask         uint16
1688	ProductType       byte
1689	_                 byte
1690}
1691
1692const (
1693	EWX_LOGOFF          = 0x00000000
1694	EWX_SHUTDOWN        = 0x00000001
1695	EWX_REBOOT          = 0x00000002
1696	EWX_FORCE           = 0x00000004
1697	EWX_POWEROFF        = 0x00000008
1698	EWX_FORCEIFHUNG     = 0x00000010
1699	EWX_QUICKRESOLVE    = 0x00000020
1700	EWX_RESTARTAPPS     = 0x00000040
1701	EWX_HYBRID_SHUTDOWN = 0x00400000
1702	EWX_BOOTOPTIONS     = 0x01000000
1703
1704	SHTDN_REASON_FLAG_COMMENT_REQUIRED          = 0x01000000
1705	SHTDN_REASON_FLAG_DIRTY_PROBLEM_ID_REQUIRED = 0x02000000
1706	SHTDN_REASON_FLAG_CLEAN_UI                  = 0x04000000
1707	SHTDN_REASON_FLAG_DIRTY_UI                  = 0x08000000
1708	SHTDN_REASON_FLAG_USER_DEFINED              = 0x40000000
1709	SHTDN_REASON_FLAG_PLANNED                   = 0x80000000
1710	SHTDN_REASON_MAJOR_OTHER                    = 0x00000000
1711	SHTDN_REASON_MAJOR_NONE                     = 0x00000000
1712	SHTDN_REASON_MAJOR_HARDWARE                 = 0x00010000
1713	SHTDN_REASON_MAJOR_OPERATINGSYSTEM          = 0x00020000
1714	SHTDN_REASON_MAJOR_SOFTWARE                 = 0x00030000
1715	SHTDN_REASON_MAJOR_APPLICATION              = 0x00040000
1716	SHTDN_REASON_MAJOR_SYSTEM                   = 0x00050000
1717	SHTDN_REASON_MAJOR_POWER                    = 0x00060000
1718	SHTDN_REASON_MAJOR_LEGACY_API               = 0x00070000
1719	SHTDN_REASON_MINOR_OTHER                    = 0x00000000
1720	SHTDN_REASON_MINOR_NONE                     = 0x000000ff
1721	SHTDN_REASON_MINOR_MAINTENANCE              = 0x00000001
1722	SHTDN_REASON_MINOR_INSTALLATION             = 0x00000002
1723	SHTDN_REASON_MINOR_UPGRADE                  = 0x00000003
1724	SHTDN_REASON_MINOR_RECONFIG                 = 0x00000004
1725	SHTDN_REASON_MINOR_HUNG                     = 0x00000005
1726	SHTDN_REASON_MINOR_UNSTABLE                 = 0x00000006
1727	SHTDN_REASON_MINOR_DISK                     = 0x00000007
1728	SHTDN_REASON_MINOR_PROCESSOR                = 0x00000008
1729	SHTDN_REASON_MINOR_NETWORKCARD              = 0x00000009
1730	SHTDN_REASON_MINOR_POWER_SUPPLY             = 0x0000000a
1731	SHTDN_REASON_MINOR_CORDUNPLUGGED            = 0x0000000b
1732	SHTDN_REASON_MINOR_ENVIRONMENT              = 0x0000000c
1733	SHTDN_REASON_MINOR_HARDWARE_DRIVER          = 0x0000000d
1734	SHTDN_REASON_MINOR_OTHERDRIVER              = 0x0000000e
1735	SHTDN_REASON_MINOR_BLUESCREEN               = 0x0000000F
1736	SHTDN_REASON_MINOR_SERVICEPACK              = 0x00000010
1737	SHTDN_REASON_MINOR_HOTFIX                   = 0x00000011
1738	SHTDN_REASON_MINOR_SECURITYFIX              = 0x00000012
1739	SHTDN_REASON_MINOR_SECURITY                 = 0x00000013
1740	SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY     = 0x00000014
1741	SHTDN_REASON_MINOR_WMI                      = 0x00000015
1742	SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL    = 0x00000016
1743	SHTDN_REASON_MINOR_HOTFIX_UNINSTALL         = 0x00000017
1744	SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL    = 0x00000018
1745	SHTDN_REASON_MINOR_MMC                      = 0x00000019
1746	SHTDN_REASON_MINOR_SYSTEMRESTORE            = 0x0000001a
1747	SHTDN_REASON_MINOR_TERMSRV                  = 0x00000020
1748	SHTDN_REASON_MINOR_DC_PROMOTION             = 0x00000021
1749	SHTDN_REASON_MINOR_DC_DEMOTION              = 0x00000022
1750	SHTDN_REASON_UNKNOWN                        = SHTDN_REASON_MINOR_NONE
1751	SHTDN_REASON_LEGACY_API                     = SHTDN_REASON_MAJOR_LEGACY_API | SHTDN_REASON_FLAG_PLANNED
1752	SHTDN_REASON_VALID_BIT_MASK                 = 0xc0ffffff
1753
1754	SHUTDOWN_NORETRY = 0x1
1755)
1756