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	FILE_LIST_DIRECTORY   = 0x00000001
66	FILE_APPEND_DATA      = 0x00000004
67	FILE_WRITE_ATTRIBUTES = 0x00000100
68
69	FILE_SHARE_READ   = 0x00000001
70	FILE_SHARE_WRITE  = 0x00000002
71	FILE_SHARE_DELETE = 0x00000004
72
73	FILE_ATTRIBUTE_READONLY              = 0x00000001
74	FILE_ATTRIBUTE_HIDDEN                = 0x00000002
75	FILE_ATTRIBUTE_SYSTEM                = 0x00000004
76	FILE_ATTRIBUTE_DIRECTORY             = 0x00000010
77	FILE_ATTRIBUTE_ARCHIVE               = 0x00000020
78	FILE_ATTRIBUTE_DEVICE                = 0x00000040
79	FILE_ATTRIBUTE_NORMAL                = 0x00000080
80	FILE_ATTRIBUTE_TEMPORARY             = 0x00000100
81	FILE_ATTRIBUTE_SPARSE_FILE           = 0x00000200
82	FILE_ATTRIBUTE_REPARSE_POINT         = 0x00000400
83	FILE_ATTRIBUTE_COMPRESSED            = 0x00000800
84	FILE_ATTRIBUTE_OFFLINE               = 0x00001000
85	FILE_ATTRIBUTE_NOT_CONTENT_INDEXED   = 0x00002000
86	FILE_ATTRIBUTE_ENCRYPTED             = 0x00004000
87	FILE_ATTRIBUTE_INTEGRITY_STREAM      = 0x00008000
88	FILE_ATTRIBUTE_VIRTUAL               = 0x00010000
89	FILE_ATTRIBUTE_NO_SCRUB_DATA         = 0x00020000
90	FILE_ATTRIBUTE_RECALL_ON_OPEN        = 0x00040000
91	FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = 0x00400000
92
93	INVALID_FILE_ATTRIBUTES = 0xffffffff
94
95	CREATE_NEW        = 1
96	CREATE_ALWAYS     = 2
97	OPEN_EXISTING     = 3
98	OPEN_ALWAYS       = 4
99	TRUNCATE_EXISTING = 5
100
101	FILE_FLAG_OPEN_REQUIRING_OPLOCK = 0x00040000
102	FILE_FLAG_FIRST_PIPE_INSTANCE   = 0x00080000
103	FILE_FLAG_OPEN_NO_RECALL        = 0x00100000
104	FILE_FLAG_OPEN_REPARSE_POINT    = 0x00200000
105	FILE_FLAG_SESSION_AWARE         = 0x00800000
106	FILE_FLAG_POSIX_SEMANTICS       = 0x01000000
107	FILE_FLAG_BACKUP_SEMANTICS      = 0x02000000
108	FILE_FLAG_DELETE_ON_CLOSE       = 0x04000000
109	FILE_FLAG_SEQUENTIAL_SCAN       = 0x08000000
110	FILE_FLAG_RANDOM_ACCESS         = 0x10000000
111	FILE_FLAG_NO_BUFFERING          = 0x20000000
112	FILE_FLAG_OVERLAPPED            = 0x40000000
113	FILE_FLAG_WRITE_THROUGH         = 0x80000000
114
115	HANDLE_FLAG_INHERIT    = 0x00000001
116	STARTF_USESTDHANDLES   = 0x00000100
117	STARTF_USESHOWWINDOW   = 0x00000001
118	DUPLICATE_CLOSE_SOURCE = 0x00000001
119	DUPLICATE_SAME_ACCESS  = 0x00000002
120
121	STD_INPUT_HANDLE  = -10 & (1<<32 - 1)
122	STD_OUTPUT_HANDLE = -11 & (1<<32 - 1)
123	STD_ERROR_HANDLE  = -12 & (1<<32 - 1)
124
125	FILE_BEGIN   = 0
126	FILE_CURRENT = 1
127	FILE_END     = 2
128
129	LANG_ENGLISH       = 0x09
130	SUBLANG_ENGLISH_US = 0x01
131
132	FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
133	FORMAT_MESSAGE_IGNORE_INSERTS  = 512
134	FORMAT_MESSAGE_FROM_STRING     = 1024
135	FORMAT_MESSAGE_FROM_HMODULE    = 2048
136	FORMAT_MESSAGE_FROM_SYSTEM     = 4096
137	FORMAT_MESSAGE_ARGUMENT_ARRAY  = 8192
138	FORMAT_MESSAGE_MAX_WIDTH_MASK  = 255
139
140	MAX_PATH      = 260
141	MAX_LONG_PATH = 32768
142
143	MAX_COMPUTERNAME_LENGTH = 15
144
145	TIME_ZONE_ID_UNKNOWN  = 0
146	TIME_ZONE_ID_STANDARD = 1
147
148	TIME_ZONE_ID_DAYLIGHT = 2
149	IGNORE                = 0
150	INFINITE              = 0xffffffff
151
152	WAIT_ABANDONED = 0x00000080
153	WAIT_OBJECT_0  = 0x00000000
154	WAIT_FAILED    = 0xFFFFFFFF
155
156	// Access rights for process.
157	PROCESS_CREATE_PROCESS            = 0x0080
158	PROCESS_CREATE_THREAD             = 0x0002
159	PROCESS_DUP_HANDLE                = 0x0040
160	PROCESS_QUERY_INFORMATION         = 0x0400
161	PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
162	PROCESS_SET_INFORMATION           = 0x0200
163	PROCESS_SET_QUOTA                 = 0x0100
164	PROCESS_SUSPEND_RESUME            = 0x0800
165	PROCESS_TERMINATE                 = 0x0001
166	PROCESS_VM_OPERATION              = 0x0008
167	PROCESS_VM_READ                   = 0x0010
168	PROCESS_VM_WRITE                  = 0x0020
169
170	// Access rights for thread.
171	THREAD_DIRECT_IMPERSONATION      = 0x0200
172	THREAD_GET_CONTEXT               = 0x0008
173	THREAD_IMPERSONATE               = 0x0100
174	THREAD_QUERY_INFORMATION         = 0x0040
175	THREAD_QUERY_LIMITED_INFORMATION = 0x0800
176	THREAD_SET_CONTEXT               = 0x0010
177	THREAD_SET_INFORMATION           = 0x0020
178	THREAD_SET_LIMITED_INFORMATION   = 0x0400
179	THREAD_SET_THREAD_TOKEN          = 0x0080
180	THREAD_SUSPEND_RESUME            = 0x0002
181	THREAD_TERMINATE                 = 0x0001
182
183	FILE_MAP_COPY    = 0x01
184	FILE_MAP_WRITE   = 0x02
185	FILE_MAP_READ    = 0x04
186	FILE_MAP_EXECUTE = 0x20
187
188	CTRL_C_EVENT        = 0
189	CTRL_BREAK_EVENT    = 1
190	CTRL_CLOSE_EVENT    = 2
191	CTRL_LOGOFF_EVENT   = 5
192	CTRL_SHUTDOWN_EVENT = 6
193
194	// Windows reserves errors >= 1<<29 for application use.
195	APPLICATION_ERROR = 1 << 29
196)
197
198const (
199	// Process creation flags.
200	CREATE_BREAKAWAY_FROM_JOB        = 0x01000000
201	CREATE_DEFAULT_ERROR_MODE        = 0x04000000
202	CREATE_NEW_CONSOLE               = 0x00000010
203	CREATE_NEW_PROCESS_GROUP         = 0x00000200
204	CREATE_NO_WINDOW                 = 0x08000000
205	CREATE_PROTECTED_PROCESS         = 0x00040000
206	CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000
207	CREATE_SEPARATE_WOW_VDM          = 0x00000800
208	CREATE_SHARED_WOW_VDM            = 0x00001000
209	CREATE_SUSPENDED                 = 0x00000004
210	CREATE_UNICODE_ENVIRONMENT       = 0x00000400
211	DEBUG_ONLY_THIS_PROCESS          = 0x00000002
212	DEBUG_PROCESS                    = 0x00000001
213	DETACHED_PROCESS                 = 0x00000008
214	EXTENDED_STARTUPINFO_PRESENT     = 0x00080000
215	INHERIT_PARENT_AFFINITY          = 0x00010000
216)
217
218const (
219	// flags for CreateToolhelp32Snapshot
220	TH32CS_SNAPHEAPLIST = 0x01
221	TH32CS_SNAPPROCESS  = 0x02
222	TH32CS_SNAPTHREAD   = 0x04
223	TH32CS_SNAPMODULE   = 0x08
224	TH32CS_SNAPMODULE32 = 0x10
225	TH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD
226	TH32CS_INHERIT      = 0x80000000
227)
228
229const (
230	// filters for ReadDirectoryChangesW and FindFirstChangeNotificationW
231	FILE_NOTIFY_CHANGE_FILE_NAME   = 0x001
232	FILE_NOTIFY_CHANGE_DIR_NAME    = 0x002
233	FILE_NOTIFY_CHANGE_ATTRIBUTES  = 0x004
234	FILE_NOTIFY_CHANGE_SIZE        = 0x008
235	FILE_NOTIFY_CHANGE_LAST_WRITE  = 0x010
236	FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020
237	FILE_NOTIFY_CHANGE_CREATION    = 0x040
238	FILE_NOTIFY_CHANGE_SECURITY    = 0x100
239)
240
241const (
242	// do not reorder
243	FILE_ACTION_ADDED = iota + 1
244	FILE_ACTION_REMOVED
245	FILE_ACTION_MODIFIED
246	FILE_ACTION_RENAMED_OLD_NAME
247	FILE_ACTION_RENAMED_NEW_NAME
248)
249
250const (
251	// wincrypt.h
252	/* certenrolld_begin -- PROV_RSA_*/
253	PROV_RSA_FULL      = 1
254	PROV_RSA_SIG       = 2
255	PROV_DSS           = 3
256	PROV_FORTEZZA      = 4
257	PROV_MS_EXCHANGE   = 5
258	PROV_SSL           = 6
259	PROV_RSA_SCHANNEL  = 12
260	PROV_DSS_DH        = 13
261	PROV_EC_ECDSA_SIG  = 14
262	PROV_EC_ECNRA_SIG  = 15
263	PROV_EC_ECDSA_FULL = 16
264	PROV_EC_ECNRA_FULL = 17
265	PROV_DH_SCHANNEL   = 18
266	PROV_SPYRUS_LYNKS  = 20
267	PROV_RNG           = 21
268	PROV_INTEL_SEC     = 22
269	PROV_REPLACE_OWF   = 23
270	PROV_RSA_AES       = 24
271
272	/* dwFlags definitions for CryptAcquireContext */
273	CRYPT_VERIFYCONTEXT              = 0xF0000000
274	CRYPT_NEWKEYSET                  = 0x00000008
275	CRYPT_DELETEKEYSET               = 0x00000010
276	CRYPT_MACHINE_KEYSET             = 0x00000020
277	CRYPT_SILENT                     = 0x00000040
278	CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080
279
280	/* Flags for PFXImportCertStore */
281	CRYPT_EXPORTABLE                   = 0x00000001
282	CRYPT_USER_PROTECTED               = 0x00000002
283	CRYPT_USER_KEYSET                  = 0x00001000
284	PKCS12_PREFER_CNG_KSP              = 0x00000100
285	PKCS12_ALWAYS_CNG_KSP              = 0x00000200
286	PKCS12_ALLOW_OVERWRITE_KEY         = 0x00004000
287	PKCS12_NO_PERSIST_KEY              = 0x00008000
288	PKCS12_INCLUDE_EXTENDED_PROPERTIES = 0x00000010
289
290	/* Flags for CryptAcquireCertificatePrivateKey */
291	CRYPT_ACQUIRE_CACHE_FLAG             = 0x00000001
292	CRYPT_ACQUIRE_USE_PROV_INFO_FLAG     = 0x00000002
293	CRYPT_ACQUIRE_COMPARE_KEY_FLAG       = 0x00000004
294	CRYPT_ACQUIRE_NO_HEALING             = 0x00000008
295	CRYPT_ACQUIRE_SILENT_FLAG            = 0x00000040
296	CRYPT_ACQUIRE_WINDOW_HANDLE_FLAG     = 0x00000080
297	CRYPT_ACQUIRE_NCRYPT_KEY_FLAGS_MASK  = 0x00070000
298	CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG  = 0x00010000
299	CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG = 0x00020000
300	CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG   = 0x00040000
301
302	/* pdwKeySpec for CryptAcquireCertificatePrivateKey */
303	AT_KEYEXCHANGE       = 1
304	AT_SIGNATURE         = 2
305	CERT_NCRYPT_KEY_SPEC = 0xFFFFFFFF
306
307	/* Default usage match type is AND with value zero */
308	USAGE_MATCH_TYPE_AND = 0
309	USAGE_MATCH_TYPE_OR  = 1
310
311	/* msgAndCertEncodingType values for CertOpenStore function */
312	X509_ASN_ENCODING   = 0x00000001
313	PKCS_7_ASN_ENCODING = 0x00010000
314
315	/* storeProvider values for CertOpenStore function */
316	CERT_STORE_PROV_MSG               = 1
317	CERT_STORE_PROV_MEMORY            = 2
318	CERT_STORE_PROV_FILE              = 3
319	CERT_STORE_PROV_REG               = 4
320	CERT_STORE_PROV_PKCS7             = 5
321	CERT_STORE_PROV_SERIALIZED        = 6
322	CERT_STORE_PROV_FILENAME_A        = 7
323	CERT_STORE_PROV_FILENAME_W        = 8
324	CERT_STORE_PROV_FILENAME          = CERT_STORE_PROV_FILENAME_W
325	CERT_STORE_PROV_SYSTEM_A          = 9
326	CERT_STORE_PROV_SYSTEM_W          = 10
327	CERT_STORE_PROV_SYSTEM            = CERT_STORE_PROV_SYSTEM_W
328	CERT_STORE_PROV_COLLECTION        = 11
329	CERT_STORE_PROV_SYSTEM_REGISTRY_A = 12
330	CERT_STORE_PROV_SYSTEM_REGISTRY_W = 13
331	CERT_STORE_PROV_SYSTEM_REGISTRY   = CERT_STORE_PROV_SYSTEM_REGISTRY_W
332	CERT_STORE_PROV_PHYSICAL_W        = 14
333	CERT_STORE_PROV_PHYSICAL          = CERT_STORE_PROV_PHYSICAL_W
334	CERT_STORE_PROV_SMART_CARD_W      = 15
335	CERT_STORE_PROV_SMART_CARD        = CERT_STORE_PROV_SMART_CARD_W
336	CERT_STORE_PROV_LDAP_W            = 16
337	CERT_STORE_PROV_LDAP              = CERT_STORE_PROV_LDAP_W
338	CERT_STORE_PROV_PKCS12            = 17
339
340	/* store characteristics (low WORD of flag) for CertOpenStore function */
341	CERT_STORE_NO_CRYPT_RELEASE_FLAG            = 0x00000001
342	CERT_STORE_SET_LOCALIZED_NAME_FLAG          = 0x00000002
343	CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004
344	CERT_STORE_DELETE_FLAG                      = 0x00000010
345	CERT_STORE_UNSAFE_PHYSICAL_FLAG             = 0x00000020
346	CERT_STORE_SHARE_STORE_FLAG                 = 0x00000040
347	CERT_STORE_SHARE_CONTEXT_FLAG               = 0x00000080
348	CERT_STORE_MANIFOLD_FLAG                    = 0x00000100
349	CERT_STORE_ENUM_ARCHIVED_FLAG               = 0x00000200
350	CERT_STORE_UPDATE_KEYID_FLAG                = 0x00000400
351	CERT_STORE_BACKUP_RESTORE_FLAG              = 0x00000800
352	CERT_STORE_MAXIMUM_ALLOWED_FLAG             = 0x00001000
353	CERT_STORE_CREATE_NEW_FLAG                  = 0x00002000
354	CERT_STORE_OPEN_EXISTING_FLAG               = 0x00004000
355	CERT_STORE_READONLY_FLAG                    = 0x00008000
356
357	/* store locations (high WORD of flag) for CertOpenStore function */
358	CERT_SYSTEM_STORE_CURRENT_USER               = 0x00010000
359	CERT_SYSTEM_STORE_LOCAL_MACHINE              = 0x00020000
360	CERT_SYSTEM_STORE_CURRENT_SERVICE            = 0x00040000
361	CERT_SYSTEM_STORE_SERVICES                   = 0x00050000
362	CERT_SYSTEM_STORE_USERS                      = 0x00060000
363	CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY  = 0x00070000
364	CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 0x00080000
365	CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE   = 0x00090000
366	CERT_SYSTEM_STORE_UNPROTECTED_FLAG           = 0x40000000
367	CERT_SYSTEM_STORE_RELOCATE_FLAG              = 0x80000000
368
369	/* Miscellaneous high-WORD flags for CertOpenStore function */
370	CERT_REGISTRY_STORE_REMOTE_FLAG      = 0x00010000
371	CERT_REGISTRY_STORE_SERIALIZED_FLAG  = 0x00020000
372	CERT_REGISTRY_STORE_ROAMING_FLAG     = 0x00040000
373	CERT_REGISTRY_STORE_MY_IE_DIRTY_FLAG = 0x00080000
374	CERT_REGISTRY_STORE_LM_GPT_FLAG      = 0x01000000
375	CERT_REGISTRY_STORE_CLIENT_GPT_FLAG  = 0x80000000
376	CERT_FILE_STORE_COMMIT_ENABLE_FLAG   = 0x00010000
377	CERT_LDAP_STORE_SIGN_FLAG            = 0x00010000
378	CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG  = 0x00020000
379	CERT_LDAP_STORE_OPENED_FLAG          = 0x00040000
380	CERT_LDAP_STORE_UNBIND_FLAG          = 0x00080000
381
382	/* addDisposition values for CertAddCertificateContextToStore function */
383	CERT_STORE_ADD_NEW                                 = 1
384	CERT_STORE_ADD_USE_EXISTING                        = 2
385	CERT_STORE_ADD_REPLACE_EXISTING                    = 3
386	CERT_STORE_ADD_ALWAYS                              = 4
387	CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5
388	CERT_STORE_ADD_NEWER                               = 6
389	CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES            = 7
390
391	/* ErrorStatus values for CertTrustStatus struct */
392	CERT_TRUST_NO_ERROR                          = 0x00000000
393	CERT_TRUST_IS_NOT_TIME_VALID                 = 0x00000001
394	CERT_TRUST_IS_REVOKED                        = 0x00000004
395	CERT_TRUST_IS_NOT_SIGNATURE_VALID            = 0x00000008
396	CERT_TRUST_IS_NOT_VALID_FOR_USAGE            = 0x00000010
397	CERT_TRUST_IS_UNTRUSTED_ROOT                 = 0x00000020
398	CERT_TRUST_REVOCATION_STATUS_UNKNOWN         = 0x00000040
399	CERT_TRUST_IS_CYCLIC                         = 0x00000080
400	CERT_TRUST_INVALID_EXTENSION                 = 0x00000100
401	CERT_TRUST_INVALID_POLICY_CONSTRAINTS        = 0x00000200
402	CERT_TRUST_INVALID_BASIC_CONSTRAINTS         = 0x00000400
403	CERT_TRUST_INVALID_NAME_CONSTRAINTS          = 0x00000800
404	CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000
405	CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT   = 0x00002000
406	CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000
407	CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT      = 0x00008000
408	CERT_TRUST_IS_PARTIAL_CHAIN                  = 0x00010000
409	CERT_TRUST_CTL_IS_NOT_TIME_VALID             = 0x00020000
410	CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID        = 0x00040000
411	CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE        = 0x00080000
412	CERT_TRUST_HAS_WEAK_SIGNATURE                = 0x00100000
413	CERT_TRUST_IS_OFFLINE_REVOCATION             = 0x01000000
414	CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY          = 0x02000000
415	CERT_TRUST_IS_EXPLICIT_DISTRUST              = 0x04000000
416	CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT    = 0x08000000
417
418	/* InfoStatus values for CertTrustStatus struct */
419	CERT_TRUST_HAS_EXACT_MATCH_ISSUER        = 0x00000001
420	CERT_TRUST_HAS_KEY_MATCH_ISSUER          = 0x00000002
421	CERT_TRUST_HAS_NAME_MATCH_ISSUER         = 0x00000004
422	CERT_TRUST_IS_SELF_SIGNED                = 0x00000008
423	CERT_TRUST_HAS_PREFERRED_ISSUER          = 0x00000100
424	CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY     = 0x00000400
425	CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS    = 0x00000400
426	CERT_TRUST_IS_PEER_TRUSTED               = 0x00000800
427	CERT_TRUST_HAS_CRL_VALIDITY_EXTENDED     = 0x00001000
428	CERT_TRUST_IS_FROM_EXCLUSIVE_TRUST_STORE = 0x00002000
429	CERT_TRUST_IS_CA_TRUSTED                 = 0x00004000
430	CERT_TRUST_IS_COMPLEX_CHAIN              = 0x00010000
431
432	/* Certificate Information Flags */
433	CERT_INFO_VERSION_FLAG                 = 1
434	CERT_INFO_SERIAL_NUMBER_FLAG           = 2
435	CERT_INFO_SIGNATURE_ALGORITHM_FLAG     = 3
436	CERT_INFO_ISSUER_FLAG                  = 4
437	CERT_INFO_NOT_BEFORE_FLAG              = 5
438	CERT_INFO_NOT_AFTER_FLAG               = 6
439	CERT_INFO_SUBJECT_FLAG                 = 7
440	CERT_INFO_SUBJECT_PUBLIC_KEY_INFO_FLAG = 8
441	CERT_INFO_ISSUER_UNIQUE_ID_FLAG        = 9
442	CERT_INFO_SUBJECT_UNIQUE_ID_FLAG       = 10
443	CERT_INFO_EXTENSION_FLAG               = 11
444
445	/* dwFindType for CertFindCertificateInStore  */
446	CERT_COMPARE_MASK                     = 0xFFFF
447	CERT_COMPARE_SHIFT                    = 16
448	CERT_COMPARE_ANY                      = 0
449	CERT_COMPARE_SHA1_HASH                = 1
450	CERT_COMPARE_NAME                     = 2
451	CERT_COMPARE_ATTR                     = 3
452	CERT_COMPARE_MD5_HASH                 = 4
453	CERT_COMPARE_PROPERTY                 = 5
454	CERT_COMPARE_PUBLIC_KEY               = 6
455	CERT_COMPARE_HASH                     = CERT_COMPARE_SHA1_HASH
456	CERT_COMPARE_NAME_STR_A               = 7
457	CERT_COMPARE_NAME_STR_W               = 8
458	CERT_COMPARE_KEY_SPEC                 = 9
459	CERT_COMPARE_ENHKEY_USAGE             = 10
460	CERT_COMPARE_CTL_USAGE                = CERT_COMPARE_ENHKEY_USAGE
461	CERT_COMPARE_SUBJECT_CERT             = 11
462	CERT_COMPARE_ISSUER_OF                = 12
463	CERT_COMPARE_EXISTING                 = 13
464	CERT_COMPARE_SIGNATURE_HASH           = 14
465	CERT_COMPARE_KEY_IDENTIFIER           = 15
466	CERT_COMPARE_CERT_ID                  = 16
467	CERT_COMPARE_CROSS_CERT_DIST_POINTS   = 17
468	CERT_COMPARE_PUBKEY_MD5_HASH          = 18
469	CERT_COMPARE_SUBJECT_INFO_ACCESS      = 19
470	CERT_COMPARE_HASH_STR                 = 20
471	CERT_COMPARE_HAS_PRIVATE_KEY          = 21
472	CERT_FIND_ANY                         = (CERT_COMPARE_ANY << CERT_COMPARE_SHIFT)
473	CERT_FIND_SHA1_HASH                   = (CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT)
474	CERT_FIND_MD5_HASH                    = (CERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT)
475	CERT_FIND_SIGNATURE_HASH              = (CERT_COMPARE_SIGNATURE_HASH << CERT_COMPARE_SHIFT)
476	CERT_FIND_KEY_IDENTIFIER              = (CERT_COMPARE_KEY_IDENTIFIER << CERT_COMPARE_SHIFT)
477	CERT_FIND_HASH                        = CERT_FIND_SHA1_HASH
478	CERT_FIND_PROPERTY                    = (CERT_COMPARE_PROPERTY << CERT_COMPARE_SHIFT)
479	CERT_FIND_PUBLIC_KEY                  = (CERT_COMPARE_PUBLIC_KEY << CERT_COMPARE_SHIFT)
480	CERT_FIND_SUBJECT_NAME                = (CERT_COMPARE_NAME<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
481	CERT_FIND_SUBJECT_ATTR                = (CERT_COMPARE_ATTR<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
482	CERT_FIND_ISSUER_NAME                 = (CERT_COMPARE_NAME<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
483	CERT_FIND_ISSUER_ATTR                 = (CERT_COMPARE_ATTR<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
484	CERT_FIND_SUBJECT_STR_A               = (CERT_COMPARE_NAME_STR_A<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
485	CERT_FIND_SUBJECT_STR_W               = (CERT_COMPARE_NAME_STR_W<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
486	CERT_FIND_SUBJECT_STR                 = CERT_FIND_SUBJECT_STR_W
487	CERT_FIND_ISSUER_STR_A                = (CERT_COMPARE_NAME_STR_A<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
488	CERT_FIND_ISSUER_STR_W                = (CERT_COMPARE_NAME_STR_W<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
489	CERT_FIND_ISSUER_STR                  = CERT_FIND_ISSUER_STR_W
490	CERT_FIND_KEY_SPEC                    = (CERT_COMPARE_KEY_SPEC << CERT_COMPARE_SHIFT)
491	CERT_FIND_ENHKEY_USAGE                = (CERT_COMPARE_ENHKEY_USAGE << CERT_COMPARE_SHIFT)
492	CERT_FIND_CTL_USAGE                   = CERT_FIND_ENHKEY_USAGE
493	CERT_FIND_SUBJECT_CERT                = (CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT)
494	CERT_FIND_ISSUER_OF                   = (CERT_COMPARE_ISSUER_OF << CERT_COMPARE_SHIFT)
495	CERT_FIND_EXISTING                    = (CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT)
496	CERT_FIND_CERT_ID                     = (CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT)
497	CERT_FIND_CROSS_CERT_DIST_POINTS      = (CERT_COMPARE_CROSS_CERT_DIST_POINTS << CERT_COMPARE_SHIFT)
498	CERT_FIND_PUBKEY_MD5_HASH             = (CERT_COMPARE_PUBKEY_MD5_HASH << CERT_COMPARE_SHIFT)
499	CERT_FIND_SUBJECT_INFO_ACCESS         = (CERT_COMPARE_SUBJECT_INFO_ACCESS << CERT_COMPARE_SHIFT)
500	CERT_FIND_HASH_STR                    = (CERT_COMPARE_HASH_STR << CERT_COMPARE_SHIFT)
501	CERT_FIND_HAS_PRIVATE_KEY             = (CERT_COMPARE_HAS_PRIVATE_KEY << CERT_COMPARE_SHIFT)
502	CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG  = 0x1
503	CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG  = 0x2
504	CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG = 0x4
505	CERT_FIND_NO_ENHKEY_USAGE_FLAG        = 0x8
506	CERT_FIND_OR_ENHKEY_USAGE_FLAG        = 0x10
507	CERT_FIND_VALID_ENHKEY_USAGE_FLAG     = 0x20
508	CERT_FIND_OPTIONAL_CTL_USAGE_FLAG     = CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG
509	CERT_FIND_EXT_ONLY_CTL_USAGE_FLAG     = CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG
510	CERT_FIND_PROP_ONLY_CTL_USAGE_FLAG    = CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG
511	CERT_FIND_NO_CTL_USAGE_FLAG           = CERT_FIND_NO_ENHKEY_USAGE_FLAG
512	CERT_FIND_OR_CTL_USAGE_FLAG           = CERT_FIND_OR_ENHKEY_USAGE_FLAG
513	CERT_FIND_VALID_CTL_USAGE_FLAG        = CERT_FIND_VALID_ENHKEY_USAGE_FLAG
514
515	/* policyOID values for CertVerifyCertificateChainPolicy function */
516	CERT_CHAIN_POLICY_BASE              = 1
517	CERT_CHAIN_POLICY_AUTHENTICODE      = 2
518	CERT_CHAIN_POLICY_AUTHENTICODE_TS   = 3
519	CERT_CHAIN_POLICY_SSL               = 4
520	CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5
521	CERT_CHAIN_POLICY_NT_AUTH           = 6
522	CERT_CHAIN_POLICY_MICROSOFT_ROOT    = 7
523	CERT_CHAIN_POLICY_EV                = 8
524	CERT_CHAIN_POLICY_SSL_F12           = 9
525
526	/* flag for dwFindType CertFindChainInStore  */
527	CERT_CHAIN_FIND_BY_ISSUER = 1
528
529	/* dwFindFlags for CertFindChainInStore when dwFindType == CERT_CHAIN_FIND_BY_ISSUER */
530	CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG    = 0x0001
531	CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG  = 0x0002
532	CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG = 0x0004
533	CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG  = 0x0008
534	CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG         = 0x4000
535	CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG     = 0x8000
536
537	/* Certificate Store close flags */
538	CERT_CLOSE_STORE_FORCE_FLAG = 0x00000001
539	CERT_CLOSE_STORE_CHECK_FLAG = 0x00000002
540
541	/* CryptQueryObject object type */
542	CERT_QUERY_OBJECT_FILE = 1
543	CERT_QUERY_OBJECT_BLOB = 2
544
545	/* CryptQueryObject content type flags */
546	CERT_QUERY_CONTENT_CERT                    = 1
547	CERT_QUERY_CONTENT_CTL                     = 2
548	CERT_QUERY_CONTENT_CRL                     = 3
549	CERT_QUERY_CONTENT_SERIALIZED_STORE        = 4
550	CERT_QUERY_CONTENT_SERIALIZED_CERT         = 5
551	CERT_QUERY_CONTENT_SERIALIZED_CTL          = 6
552	CERT_QUERY_CONTENT_SERIALIZED_CRL          = 7
553	CERT_QUERY_CONTENT_PKCS7_SIGNED            = 8
554	CERT_QUERY_CONTENT_PKCS7_UNSIGNED          = 9
555	CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED      = 10
556	CERT_QUERY_CONTENT_PKCS10                  = 11
557	CERT_QUERY_CONTENT_PFX                     = 12
558	CERT_QUERY_CONTENT_CERT_PAIR               = 13
559	CERT_QUERY_CONTENT_PFX_AND_LOAD            = 14
560	CERT_QUERY_CONTENT_FLAG_CERT               = (1 << CERT_QUERY_CONTENT_CERT)
561	CERT_QUERY_CONTENT_FLAG_CTL                = (1 << CERT_QUERY_CONTENT_CTL)
562	CERT_QUERY_CONTENT_FLAG_CRL                = (1 << CERT_QUERY_CONTENT_CRL)
563	CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE   = (1 << CERT_QUERY_CONTENT_SERIALIZED_STORE)
564	CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT    = (1 << CERT_QUERY_CONTENT_SERIALIZED_CERT)
565	CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL     = (1 << CERT_QUERY_CONTENT_SERIALIZED_CTL)
566	CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL     = (1 << CERT_QUERY_CONTENT_SERIALIZED_CRL)
567	CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED       = (1 << CERT_QUERY_CONTENT_PKCS7_SIGNED)
568	CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED     = (1 << CERT_QUERY_CONTENT_PKCS7_UNSIGNED)
569	CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED = (1 << CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED)
570	CERT_QUERY_CONTENT_FLAG_PKCS10             = (1 << CERT_QUERY_CONTENT_PKCS10)
571	CERT_QUERY_CONTENT_FLAG_PFX                = (1 << CERT_QUERY_CONTENT_PFX)
572	CERT_QUERY_CONTENT_FLAG_CERT_PAIR          = (1 << CERT_QUERY_CONTENT_CERT_PAIR)
573	CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD       = (1 << CERT_QUERY_CONTENT_PFX_AND_LOAD)
574	CERT_QUERY_CONTENT_FLAG_ALL                = (CERT_QUERY_CONTENT_FLAG_CERT | CERT_QUERY_CONTENT_FLAG_CTL | CERT_QUERY_CONTENT_FLAG_CRL | CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED | CERT_QUERY_CONTENT_FLAG_PKCS10 | CERT_QUERY_CONTENT_FLAG_PFX | CERT_QUERY_CONTENT_FLAG_CERT_PAIR)
575	CERT_QUERY_CONTENT_FLAG_ALL_ISSUER_CERT    = (CERT_QUERY_CONTENT_FLAG_CERT | CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED)
576
577	/* CryptQueryObject format type flags */
578	CERT_QUERY_FORMAT_BINARY                     = 1
579	CERT_QUERY_FORMAT_BASE64_ENCODED             = 2
580	CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED      = 3
581	CERT_QUERY_FORMAT_FLAG_BINARY                = (1 << CERT_QUERY_FORMAT_BINARY)
582	CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED        = (1 << CERT_QUERY_FORMAT_BASE64_ENCODED)
583	CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = (1 << CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED)
584	CERT_QUERY_FORMAT_FLAG_ALL                   = (CERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED)
585
586	/* CertGetNameString name types */
587	CERT_NAME_EMAIL_TYPE            = 1
588	CERT_NAME_RDN_TYPE              = 2
589	CERT_NAME_ATTR_TYPE             = 3
590	CERT_NAME_SIMPLE_DISPLAY_TYPE   = 4
591	CERT_NAME_FRIENDLY_DISPLAY_TYPE = 5
592	CERT_NAME_DNS_TYPE              = 6
593	CERT_NAME_URL_TYPE              = 7
594	CERT_NAME_UPN_TYPE              = 8
595
596	/* CertGetNameString flags */
597	CERT_NAME_ISSUER_FLAG              = 0x1
598	CERT_NAME_DISABLE_IE4_UTF8_FLAG    = 0x10000
599	CERT_NAME_SEARCH_ALL_NAMES_FLAG    = 0x2
600	CERT_NAME_STR_ENABLE_PUNYCODE_FLAG = 0x00200000
601
602	/* AuthType values for SSLExtraCertChainPolicyPara struct */
603	AUTHTYPE_CLIENT = 1
604	AUTHTYPE_SERVER = 2
605
606	/* Checks values for SSLExtraCertChainPolicyPara struct */
607	SECURITY_FLAG_IGNORE_REVOCATION        = 0x00000080
608	SECURITY_FLAG_IGNORE_UNKNOWN_CA        = 0x00000100
609	SECURITY_FLAG_IGNORE_WRONG_USAGE       = 0x00000200
610	SECURITY_FLAG_IGNORE_CERT_CN_INVALID   = 0x00001000
611	SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000
612
613	/* Flags for Crypt[Un]ProtectData */
614	CRYPTPROTECT_UI_FORBIDDEN      = 0x1
615	CRYPTPROTECT_LOCAL_MACHINE     = 0x4
616	CRYPTPROTECT_CRED_SYNC         = 0x8
617	CRYPTPROTECT_AUDIT             = 0x10
618	CRYPTPROTECT_NO_RECOVERY       = 0x20
619	CRYPTPROTECT_VERIFY_PROTECTION = 0x40
620	CRYPTPROTECT_CRED_REGENERATE   = 0x80
621
622	/* Flags for CryptProtectPromptStruct */
623	CRYPTPROTECT_PROMPT_ON_UNPROTECT   = 1
624	CRYPTPROTECT_PROMPT_ON_PROTECT     = 2
625	CRYPTPROTECT_PROMPT_RESERVED       = 4
626	CRYPTPROTECT_PROMPT_STRONG         = 8
627	CRYPTPROTECT_PROMPT_REQUIRE_STRONG = 16
628)
629
630const (
631	// flags for SetErrorMode
632	SEM_FAILCRITICALERRORS     = 0x0001
633	SEM_NOALIGNMENTFAULTEXCEPT = 0x0004
634	SEM_NOGPFAULTERRORBOX      = 0x0002
635	SEM_NOOPENFILEERRORBOX     = 0x8000
636)
637
638const (
639	// Priority class.
640	ABOVE_NORMAL_PRIORITY_CLASS   = 0x00008000
641	BELOW_NORMAL_PRIORITY_CLASS   = 0x00004000
642	HIGH_PRIORITY_CLASS           = 0x00000080
643	IDLE_PRIORITY_CLASS           = 0x00000040
644	NORMAL_PRIORITY_CLASS         = 0x00000020
645	PROCESS_MODE_BACKGROUND_BEGIN = 0x00100000
646	PROCESS_MODE_BACKGROUND_END   = 0x00200000
647	REALTIME_PRIORITY_CLASS       = 0x00000100
648)
649
650/* wintrust.h constants for WinVerifyTrustEx */
651const (
652	WTD_UI_ALL    = 1
653	WTD_UI_NONE   = 2
654	WTD_UI_NOBAD  = 3
655	WTD_UI_NOGOOD = 4
656
657	WTD_REVOKE_NONE       = 0
658	WTD_REVOKE_WHOLECHAIN = 1
659
660	WTD_CHOICE_FILE    = 1
661	WTD_CHOICE_CATALOG = 2
662	WTD_CHOICE_BLOB    = 3
663	WTD_CHOICE_SIGNER  = 4
664	WTD_CHOICE_CERT    = 5
665
666	WTD_STATEACTION_IGNORE           = 0x00000000
667	WTD_STATEACTION_VERIFY           = 0x00000010
668	WTD_STATEACTION_CLOSE            = 0x00000002
669	WTD_STATEACTION_AUTO_CACHE       = 0x00000003
670	WTD_STATEACTION_AUTO_CACHE_FLUSH = 0x00000004
671
672	WTD_USE_IE4_TRUST_FLAG                  = 0x1
673	WTD_NO_IE4_CHAIN_FLAG                   = 0x2
674	WTD_NO_POLICY_USAGE_FLAG                = 0x4
675	WTD_REVOCATION_CHECK_NONE               = 0x10
676	WTD_REVOCATION_CHECK_END_CERT           = 0x20
677	WTD_REVOCATION_CHECK_CHAIN              = 0x40
678	WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = 0x80
679	WTD_SAFER_FLAG                          = 0x100
680	WTD_HASH_ONLY_FLAG                      = 0x200
681	WTD_USE_DEFAULT_OSVER_CHECK             = 0x400
682	WTD_LIFETIME_SIGNING_FLAG               = 0x800
683	WTD_CACHE_ONLY_URL_RETRIEVAL            = 0x1000
684	WTD_DISABLE_MD2_MD4                     = 0x2000
685	WTD_MOTW                                = 0x4000
686
687	WTD_UICONTEXT_EXECUTE = 0
688	WTD_UICONTEXT_INSTALL = 1
689)
690
691var (
692	OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00")
693	OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00")
694	OID_SGC_NETSCAPE        = []byte("2.16.840.1.113730.4.1\x00")
695
696	WINTRUST_ACTION_GENERIC_VERIFY_V2 = GUID{
697		Data1: 0xaac56b,
698		Data2: 0xcd44,
699		Data3: 0x11d0,
700		Data4: [8]byte{0x8c, 0xc2, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee},
701	}
702)
703
704// Pointer represents a pointer to an arbitrary Windows type.
705//
706// Pointer-typed fields may point to one of many different types. It's
707// up to the caller to provide a pointer to the appropriate type, cast
708// to Pointer. The caller must obey the unsafe.Pointer rules while
709// doing so.
710type Pointer *struct{}
711
712// Invented values to support what package os expects.
713type Timeval struct {
714	Sec  int32
715	Usec int32
716}
717
718func (tv *Timeval) Nanoseconds() int64 {
719	return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3
720}
721
722func NsecToTimeval(nsec int64) (tv Timeval) {
723	tv.Sec = int32(nsec / 1e9)
724	tv.Usec = int32(nsec % 1e9 / 1e3)
725	return
726}
727
728type Overlapped struct {
729	Internal     uintptr
730	InternalHigh uintptr
731	Offset       uint32
732	OffsetHigh   uint32
733	HEvent       Handle
734}
735
736type FileNotifyInformation struct {
737	NextEntryOffset uint32
738	Action          uint32
739	FileNameLength  uint32
740	FileName        uint16
741}
742
743type Filetime struct {
744	LowDateTime  uint32
745	HighDateTime uint32
746}
747
748// Nanoseconds returns Filetime ft in nanoseconds
749// since Epoch (00:00:00 UTC, January 1, 1970).
750func (ft *Filetime) Nanoseconds() int64 {
751	// 100-nanosecond intervals since January 1, 1601
752	nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime)
753	// change starting time to the Epoch (00:00:00 UTC, January 1, 1970)
754	nsec -= 116444736000000000
755	// convert into nanoseconds
756	nsec *= 100
757	return nsec
758}
759
760func NsecToFiletime(nsec int64) (ft Filetime) {
761	// convert into 100-nanosecond
762	nsec /= 100
763	// change starting time to January 1, 1601
764	nsec += 116444736000000000
765	// split into high / low
766	ft.LowDateTime = uint32(nsec & 0xffffffff)
767	ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff)
768	return ft
769}
770
771type Win32finddata struct {
772	FileAttributes    uint32
773	CreationTime      Filetime
774	LastAccessTime    Filetime
775	LastWriteTime     Filetime
776	FileSizeHigh      uint32
777	FileSizeLow       uint32
778	Reserved0         uint32
779	Reserved1         uint32
780	FileName          [MAX_PATH - 1]uint16
781	AlternateFileName [13]uint16
782}
783
784// This is the actual system call structure.
785// Win32finddata is what we committed to in Go 1.
786type win32finddata1 struct {
787	FileAttributes    uint32
788	CreationTime      Filetime
789	LastAccessTime    Filetime
790	LastWriteTime     Filetime
791	FileSizeHigh      uint32
792	FileSizeLow       uint32
793	Reserved0         uint32
794	Reserved1         uint32
795	FileName          [MAX_PATH]uint16
796	AlternateFileName [14]uint16
797
798	// The Microsoft documentation for this struct¹ describes three additional
799	// fields: dwFileType, dwCreatorType, and wFinderFlags. However, those fields
800	// are empirically only present in the macOS port of the Win32 API,² and thus
801	// not needed for binaries built for Windows.
802	//
803	// ¹ https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-win32_find_dataw describe
804	// ² https://golang.org/issue/42637#issuecomment-760715755.
805}
806
807func copyFindData(dst *Win32finddata, src *win32finddata1) {
808	dst.FileAttributes = src.FileAttributes
809	dst.CreationTime = src.CreationTime
810	dst.LastAccessTime = src.LastAccessTime
811	dst.LastWriteTime = src.LastWriteTime
812	dst.FileSizeHigh = src.FileSizeHigh
813	dst.FileSizeLow = src.FileSizeLow
814	dst.Reserved0 = src.Reserved0
815	dst.Reserved1 = src.Reserved1
816
817	// The src is 1 element bigger than dst, but it must be NUL.
818	copy(dst.FileName[:], src.FileName[:])
819	copy(dst.AlternateFileName[:], src.AlternateFileName[:])
820}
821
822type ByHandleFileInformation struct {
823	FileAttributes     uint32
824	CreationTime       Filetime
825	LastAccessTime     Filetime
826	LastWriteTime      Filetime
827	VolumeSerialNumber uint32
828	FileSizeHigh       uint32
829	FileSizeLow        uint32
830	NumberOfLinks      uint32
831	FileIndexHigh      uint32
832	FileIndexLow       uint32
833}
834
835const (
836	GetFileExInfoStandard = 0
837	GetFileExMaxInfoLevel = 1
838)
839
840type Win32FileAttributeData struct {
841	FileAttributes uint32
842	CreationTime   Filetime
843	LastAccessTime Filetime
844	LastWriteTime  Filetime
845	FileSizeHigh   uint32
846	FileSizeLow    uint32
847}
848
849// ShowWindow constants
850const (
851	// winuser.h
852	SW_HIDE            = 0
853	SW_NORMAL          = 1
854	SW_SHOWNORMAL      = 1
855	SW_SHOWMINIMIZED   = 2
856	SW_SHOWMAXIMIZED   = 3
857	SW_MAXIMIZE        = 3
858	SW_SHOWNOACTIVATE  = 4
859	SW_SHOW            = 5
860	SW_MINIMIZE        = 6
861	SW_SHOWMINNOACTIVE = 7
862	SW_SHOWNA          = 8
863	SW_RESTORE         = 9
864	SW_SHOWDEFAULT     = 10
865	SW_FORCEMINIMIZE   = 11
866)
867
868type StartupInfo struct {
869	Cb            uint32
870	_             *uint16
871	Desktop       *uint16
872	Title         *uint16
873	X             uint32
874	Y             uint32
875	XSize         uint32
876	YSize         uint32
877	XCountChars   uint32
878	YCountChars   uint32
879	FillAttribute uint32
880	Flags         uint32
881	ShowWindow    uint16
882	_             uint16
883	_             *byte
884	StdInput      Handle
885	StdOutput     Handle
886	StdErr        Handle
887}
888
889type ProcessInformation struct {
890	Process   Handle
891	Thread    Handle
892	ProcessId uint32
893	ThreadId  uint32
894}
895
896type ProcessEntry32 struct {
897	Size            uint32
898	Usage           uint32
899	ProcessID       uint32
900	DefaultHeapID   uintptr
901	ModuleID        uint32
902	Threads         uint32
903	ParentProcessID uint32
904	PriClassBase    int32
905	Flags           uint32
906	ExeFile         [MAX_PATH]uint16
907}
908
909type ThreadEntry32 struct {
910	Size           uint32
911	Usage          uint32
912	ThreadID       uint32
913	OwnerProcessID uint32
914	BasePri        int32
915	DeltaPri       int32
916	Flags          uint32
917}
918
919type Systemtime struct {
920	Year         uint16
921	Month        uint16
922	DayOfWeek    uint16
923	Day          uint16
924	Hour         uint16
925	Minute       uint16
926	Second       uint16
927	Milliseconds uint16
928}
929
930type Timezoneinformation struct {
931	Bias         int32
932	StandardName [32]uint16
933	StandardDate Systemtime
934	StandardBias int32
935	DaylightName [32]uint16
936	DaylightDate Systemtime
937	DaylightBias int32
938}
939
940// Socket related.
941
942const (
943	AF_UNSPEC  = 0
944	AF_UNIX    = 1
945	AF_INET    = 2
946	AF_NETBIOS = 17
947	AF_INET6   = 23
948	AF_IRDA    = 26
949	AF_BTH     = 32
950
951	SOCK_STREAM    = 1
952	SOCK_DGRAM     = 2
953	SOCK_RAW       = 3
954	SOCK_RDM       = 4
955	SOCK_SEQPACKET = 5
956
957	IPPROTO_IP      = 0
958	IPPROTO_ICMP    = 1
959	IPPROTO_IGMP    = 2
960	BTHPROTO_RFCOMM = 3
961	IPPROTO_TCP     = 6
962	IPPROTO_UDP     = 17
963	IPPROTO_IPV6    = 41
964	IPPROTO_ICMPV6  = 58
965	IPPROTO_RM      = 113
966
967	SOL_SOCKET                = 0xffff
968	SO_REUSEADDR              = 4
969	SO_KEEPALIVE              = 8
970	SO_DONTROUTE              = 16
971	SO_BROADCAST              = 32
972	SO_LINGER                 = 128
973	SO_RCVBUF                 = 0x1002
974	SO_RCVTIMEO               = 0x1006
975	SO_SNDBUF                 = 0x1001
976	SO_UPDATE_ACCEPT_CONTEXT  = 0x700b
977	SO_UPDATE_CONNECT_CONTEXT = 0x7010
978
979	IOC_OUT                            = 0x40000000
980	IOC_IN                             = 0x80000000
981	IOC_VENDOR                         = 0x18000000
982	IOC_INOUT                          = IOC_IN | IOC_OUT
983	IOC_WS2                            = 0x08000000
984	SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6
985	SIO_KEEPALIVE_VALS                 = IOC_IN | IOC_VENDOR | 4
986	SIO_UDP_CONNRESET                  = IOC_IN | IOC_VENDOR | 12
987
988	// cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460
989
990	IP_TOS             = 0x3
991	IP_TTL             = 0x4
992	IP_MULTICAST_IF    = 0x9
993	IP_MULTICAST_TTL   = 0xa
994	IP_MULTICAST_LOOP  = 0xb
995	IP_ADD_MEMBERSHIP  = 0xc
996	IP_DROP_MEMBERSHIP = 0xd
997
998	IPV6_V6ONLY         = 0x1b
999	IPV6_UNICAST_HOPS   = 0x4
1000	IPV6_MULTICAST_IF   = 0x9
1001	IPV6_MULTICAST_HOPS = 0xa
1002	IPV6_MULTICAST_LOOP = 0xb
1003	IPV6_JOIN_GROUP     = 0xc
1004	IPV6_LEAVE_GROUP    = 0xd
1005
1006	MSG_OOB       = 0x1
1007	MSG_PEEK      = 0x2
1008	MSG_DONTROUTE = 0x4
1009	MSG_WAITALL   = 0x8
1010
1011	MSG_TRUNC  = 0x0100
1012	MSG_CTRUNC = 0x0200
1013	MSG_BCAST  = 0x0400
1014	MSG_MCAST  = 0x0800
1015
1016	SOMAXCONN = 0x7fffffff
1017
1018	TCP_NODELAY = 1
1019
1020	SHUT_RD   = 0
1021	SHUT_WR   = 1
1022	SHUT_RDWR = 2
1023
1024	WSADESCRIPTION_LEN = 256
1025	WSASYS_STATUS_LEN  = 128
1026)
1027
1028type WSABuf struct {
1029	Len uint32
1030	Buf *byte
1031}
1032
1033type WSAMsg struct {
1034	Name        *syscall.RawSockaddrAny
1035	Namelen     int32
1036	Buffers     *WSABuf
1037	BufferCount uint32
1038	Control     WSABuf
1039	Flags       uint32
1040}
1041
1042// Flags for WSASocket
1043const (
1044	WSA_FLAG_OVERLAPPED             = 0x01
1045	WSA_FLAG_MULTIPOINT_C_ROOT      = 0x02
1046	WSA_FLAG_MULTIPOINT_C_LEAF      = 0x04
1047	WSA_FLAG_MULTIPOINT_D_ROOT      = 0x08
1048	WSA_FLAG_MULTIPOINT_D_LEAF      = 0x10
1049	WSA_FLAG_ACCESS_SYSTEM_SECURITY = 0x40
1050	WSA_FLAG_NO_HANDLE_INHERIT      = 0x80
1051	WSA_FLAG_REGISTERED_IO          = 0x100
1052)
1053
1054// Invented values to support what package os expects.
1055const (
1056	S_IFMT   = 0x1f000
1057	S_IFIFO  = 0x1000
1058	S_IFCHR  = 0x2000
1059	S_IFDIR  = 0x4000
1060	S_IFBLK  = 0x6000
1061	S_IFREG  = 0x8000
1062	S_IFLNK  = 0xa000
1063	S_IFSOCK = 0xc000
1064	S_ISUID  = 0x800
1065	S_ISGID  = 0x400
1066	S_ISVTX  = 0x200
1067	S_IRUSR  = 0x100
1068	S_IWRITE = 0x80
1069	S_IWUSR  = 0x80
1070	S_IXUSR  = 0x40
1071)
1072
1073const (
1074	FILE_TYPE_CHAR    = 0x0002
1075	FILE_TYPE_DISK    = 0x0001
1076	FILE_TYPE_PIPE    = 0x0003
1077	FILE_TYPE_REMOTE  = 0x8000
1078	FILE_TYPE_UNKNOWN = 0x0000
1079)
1080
1081type Hostent struct {
1082	Name     *byte
1083	Aliases  **byte
1084	AddrType uint16
1085	Length   uint16
1086	AddrList **byte
1087}
1088
1089type Protoent struct {
1090	Name    *byte
1091	Aliases **byte
1092	Proto   uint16
1093}
1094
1095const (
1096	DNS_TYPE_A       = 0x0001
1097	DNS_TYPE_NS      = 0x0002
1098	DNS_TYPE_MD      = 0x0003
1099	DNS_TYPE_MF      = 0x0004
1100	DNS_TYPE_CNAME   = 0x0005
1101	DNS_TYPE_SOA     = 0x0006
1102	DNS_TYPE_MB      = 0x0007
1103	DNS_TYPE_MG      = 0x0008
1104	DNS_TYPE_MR      = 0x0009
1105	DNS_TYPE_NULL    = 0x000a
1106	DNS_TYPE_WKS     = 0x000b
1107	DNS_TYPE_PTR     = 0x000c
1108	DNS_TYPE_HINFO   = 0x000d
1109	DNS_TYPE_MINFO   = 0x000e
1110	DNS_TYPE_MX      = 0x000f
1111	DNS_TYPE_TEXT    = 0x0010
1112	DNS_TYPE_RP      = 0x0011
1113	DNS_TYPE_AFSDB   = 0x0012
1114	DNS_TYPE_X25     = 0x0013
1115	DNS_TYPE_ISDN    = 0x0014
1116	DNS_TYPE_RT      = 0x0015
1117	DNS_TYPE_NSAP    = 0x0016
1118	DNS_TYPE_NSAPPTR = 0x0017
1119	DNS_TYPE_SIG     = 0x0018
1120	DNS_TYPE_KEY     = 0x0019
1121	DNS_TYPE_PX      = 0x001a
1122	DNS_TYPE_GPOS    = 0x001b
1123	DNS_TYPE_AAAA    = 0x001c
1124	DNS_TYPE_LOC     = 0x001d
1125	DNS_TYPE_NXT     = 0x001e
1126	DNS_TYPE_EID     = 0x001f
1127	DNS_TYPE_NIMLOC  = 0x0020
1128	DNS_TYPE_SRV     = 0x0021
1129	DNS_TYPE_ATMA    = 0x0022
1130	DNS_TYPE_NAPTR   = 0x0023
1131	DNS_TYPE_KX      = 0x0024
1132	DNS_TYPE_CERT    = 0x0025
1133	DNS_TYPE_A6      = 0x0026
1134	DNS_TYPE_DNAME   = 0x0027
1135	DNS_TYPE_SINK    = 0x0028
1136	DNS_TYPE_OPT     = 0x0029
1137	DNS_TYPE_DS      = 0x002B
1138	DNS_TYPE_RRSIG   = 0x002E
1139	DNS_TYPE_NSEC    = 0x002F
1140	DNS_TYPE_DNSKEY  = 0x0030
1141	DNS_TYPE_DHCID   = 0x0031
1142	DNS_TYPE_UINFO   = 0x0064
1143	DNS_TYPE_UID     = 0x0065
1144	DNS_TYPE_GID     = 0x0066
1145	DNS_TYPE_UNSPEC  = 0x0067
1146	DNS_TYPE_ADDRS   = 0x00f8
1147	DNS_TYPE_TKEY    = 0x00f9
1148	DNS_TYPE_TSIG    = 0x00fa
1149	DNS_TYPE_IXFR    = 0x00fb
1150	DNS_TYPE_AXFR    = 0x00fc
1151	DNS_TYPE_MAILB   = 0x00fd
1152	DNS_TYPE_MAILA   = 0x00fe
1153	DNS_TYPE_ALL     = 0x00ff
1154	DNS_TYPE_ANY     = 0x00ff
1155	DNS_TYPE_WINS    = 0xff01
1156	DNS_TYPE_WINSR   = 0xff02
1157	DNS_TYPE_NBSTAT  = 0xff01
1158)
1159
1160const (
1161	// flags inside DNSRecord.Dw
1162	DnsSectionQuestion   = 0x0000
1163	DnsSectionAnswer     = 0x0001
1164	DnsSectionAuthority  = 0x0002
1165	DnsSectionAdditional = 0x0003
1166)
1167
1168type DNSSRVData struct {
1169	Target   *uint16
1170	Priority uint16
1171	Weight   uint16
1172	Port     uint16
1173	Pad      uint16
1174}
1175
1176type DNSPTRData struct {
1177	Host *uint16
1178}
1179
1180type DNSMXData struct {
1181	NameExchange *uint16
1182	Preference   uint16
1183	Pad          uint16
1184}
1185
1186type DNSTXTData struct {
1187	StringCount uint16
1188	StringArray [1]*uint16
1189}
1190
1191type DNSRecord struct {
1192	Next     *DNSRecord
1193	Name     *uint16
1194	Type     uint16
1195	Length   uint16
1196	Dw       uint32
1197	Ttl      uint32
1198	Reserved uint32
1199	Data     [40]byte
1200}
1201
1202const (
1203	TF_DISCONNECT         = 1
1204	TF_REUSE_SOCKET       = 2
1205	TF_WRITE_BEHIND       = 4
1206	TF_USE_DEFAULT_WORKER = 0
1207	TF_USE_SYSTEM_THREAD  = 16
1208	TF_USE_KERNEL_APC     = 32
1209)
1210
1211type TransmitFileBuffers struct {
1212	Head       uintptr
1213	HeadLength uint32
1214	Tail       uintptr
1215	TailLength uint32
1216}
1217
1218const (
1219	IFF_UP           = 1
1220	IFF_BROADCAST    = 2
1221	IFF_LOOPBACK     = 4
1222	IFF_POINTTOPOINT = 8
1223	IFF_MULTICAST    = 16
1224)
1225
1226const SIO_GET_INTERFACE_LIST = 0x4004747F
1227
1228// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old.
1229// will be fixed to change variable type as suitable.
1230
1231type SockaddrGen [24]byte
1232
1233type InterfaceInfo struct {
1234	Flags            uint32
1235	Address          SockaddrGen
1236	BroadcastAddress SockaddrGen
1237	Netmask          SockaddrGen
1238}
1239
1240type IpAddressString struct {
1241	String [16]byte
1242}
1243
1244type IpMaskString IpAddressString
1245
1246type IpAddrString struct {
1247	Next      *IpAddrString
1248	IpAddress IpAddressString
1249	IpMask    IpMaskString
1250	Context   uint32
1251}
1252
1253const MAX_ADAPTER_NAME_LENGTH = 256
1254const MAX_ADAPTER_DESCRIPTION_LENGTH = 128
1255const MAX_ADAPTER_ADDRESS_LENGTH = 8
1256
1257type IpAdapterInfo struct {
1258	Next                *IpAdapterInfo
1259	ComboIndex          uint32
1260	AdapterName         [MAX_ADAPTER_NAME_LENGTH + 4]byte
1261	Description         [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte
1262	AddressLength       uint32
1263	Address             [MAX_ADAPTER_ADDRESS_LENGTH]byte
1264	Index               uint32
1265	Type                uint32
1266	DhcpEnabled         uint32
1267	CurrentIpAddress    *IpAddrString
1268	IpAddressList       IpAddrString
1269	GatewayList         IpAddrString
1270	DhcpServer          IpAddrString
1271	HaveWins            bool
1272	PrimaryWinsServer   IpAddrString
1273	SecondaryWinsServer IpAddrString
1274	LeaseObtained       int64
1275	LeaseExpires        int64
1276}
1277
1278const MAXLEN_PHYSADDR = 8
1279const MAX_INTERFACE_NAME_LEN = 256
1280const MAXLEN_IFDESCR = 256
1281
1282type MibIfRow struct {
1283	Name            [MAX_INTERFACE_NAME_LEN]uint16
1284	Index           uint32
1285	Type            uint32
1286	Mtu             uint32
1287	Speed           uint32
1288	PhysAddrLen     uint32
1289	PhysAddr        [MAXLEN_PHYSADDR]byte
1290	AdminStatus     uint32
1291	OperStatus      uint32
1292	LastChange      uint32
1293	InOctets        uint32
1294	InUcastPkts     uint32
1295	InNUcastPkts    uint32
1296	InDiscards      uint32
1297	InErrors        uint32
1298	InUnknownProtos uint32
1299	OutOctets       uint32
1300	OutUcastPkts    uint32
1301	OutNUcastPkts   uint32
1302	OutDiscards     uint32
1303	OutErrors       uint32
1304	OutQLen         uint32
1305	DescrLen        uint32
1306	Descr           [MAXLEN_IFDESCR]byte
1307}
1308
1309type CertInfo struct {
1310	Version              uint32
1311	SerialNumber         CryptIntegerBlob
1312	SignatureAlgorithm   CryptAlgorithmIdentifier
1313	Issuer               CertNameBlob
1314	NotBefore            Filetime
1315	NotAfter             Filetime
1316	Subject              CertNameBlob
1317	SubjectPublicKeyInfo CertPublicKeyInfo
1318	IssuerUniqueId       CryptBitBlob
1319	SubjectUniqueId      CryptBitBlob
1320	CountExtensions      uint32
1321	Extensions           *CertExtension
1322}
1323
1324type CertExtension struct {
1325	ObjId    *byte
1326	Critical int32
1327	Value    CryptObjidBlob
1328}
1329
1330type CryptAlgorithmIdentifier struct {
1331	ObjId      *byte
1332	Parameters CryptObjidBlob
1333}
1334
1335type CertPublicKeyInfo struct {
1336	Algorithm CryptAlgorithmIdentifier
1337	PublicKey CryptBitBlob
1338}
1339
1340type DataBlob struct {
1341	Size uint32
1342	Data *byte
1343}
1344type CryptIntegerBlob DataBlob
1345type CryptUintBlob DataBlob
1346type CryptObjidBlob DataBlob
1347type CertNameBlob DataBlob
1348type CertRdnValueBlob DataBlob
1349type CertBlob DataBlob
1350type CrlBlob DataBlob
1351type CryptDataBlob DataBlob
1352type CryptHashBlob DataBlob
1353type CryptDigestBlob DataBlob
1354type CryptDerBlob DataBlob
1355type CryptAttrBlob DataBlob
1356
1357type CryptBitBlob struct {
1358	Size       uint32
1359	Data       *byte
1360	UnusedBits uint32
1361}
1362
1363type CertContext struct {
1364	EncodingType uint32
1365	EncodedCert  *byte
1366	Length       uint32
1367	CertInfo     *CertInfo
1368	Store        Handle
1369}
1370
1371type CertChainContext struct {
1372	Size                       uint32
1373	TrustStatus                CertTrustStatus
1374	ChainCount                 uint32
1375	Chains                     **CertSimpleChain
1376	LowerQualityChainCount     uint32
1377	LowerQualityChains         **CertChainContext
1378	HasRevocationFreshnessTime uint32
1379	RevocationFreshnessTime    uint32
1380}
1381
1382type CertTrustListInfo struct {
1383	// Not implemented
1384}
1385
1386type CertSimpleChain struct {
1387	Size                       uint32
1388	TrustStatus                CertTrustStatus
1389	NumElements                uint32
1390	Elements                   **CertChainElement
1391	TrustListInfo              *CertTrustListInfo
1392	HasRevocationFreshnessTime uint32
1393	RevocationFreshnessTime    uint32
1394}
1395
1396type CertChainElement struct {
1397	Size              uint32
1398	CertContext       *CertContext
1399	TrustStatus       CertTrustStatus
1400	RevocationInfo    *CertRevocationInfo
1401	IssuanceUsage     *CertEnhKeyUsage
1402	ApplicationUsage  *CertEnhKeyUsage
1403	ExtendedErrorInfo *uint16
1404}
1405
1406type CertRevocationCrlInfo struct {
1407	// Not implemented
1408}
1409
1410type CertRevocationInfo struct {
1411	Size             uint32
1412	RevocationResult uint32
1413	RevocationOid    *byte
1414	OidSpecificInfo  Pointer
1415	HasFreshnessTime uint32
1416	FreshnessTime    uint32
1417	CrlInfo          *CertRevocationCrlInfo
1418}
1419
1420type CertTrustStatus struct {
1421	ErrorStatus uint32
1422	InfoStatus  uint32
1423}
1424
1425type CertUsageMatch struct {
1426	Type  uint32
1427	Usage CertEnhKeyUsage
1428}
1429
1430type CertEnhKeyUsage struct {
1431	Length           uint32
1432	UsageIdentifiers **byte
1433}
1434
1435type CertChainPara struct {
1436	Size                         uint32
1437	RequestedUsage               CertUsageMatch
1438	RequstedIssuancePolicy       CertUsageMatch
1439	URLRetrievalTimeout          uint32
1440	CheckRevocationFreshnessTime uint32
1441	RevocationFreshnessTime      uint32
1442	CacheResync                  *Filetime
1443}
1444
1445type CertChainPolicyPara struct {
1446	Size            uint32
1447	Flags           uint32
1448	ExtraPolicyPara Pointer
1449}
1450
1451type SSLExtraCertChainPolicyPara struct {
1452	Size       uint32
1453	AuthType   uint32
1454	Checks     uint32
1455	ServerName *uint16
1456}
1457
1458type CertChainPolicyStatus struct {
1459	Size              uint32
1460	Error             uint32
1461	ChainIndex        uint32
1462	ElementIndex      uint32
1463	ExtraPolicyStatus Pointer
1464}
1465
1466type CertPolicyInfo struct {
1467	Identifier      *byte
1468	CountQualifiers uint32
1469	Qualifiers      *CertPolicyQualifierInfo
1470}
1471
1472type CertPoliciesInfo struct {
1473	Count       uint32
1474	PolicyInfos *CertPolicyInfo
1475}
1476
1477type CertPolicyQualifierInfo struct {
1478	// Not implemented
1479}
1480
1481type CertStrongSignPara struct {
1482	Size                      uint32
1483	InfoChoice                uint32
1484	InfoOrSerializedInfoOrOID unsafe.Pointer
1485}
1486
1487type CryptProtectPromptStruct struct {
1488	Size        uint32
1489	PromptFlags uint32
1490	App         HWND
1491	Prompt      *uint16
1492}
1493
1494type CertChainFindByIssuerPara struct {
1495	Size                   uint32
1496	UsageIdentifier        *byte
1497	KeySpec                uint32
1498	AcquirePrivateKeyFlags uint32
1499	IssuerCount            uint32
1500	Issuer                 Pointer
1501	FindCallback           Pointer
1502	FindArg                Pointer
1503	IssuerChainIndex       *uint32
1504	IssuerElementIndex     *uint32
1505}
1506
1507type WinTrustData struct {
1508	Size                            uint32
1509	PolicyCallbackData              uintptr
1510	SIPClientData                   uintptr
1511	UIChoice                        uint32
1512	RevocationChecks                uint32
1513	UnionChoice                     uint32
1514	FileOrCatalogOrBlobOrSgnrOrCert unsafe.Pointer
1515	StateAction                     uint32
1516	StateData                       Handle
1517	URLReference                    *uint16
1518	ProvFlags                       uint32
1519	UIContext                       uint32
1520	SignatureSettings               *WinTrustSignatureSettings
1521}
1522
1523type WinTrustFileInfo struct {
1524	Size         uint32
1525	FilePath     *uint16
1526	File         Handle
1527	KnownSubject *GUID
1528}
1529
1530type WinTrustSignatureSettings struct {
1531	Size             uint32
1532	Index            uint32
1533	Flags            uint32
1534	SecondarySigs    uint32
1535	VerifiedSigIndex uint32
1536	CryptoPolicy     *CertStrongSignPara
1537}
1538
1539const (
1540	// do not reorder
1541	HKEY_CLASSES_ROOT = 0x80000000 + iota
1542	HKEY_CURRENT_USER
1543	HKEY_LOCAL_MACHINE
1544	HKEY_USERS
1545	HKEY_PERFORMANCE_DATA
1546	HKEY_CURRENT_CONFIG
1547	HKEY_DYN_DATA
1548
1549	KEY_QUERY_VALUE        = 1
1550	KEY_SET_VALUE          = 2
1551	KEY_CREATE_SUB_KEY     = 4
1552	KEY_ENUMERATE_SUB_KEYS = 8
1553	KEY_NOTIFY             = 16
1554	KEY_CREATE_LINK        = 32
1555	KEY_WRITE              = 0x20006
1556	KEY_EXECUTE            = 0x20019
1557	KEY_READ               = 0x20019
1558	KEY_WOW64_64KEY        = 0x0100
1559	KEY_WOW64_32KEY        = 0x0200
1560	KEY_ALL_ACCESS         = 0xf003f
1561)
1562
1563const (
1564	// do not reorder
1565	REG_NONE = iota
1566	REG_SZ
1567	REG_EXPAND_SZ
1568	REG_BINARY
1569	REG_DWORD_LITTLE_ENDIAN
1570	REG_DWORD_BIG_ENDIAN
1571	REG_LINK
1572	REG_MULTI_SZ
1573	REG_RESOURCE_LIST
1574	REG_FULL_RESOURCE_DESCRIPTOR
1575	REG_RESOURCE_REQUIREMENTS_LIST
1576	REG_QWORD_LITTLE_ENDIAN
1577	REG_DWORD = REG_DWORD_LITTLE_ENDIAN
1578	REG_QWORD = REG_QWORD_LITTLE_ENDIAN
1579)
1580
1581const (
1582	EVENT_MODIFY_STATE = 0x0002
1583	EVENT_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3
1584
1585	MUTANT_QUERY_STATE = 0x0001
1586	MUTANT_ALL_ACCESS  = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MUTANT_QUERY_STATE
1587
1588	SEMAPHORE_MODIFY_STATE = 0x0002
1589	SEMAPHORE_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3
1590
1591	TIMER_QUERY_STATE  = 0x0001
1592	TIMER_MODIFY_STATE = 0x0002
1593	TIMER_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | TIMER_QUERY_STATE | TIMER_MODIFY_STATE
1594
1595	MUTEX_MODIFY_STATE = MUTANT_QUERY_STATE
1596	MUTEX_ALL_ACCESS   = MUTANT_ALL_ACCESS
1597
1598	CREATE_EVENT_MANUAL_RESET  = 0x1
1599	CREATE_EVENT_INITIAL_SET   = 0x2
1600	CREATE_MUTEX_INITIAL_OWNER = 0x1
1601)
1602
1603type AddrinfoW struct {
1604	Flags     int32
1605	Family    int32
1606	Socktype  int32
1607	Protocol  int32
1608	Addrlen   uintptr
1609	Canonname *uint16
1610	Addr      uintptr
1611	Next      *AddrinfoW
1612}
1613
1614const (
1615	AI_PASSIVE     = 1
1616	AI_CANONNAME   = 2
1617	AI_NUMERICHOST = 4
1618)
1619
1620type GUID struct {
1621	Data1 uint32
1622	Data2 uint16
1623	Data3 uint16
1624	Data4 [8]byte
1625}
1626
1627var WSAID_CONNECTEX = GUID{
1628	0x25a207b9,
1629	0xddf3,
1630	0x4660,
1631	[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
1632}
1633
1634var WSAID_WSASENDMSG = GUID{
1635	0xa441e712,
1636	0x754f,
1637	0x43ca,
1638	[8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},
1639}
1640
1641var WSAID_WSARECVMSG = GUID{
1642	0xf689d7c8,
1643	0x6f1f,
1644	0x436b,
1645	[8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},
1646}
1647
1648const (
1649	FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
1650	FILE_SKIP_SET_EVENT_ON_HANDLE        = 2
1651)
1652
1653const (
1654	WSAPROTOCOL_LEN    = 255
1655	MAX_PROTOCOL_CHAIN = 7
1656	BASE_PROTOCOL      = 1
1657	LAYERED_PROTOCOL   = 0
1658
1659	XP1_CONNECTIONLESS           = 0x00000001
1660	XP1_GUARANTEED_DELIVERY      = 0x00000002
1661	XP1_GUARANTEED_ORDER         = 0x00000004
1662	XP1_MESSAGE_ORIENTED         = 0x00000008
1663	XP1_PSEUDO_STREAM            = 0x00000010
1664	XP1_GRACEFUL_CLOSE           = 0x00000020
1665	XP1_EXPEDITED_DATA           = 0x00000040
1666	XP1_CONNECT_DATA             = 0x00000080
1667	XP1_DISCONNECT_DATA          = 0x00000100
1668	XP1_SUPPORT_BROADCAST        = 0x00000200
1669	XP1_SUPPORT_MULTIPOINT       = 0x00000400
1670	XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800
1671	XP1_MULTIPOINT_DATA_PLANE    = 0x00001000
1672	XP1_QOS_SUPPORTED            = 0x00002000
1673	XP1_UNI_SEND                 = 0x00008000
1674	XP1_UNI_RECV                 = 0x00010000
1675	XP1_IFS_HANDLES              = 0x00020000
1676	XP1_PARTIAL_MESSAGE          = 0x00040000
1677	XP1_SAN_SUPPORT_SDP          = 0x00080000
1678
1679	PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001
1680	PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002
1681	PFL_HIDDEN                  = 0x00000004
1682	PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008
1683	PFL_NETWORKDIRECT_PROVIDER  = 0x00000010
1684)
1685
1686type WSAProtocolInfo struct {
1687	ServiceFlags1     uint32
1688	ServiceFlags2     uint32
1689	ServiceFlags3     uint32
1690	ServiceFlags4     uint32
1691	ProviderFlags     uint32
1692	ProviderId        GUID
1693	CatalogEntryId    uint32
1694	ProtocolChain     WSAProtocolChain
1695	Version           int32
1696	AddressFamily     int32
1697	MaxSockAddr       int32
1698	MinSockAddr       int32
1699	SocketType        int32
1700	Protocol          int32
1701	ProtocolMaxOffset int32
1702	NetworkByteOrder  int32
1703	SecurityScheme    int32
1704	MessageSize       uint32
1705	ProviderReserved  uint32
1706	ProtocolName      [WSAPROTOCOL_LEN + 1]uint16
1707}
1708
1709type WSAProtocolChain struct {
1710	ChainLen     int32
1711	ChainEntries [MAX_PROTOCOL_CHAIN]uint32
1712}
1713
1714type TCPKeepalive struct {
1715	OnOff    uint32
1716	Time     uint32
1717	Interval uint32
1718}
1719
1720type symbolicLinkReparseBuffer struct {
1721	SubstituteNameOffset uint16
1722	SubstituteNameLength uint16
1723	PrintNameOffset      uint16
1724	PrintNameLength      uint16
1725	Flags                uint32
1726	PathBuffer           [1]uint16
1727}
1728
1729type mountPointReparseBuffer struct {
1730	SubstituteNameOffset uint16
1731	SubstituteNameLength uint16
1732	PrintNameOffset      uint16
1733	PrintNameLength      uint16
1734	PathBuffer           [1]uint16
1735}
1736
1737type reparseDataBuffer struct {
1738	ReparseTag        uint32
1739	ReparseDataLength uint16
1740	Reserved          uint16
1741
1742	// GenericReparseBuffer
1743	reparseBuffer byte
1744}
1745
1746const (
1747	FSCTL_GET_REPARSE_POINT          = 0x900A8
1748	MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024
1749	IO_REPARSE_TAG_MOUNT_POINT       = 0xA0000003
1750	IO_REPARSE_TAG_SYMLINK           = 0xA000000C
1751	SYMBOLIC_LINK_FLAG_DIRECTORY     = 0x1
1752)
1753
1754const (
1755	ComputerNameNetBIOS                   = 0
1756	ComputerNameDnsHostname               = 1
1757	ComputerNameDnsDomain                 = 2
1758	ComputerNameDnsFullyQualified         = 3
1759	ComputerNamePhysicalNetBIOS           = 4
1760	ComputerNamePhysicalDnsHostname       = 5
1761	ComputerNamePhysicalDnsDomain         = 6
1762	ComputerNamePhysicalDnsFullyQualified = 7
1763	ComputerNameMax                       = 8
1764)
1765
1766// For MessageBox()
1767const (
1768	MB_OK                   = 0x00000000
1769	MB_OKCANCEL             = 0x00000001
1770	MB_ABORTRETRYIGNORE     = 0x00000002
1771	MB_YESNOCANCEL          = 0x00000003
1772	MB_YESNO                = 0x00000004
1773	MB_RETRYCANCEL          = 0x00000005
1774	MB_CANCELTRYCONTINUE    = 0x00000006
1775	MB_ICONHAND             = 0x00000010
1776	MB_ICONQUESTION         = 0x00000020
1777	MB_ICONEXCLAMATION      = 0x00000030
1778	MB_ICONASTERISK         = 0x00000040
1779	MB_USERICON             = 0x00000080
1780	MB_ICONWARNING          = MB_ICONEXCLAMATION
1781	MB_ICONERROR            = MB_ICONHAND
1782	MB_ICONINFORMATION      = MB_ICONASTERISK
1783	MB_ICONSTOP             = MB_ICONHAND
1784	MB_DEFBUTTON1           = 0x00000000
1785	MB_DEFBUTTON2           = 0x00000100
1786	MB_DEFBUTTON3           = 0x00000200
1787	MB_DEFBUTTON4           = 0x00000300
1788	MB_APPLMODAL            = 0x00000000
1789	MB_SYSTEMMODAL          = 0x00001000
1790	MB_TASKMODAL            = 0x00002000
1791	MB_HELP                 = 0x00004000
1792	MB_NOFOCUS              = 0x00008000
1793	MB_SETFOREGROUND        = 0x00010000
1794	MB_DEFAULT_DESKTOP_ONLY = 0x00020000
1795	MB_TOPMOST              = 0x00040000
1796	MB_RIGHT                = 0x00080000
1797	MB_RTLREADING           = 0x00100000
1798	MB_SERVICE_NOTIFICATION = 0x00200000
1799)
1800
1801const (
1802	MOVEFILE_REPLACE_EXISTING      = 0x1
1803	MOVEFILE_COPY_ALLOWED          = 0x2
1804	MOVEFILE_DELAY_UNTIL_REBOOT    = 0x4
1805	MOVEFILE_WRITE_THROUGH         = 0x8
1806	MOVEFILE_CREATE_HARDLINK       = 0x10
1807	MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
1808)
1809
1810const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
1811
1812const (
1813	IF_TYPE_OTHER              = 1
1814	IF_TYPE_ETHERNET_CSMACD    = 6
1815	IF_TYPE_ISO88025_TOKENRING = 9
1816	IF_TYPE_PPP                = 23
1817	IF_TYPE_SOFTWARE_LOOPBACK  = 24
1818	IF_TYPE_ATM                = 37
1819	IF_TYPE_IEEE80211          = 71
1820	IF_TYPE_TUNNEL             = 131
1821	IF_TYPE_IEEE1394           = 144
1822)
1823
1824type SocketAddress struct {
1825	Sockaddr       *syscall.RawSockaddrAny
1826	SockaddrLength int32
1827}
1828
1829// IP returns an IPv4 or IPv6 address, or nil if the underlying SocketAddress is neither.
1830func (addr *SocketAddress) IP() net.IP {
1831	if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet4{}) && addr.Sockaddr.Addr.Family == AF_INET {
1832		return (*RawSockaddrInet4)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
1833	} else if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet6{}) && addr.Sockaddr.Addr.Family == AF_INET6 {
1834		return (*RawSockaddrInet6)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
1835	}
1836	return nil
1837}
1838
1839type IpAdapterUnicastAddress struct {
1840	Length             uint32
1841	Flags              uint32
1842	Next               *IpAdapterUnicastAddress
1843	Address            SocketAddress
1844	PrefixOrigin       int32
1845	SuffixOrigin       int32
1846	DadState           int32
1847	ValidLifetime      uint32
1848	PreferredLifetime  uint32
1849	LeaseLifetime      uint32
1850	OnLinkPrefixLength uint8
1851}
1852
1853type IpAdapterAnycastAddress struct {
1854	Length  uint32
1855	Flags   uint32
1856	Next    *IpAdapterAnycastAddress
1857	Address SocketAddress
1858}
1859
1860type IpAdapterMulticastAddress struct {
1861	Length  uint32
1862	Flags   uint32
1863	Next    *IpAdapterMulticastAddress
1864	Address SocketAddress
1865}
1866
1867type IpAdapterDnsServerAdapter struct {
1868	Length   uint32
1869	Reserved uint32
1870	Next     *IpAdapterDnsServerAdapter
1871	Address  SocketAddress
1872}
1873
1874type IpAdapterPrefix struct {
1875	Length       uint32
1876	Flags        uint32
1877	Next         *IpAdapterPrefix
1878	Address      SocketAddress
1879	PrefixLength uint32
1880}
1881
1882type IpAdapterAddresses struct {
1883	Length                uint32
1884	IfIndex               uint32
1885	Next                  *IpAdapterAddresses
1886	AdapterName           *byte
1887	FirstUnicastAddress   *IpAdapterUnicastAddress
1888	FirstAnycastAddress   *IpAdapterAnycastAddress
1889	FirstMulticastAddress *IpAdapterMulticastAddress
1890	FirstDnsServerAddress *IpAdapterDnsServerAdapter
1891	DnsSuffix             *uint16
1892	Description           *uint16
1893	FriendlyName          *uint16
1894	PhysicalAddress       [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
1895	PhysicalAddressLength uint32
1896	Flags                 uint32
1897	Mtu                   uint32
1898	IfType                uint32
1899	OperStatus            uint32
1900	Ipv6IfIndex           uint32
1901	ZoneIndices           [16]uint32
1902	FirstPrefix           *IpAdapterPrefix
1903	/* more fields might be present here. */
1904}
1905
1906const (
1907	IfOperStatusUp             = 1
1908	IfOperStatusDown           = 2
1909	IfOperStatusTesting        = 3
1910	IfOperStatusUnknown        = 4
1911	IfOperStatusDormant        = 5
1912	IfOperStatusNotPresent     = 6
1913	IfOperStatusLowerLayerDown = 7
1914)
1915
1916// Console related constants used for the mode parameter to SetConsoleMode. See
1917// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
1918
1919const (
1920	ENABLE_PROCESSED_INPUT        = 0x1
1921	ENABLE_LINE_INPUT             = 0x2
1922	ENABLE_ECHO_INPUT             = 0x4
1923	ENABLE_WINDOW_INPUT           = 0x8
1924	ENABLE_MOUSE_INPUT            = 0x10
1925	ENABLE_INSERT_MODE            = 0x20
1926	ENABLE_QUICK_EDIT_MODE        = 0x40
1927	ENABLE_EXTENDED_FLAGS         = 0x80
1928	ENABLE_AUTO_POSITION          = 0x100
1929	ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200
1930
1931	ENABLE_PROCESSED_OUTPUT            = 0x1
1932	ENABLE_WRAP_AT_EOL_OUTPUT          = 0x2
1933	ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
1934	DISABLE_NEWLINE_AUTO_RETURN        = 0x8
1935	ENABLE_LVB_GRID_WORLDWIDE          = 0x10
1936)
1937
1938type Coord struct {
1939	X int16
1940	Y int16
1941}
1942
1943type SmallRect struct {
1944	Left   int16
1945	Top    int16
1946	Right  int16
1947	Bottom int16
1948}
1949
1950// Used with GetConsoleScreenBuffer to retrieve information about a console
1951// screen buffer. See
1952// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str
1953// for details.
1954
1955type ConsoleScreenBufferInfo struct {
1956	Size              Coord
1957	CursorPosition    Coord
1958	Attributes        uint16
1959	Window            SmallRect
1960	MaximumWindowSize Coord
1961}
1962
1963const UNIX_PATH_MAX = 108 // defined in afunix.h
1964
1965const (
1966	// flags for JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags
1967	JOB_OBJECT_LIMIT_ACTIVE_PROCESS             = 0x00000008
1968	JOB_OBJECT_LIMIT_AFFINITY                   = 0x00000010
1969	JOB_OBJECT_LIMIT_BREAKAWAY_OK               = 0x00000800
1970	JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400
1971	JOB_OBJECT_LIMIT_JOB_MEMORY                 = 0x00000200
1972	JOB_OBJECT_LIMIT_JOB_TIME                   = 0x00000004
1973	JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE          = 0x00002000
1974	JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME          = 0x00000040
1975	JOB_OBJECT_LIMIT_PRIORITY_CLASS             = 0x00000020
1976	JOB_OBJECT_LIMIT_PROCESS_MEMORY             = 0x00000100
1977	JOB_OBJECT_LIMIT_PROCESS_TIME               = 0x00000002
1978	JOB_OBJECT_LIMIT_SCHEDULING_CLASS           = 0x00000080
1979	JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK        = 0x00001000
1980	JOB_OBJECT_LIMIT_SUBSET_AFFINITY            = 0x00004000
1981	JOB_OBJECT_LIMIT_WORKINGSET                 = 0x00000001
1982)
1983
1984type IO_COUNTERS struct {
1985	ReadOperationCount  uint64
1986	WriteOperationCount uint64
1987	OtherOperationCount uint64
1988	ReadTransferCount   uint64
1989	WriteTransferCount  uint64
1990	OtherTransferCount  uint64
1991}
1992
1993type JOBOBJECT_EXTENDED_LIMIT_INFORMATION struct {
1994	BasicLimitInformation JOBOBJECT_BASIC_LIMIT_INFORMATION
1995	IoInfo                IO_COUNTERS
1996	ProcessMemoryLimit    uintptr
1997	JobMemoryLimit        uintptr
1998	PeakProcessMemoryUsed uintptr
1999	PeakJobMemoryUsed     uintptr
2000}
2001
2002const (
2003	// UIRestrictionsClass
2004	JOB_OBJECT_UILIMIT_DESKTOP          = 0x00000040
2005	JOB_OBJECT_UILIMIT_DISPLAYSETTINGS  = 0x00000010
2006	JOB_OBJECT_UILIMIT_EXITWINDOWS      = 0x00000080
2007	JOB_OBJECT_UILIMIT_GLOBALATOMS      = 0x00000020
2008	JOB_OBJECT_UILIMIT_HANDLES          = 0x00000001
2009	JOB_OBJECT_UILIMIT_READCLIPBOARD    = 0x00000002
2010	JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x00000008
2011	JOB_OBJECT_UILIMIT_WRITECLIPBOARD   = 0x00000004
2012)
2013
2014type JOBOBJECT_BASIC_UI_RESTRICTIONS struct {
2015	UIRestrictionsClass uint32
2016}
2017
2018const (
2019	// JobObjectInformationClass
2020	JobObjectAssociateCompletionPortInformation = 7
2021	JobObjectBasicLimitInformation              = 2
2022	JobObjectBasicUIRestrictions                = 4
2023	JobObjectCpuRateControlInformation          = 15
2024	JobObjectEndOfJobTimeInformation            = 6
2025	JobObjectExtendedLimitInformation           = 9
2026	JobObjectGroupInformation                   = 11
2027	JobObjectGroupInformationEx                 = 14
2028	JobObjectLimitViolationInformation2         = 35
2029	JobObjectNetRateControlInformation          = 32
2030	JobObjectNotificationLimitInformation       = 12
2031	JobObjectNotificationLimitInformation2      = 34
2032	JobObjectSecurityLimitInformation           = 5
2033)
2034
2035const (
2036	KF_FLAG_DEFAULT                          = 0x00000000
2037	KF_FLAG_FORCE_APP_DATA_REDIRECTION       = 0x00080000
2038	KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET = 0x00040000
2039	KF_FLAG_FORCE_PACKAGE_REDIRECTION        = 0x00020000
2040	KF_FLAG_NO_PACKAGE_REDIRECTION           = 0x00010000
2041	KF_FLAG_FORCE_APPCONTAINER_REDIRECTION   = 0x00020000
2042	KF_FLAG_NO_APPCONTAINER_REDIRECTION      = 0x00010000
2043	KF_FLAG_CREATE                           = 0x00008000
2044	KF_FLAG_DONT_VERIFY                      = 0x00004000
2045	KF_FLAG_DONT_UNEXPAND                    = 0x00002000
2046	KF_FLAG_NO_ALIAS                         = 0x00001000
2047	KF_FLAG_INIT                             = 0x00000800
2048	KF_FLAG_DEFAULT_PATH                     = 0x00000400
2049	KF_FLAG_NOT_PARENT_RELATIVE              = 0x00000200
2050	KF_FLAG_SIMPLE_IDLIST                    = 0x00000100
2051	KF_FLAG_ALIAS_ONLY                       = 0x80000000
2052)
2053
2054type OsVersionInfoEx struct {
2055	osVersionInfoSize uint32
2056	MajorVersion      uint32
2057	MinorVersion      uint32
2058	BuildNumber       uint32
2059	PlatformId        uint32
2060	CsdVersion        [128]uint16
2061	ServicePackMajor  uint16
2062	ServicePackMinor  uint16
2063	SuiteMask         uint16
2064	ProductType       byte
2065	_                 byte
2066}
2067
2068const (
2069	EWX_LOGOFF          = 0x00000000
2070	EWX_SHUTDOWN        = 0x00000001
2071	EWX_REBOOT          = 0x00000002
2072	EWX_FORCE           = 0x00000004
2073	EWX_POWEROFF        = 0x00000008
2074	EWX_FORCEIFHUNG     = 0x00000010
2075	EWX_QUICKRESOLVE    = 0x00000020
2076	EWX_RESTARTAPPS     = 0x00000040
2077	EWX_HYBRID_SHUTDOWN = 0x00400000
2078	EWX_BOOTOPTIONS     = 0x01000000
2079
2080	SHTDN_REASON_FLAG_COMMENT_REQUIRED          = 0x01000000
2081	SHTDN_REASON_FLAG_DIRTY_PROBLEM_ID_REQUIRED = 0x02000000
2082	SHTDN_REASON_FLAG_CLEAN_UI                  = 0x04000000
2083	SHTDN_REASON_FLAG_DIRTY_UI                  = 0x08000000
2084	SHTDN_REASON_FLAG_USER_DEFINED              = 0x40000000
2085	SHTDN_REASON_FLAG_PLANNED                   = 0x80000000
2086	SHTDN_REASON_MAJOR_OTHER                    = 0x00000000
2087	SHTDN_REASON_MAJOR_NONE                     = 0x00000000
2088	SHTDN_REASON_MAJOR_HARDWARE                 = 0x00010000
2089	SHTDN_REASON_MAJOR_OPERATINGSYSTEM          = 0x00020000
2090	SHTDN_REASON_MAJOR_SOFTWARE                 = 0x00030000
2091	SHTDN_REASON_MAJOR_APPLICATION              = 0x00040000
2092	SHTDN_REASON_MAJOR_SYSTEM                   = 0x00050000
2093	SHTDN_REASON_MAJOR_POWER                    = 0x00060000
2094	SHTDN_REASON_MAJOR_LEGACY_API               = 0x00070000
2095	SHTDN_REASON_MINOR_OTHER                    = 0x00000000
2096	SHTDN_REASON_MINOR_NONE                     = 0x000000ff
2097	SHTDN_REASON_MINOR_MAINTENANCE              = 0x00000001
2098	SHTDN_REASON_MINOR_INSTALLATION             = 0x00000002
2099	SHTDN_REASON_MINOR_UPGRADE                  = 0x00000003
2100	SHTDN_REASON_MINOR_RECONFIG                 = 0x00000004
2101	SHTDN_REASON_MINOR_HUNG                     = 0x00000005
2102	SHTDN_REASON_MINOR_UNSTABLE                 = 0x00000006
2103	SHTDN_REASON_MINOR_DISK                     = 0x00000007
2104	SHTDN_REASON_MINOR_PROCESSOR                = 0x00000008
2105	SHTDN_REASON_MINOR_NETWORKCARD              = 0x00000009
2106	SHTDN_REASON_MINOR_POWER_SUPPLY             = 0x0000000a
2107	SHTDN_REASON_MINOR_CORDUNPLUGGED            = 0x0000000b
2108	SHTDN_REASON_MINOR_ENVIRONMENT              = 0x0000000c
2109	SHTDN_REASON_MINOR_HARDWARE_DRIVER          = 0x0000000d
2110	SHTDN_REASON_MINOR_OTHERDRIVER              = 0x0000000e
2111	SHTDN_REASON_MINOR_BLUESCREEN               = 0x0000000F
2112	SHTDN_REASON_MINOR_SERVICEPACK              = 0x00000010
2113	SHTDN_REASON_MINOR_HOTFIX                   = 0x00000011
2114	SHTDN_REASON_MINOR_SECURITYFIX              = 0x00000012
2115	SHTDN_REASON_MINOR_SECURITY                 = 0x00000013
2116	SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY     = 0x00000014
2117	SHTDN_REASON_MINOR_WMI                      = 0x00000015
2118	SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL    = 0x00000016
2119	SHTDN_REASON_MINOR_HOTFIX_UNINSTALL         = 0x00000017
2120	SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL    = 0x00000018
2121	SHTDN_REASON_MINOR_MMC                      = 0x00000019
2122	SHTDN_REASON_MINOR_SYSTEMRESTORE            = 0x0000001a
2123	SHTDN_REASON_MINOR_TERMSRV                  = 0x00000020
2124	SHTDN_REASON_MINOR_DC_PROMOTION             = 0x00000021
2125	SHTDN_REASON_MINOR_DC_DEMOTION              = 0x00000022
2126	SHTDN_REASON_UNKNOWN                        = SHTDN_REASON_MINOR_NONE
2127	SHTDN_REASON_LEGACY_API                     = SHTDN_REASON_MAJOR_LEGACY_API | SHTDN_REASON_FLAG_PLANNED
2128	SHTDN_REASON_VALID_BIT_MASK                 = 0xc0ffffff
2129
2130	SHUTDOWN_NORETRY = 0x1
2131)
2132
2133// Flags used for GetModuleHandleEx
2134const (
2135	GET_MODULE_HANDLE_EX_FLAG_PIN                = 1
2136	GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 2
2137	GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS       = 4
2138)
2139
2140// MUI function flag values
2141const (
2142	MUI_LANGUAGE_ID                    = 0x4
2143	MUI_LANGUAGE_NAME                  = 0x8
2144	MUI_MERGE_SYSTEM_FALLBACK          = 0x10
2145	MUI_MERGE_USER_FALLBACK            = 0x20
2146	MUI_UI_FALLBACK                    = MUI_MERGE_SYSTEM_FALLBACK | MUI_MERGE_USER_FALLBACK
2147	MUI_THREAD_LANGUAGES               = 0x40
2148	MUI_CONSOLE_FILTER                 = 0x100
2149	MUI_COMPLEX_SCRIPT_FILTER          = 0x200
2150	MUI_RESET_FILTERS                  = 0x001
2151	MUI_USER_PREFERRED_UI_LANGUAGES    = 0x10
2152	MUI_USE_INSTALLED_LANGUAGES        = 0x20
2153	MUI_USE_SEARCH_ALL_LANGUAGES       = 0x40
2154	MUI_LANG_NEUTRAL_PE_FILE           = 0x100
2155	MUI_NON_LANG_NEUTRAL_FILE          = 0x200
2156	MUI_MACHINE_LANGUAGE_SETTINGS      = 0x400
2157	MUI_FILETYPE_NOT_LANGUAGE_NEUTRAL  = 0x001
2158	MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN = 0x002
2159	MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI  = 0x004
2160	MUI_QUERY_TYPE                     = 0x001
2161	MUI_QUERY_CHECKSUM                 = 0x002
2162	MUI_QUERY_LANGUAGE_NAME            = 0x004
2163	MUI_QUERY_RESOURCE_TYPES           = 0x008
2164	MUI_FILEINFO_VERSION               = 0x001
2165
2166	MUI_FULL_LANGUAGE      = 0x01
2167	MUI_PARTIAL_LANGUAGE   = 0x02
2168	MUI_LIP_LANGUAGE       = 0x04
2169	MUI_LANGUAGE_INSTALLED = 0x20
2170	MUI_LANGUAGE_LICENSED  = 0x40
2171)
2172
2173// FILE_INFO_BY_HANDLE_CLASS constants for SetFileInformationByHandle/GetFileInformationByHandleEx
2174const (
2175	FileBasicInfo                  = 0
2176	FileStandardInfo               = 1
2177	FileNameInfo                   = 2
2178	FileRenameInfo                 = 3
2179	FileDispositionInfo            = 4
2180	FileAllocationInfo             = 5
2181	FileEndOfFileInfo              = 6
2182	FileStreamInfo                 = 7
2183	FileCompressionInfo            = 8
2184	FileAttributeTagInfo           = 9
2185	FileIdBothDirectoryInfo        = 10
2186	FileIdBothDirectoryRestartInfo = 11
2187	FileIoPriorityHintInfo         = 12
2188	FileRemoteProtocolInfo         = 13
2189	FileFullDirectoryInfo          = 14
2190	FileFullDirectoryRestartInfo   = 15
2191	FileStorageInfo                = 16
2192	FileAlignmentInfo              = 17
2193	FileIdInfo                     = 18
2194	FileIdExtdDirectoryInfo        = 19
2195	FileIdExtdDirectoryRestartInfo = 20
2196	FileDispositionInfoEx          = 21
2197	FileRenameInfoEx               = 22
2198	FileCaseSensitiveInfo          = 23
2199	FileNormalizedNameInfo         = 24
2200)
2201
2202// LoadLibrary flags for determining from where to search for a DLL
2203const (
2204	DONT_RESOLVE_DLL_REFERENCES               = 0x1
2205	LOAD_LIBRARY_AS_DATAFILE                  = 0x2
2206	LOAD_WITH_ALTERED_SEARCH_PATH             = 0x8
2207	LOAD_IGNORE_CODE_AUTHZ_LEVEL              = 0x10
2208	LOAD_LIBRARY_AS_IMAGE_RESOURCE            = 0x20
2209	LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE        = 0x40
2210	LOAD_LIBRARY_REQUIRE_SIGNED_TARGET        = 0x80
2211	LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR          = 0x100
2212	LOAD_LIBRARY_SEARCH_APPLICATION_DIR       = 0x200
2213	LOAD_LIBRARY_SEARCH_USER_DIRS             = 0x400
2214	LOAD_LIBRARY_SEARCH_SYSTEM32              = 0x800
2215	LOAD_LIBRARY_SEARCH_DEFAULT_DIRS          = 0x1000
2216	LOAD_LIBRARY_SAFE_CURRENT_DIRS            = 0x00002000
2217	LOAD_LIBRARY_SEARCH_SYSTEM32_NO_FORWARDER = 0x00004000
2218	LOAD_LIBRARY_OS_INTEGRITY_CONTINUITY      = 0x00008000
2219)
2220
2221// RegNotifyChangeKeyValue notifyFilter flags.
2222const (
2223	// REG_NOTIFY_CHANGE_NAME notifies the caller if a subkey is added or deleted.
2224	REG_NOTIFY_CHANGE_NAME = 0x00000001
2225
2226	// REG_NOTIFY_CHANGE_ATTRIBUTES notifies the caller of changes to the attributes of the key, such as the security descriptor information.
2227	REG_NOTIFY_CHANGE_ATTRIBUTES = 0x00000002
2228
2229	// REG_NOTIFY_CHANGE_LAST_SET notifies the caller of changes to a value of the key. This can include adding or deleting a value, or changing an existing value.
2230	REG_NOTIFY_CHANGE_LAST_SET = 0x00000004
2231
2232	// REG_NOTIFY_CHANGE_SECURITY notifies the caller of changes to the security descriptor of the key.
2233	REG_NOTIFY_CHANGE_SECURITY = 0x00000008
2234
2235	// REG_NOTIFY_THREAD_AGNOSTIC indicates that the lifetime of the registration must not be tied to the lifetime of the thread issuing the RegNotifyChangeKeyValue call. Note: This flag value is only supported in Windows 8 and later.
2236	REG_NOTIFY_THREAD_AGNOSTIC = 0x10000000
2237)
2238