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
13// NTStatus corresponds with NTSTATUS, error values returned by ntdll.dll and
14// other native functions.
15type NTStatus uint32
16
17const (
18	// Invented values to support what package os expects.
19	O_RDONLY   = 0x00000
20	O_WRONLY   = 0x00001
21	O_RDWR     = 0x00002
22	O_CREAT    = 0x00040
23	O_EXCL     = 0x00080
24	O_NOCTTY   = 0x00100
25	O_TRUNC    = 0x00200
26	O_NONBLOCK = 0x00800
27	O_APPEND   = 0x00400
28	O_SYNC     = 0x01000
29	O_ASYNC    = 0x02000
30	O_CLOEXEC  = 0x80000
31)
32
33const (
34	// More invented values for signals
35	SIGHUP  = Signal(0x1)
36	SIGINT  = Signal(0x2)
37	SIGQUIT = Signal(0x3)
38	SIGILL  = Signal(0x4)
39	SIGTRAP = Signal(0x5)
40	SIGABRT = Signal(0x6)
41	SIGBUS  = Signal(0x7)
42	SIGFPE  = Signal(0x8)
43	SIGKILL = Signal(0x9)
44	SIGSEGV = Signal(0xb)
45	SIGPIPE = Signal(0xd)
46	SIGALRM = Signal(0xe)
47	SIGTERM = Signal(0xf)
48)
49
50var signals = [...]string{
51	1:  "hangup",
52	2:  "interrupt",
53	3:  "quit",
54	4:  "illegal instruction",
55	5:  "trace/breakpoint trap",
56	6:  "aborted",
57	7:  "bus error",
58	8:  "floating point exception",
59	9:  "killed",
60	10: "user defined signal 1",
61	11: "segmentation fault",
62	12: "user defined signal 2",
63	13: "broken pipe",
64	14: "alarm clock",
65	15: "terminated",
66}
67
68const (
69	FILE_LIST_DIRECTORY   = 0x00000001
70	FILE_APPEND_DATA      = 0x00000004
71	FILE_WRITE_ATTRIBUTES = 0x00000100
72
73	FILE_SHARE_READ   = 0x00000001
74	FILE_SHARE_WRITE  = 0x00000002
75	FILE_SHARE_DELETE = 0x00000004
76
77	FILE_ATTRIBUTE_READONLY              = 0x00000001
78	FILE_ATTRIBUTE_HIDDEN                = 0x00000002
79	FILE_ATTRIBUTE_SYSTEM                = 0x00000004
80	FILE_ATTRIBUTE_DIRECTORY             = 0x00000010
81	FILE_ATTRIBUTE_ARCHIVE               = 0x00000020
82	FILE_ATTRIBUTE_DEVICE                = 0x00000040
83	FILE_ATTRIBUTE_NORMAL                = 0x00000080
84	FILE_ATTRIBUTE_TEMPORARY             = 0x00000100
85	FILE_ATTRIBUTE_SPARSE_FILE           = 0x00000200
86	FILE_ATTRIBUTE_REPARSE_POINT         = 0x00000400
87	FILE_ATTRIBUTE_COMPRESSED            = 0x00000800
88	FILE_ATTRIBUTE_OFFLINE               = 0x00001000
89	FILE_ATTRIBUTE_NOT_CONTENT_INDEXED   = 0x00002000
90	FILE_ATTRIBUTE_ENCRYPTED             = 0x00004000
91	FILE_ATTRIBUTE_INTEGRITY_STREAM      = 0x00008000
92	FILE_ATTRIBUTE_VIRTUAL               = 0x00010000
93	FILE_ATTRIBUTE_NO_SCRUB_DATA         = 0x00020000
94	FILE_ATTRIBUTE_RECALL_ON_OPEN        = 0x00040000
95	FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = 0x00400000
96
97	INVALID_FILE_ATTRIBUTES = 0xffffffff
98
99	CREATE_NEW        = 1
100	CREATE_ALWAYS     = 2
101	OPEN_EXISTING     = 3
102	OPEN_ALWAYS       = 4
103	TRUNCATE_EXISTING = 5
104
105	FILE_FLAG_OPEN_REQUIRING_OPLOCK = 0x00040000
106	FILE_FLAG_FIRST_PIPE_INSTANCE   = 0x00080000
107	FILE_FLAG_OPEN_NO_RECALL        = 0x00100000
108	FILE_FLAG_OPEN_REPARSE_POINT    = 0x00200000
109	FILE_FLAG_SESSION_AWARE         = 0x00800000
110	FILE_FLAG_POSIX_SEMANTICS       = 0x01000000
111	FILE_FLAG_BACKUP_SEMANTICS      = 0x02000000
112	FILE_FLAG_DELETE_ON_CLOSE       = 0x04000000
113	FILE_FLAG_SEQUENTIAL_SCAN       = 0x08000000
114	FILE_FLAG_RANDOM_ACCESS         = 0x10000000
115	FILE_FLAG_NO_BUFFERING          = 0x20000000
116	FILE_FLAG_OVERLAPPED            = 0x40000000
117	FILE_FLAG_WRITE_THROUGH         = 0x80000000
118
119	HANDLE_FLAG_INHERIT    = 0x00000001
120	STARTF_USESTDHANDLES   = 0x00000100
121	STARTF_USESHOWWINDOW   = 0x00000001
122	DUPLICATE_CLOSE_SOURCE = 0x00000001
123	DUPLICATE_SAME_ACCESS  = 0x00000002
124
125	STD_INPUT_HANDLE  = -10 & (1<<32 - 1)
126	STD_OUTPUT_HANDLE = -11 & (1<<32 - 1)
127	STD_ERROR_HANDLE  = -12 & (1<<32 - 1)
128
129	FILE_BEGIN   = 0
130	FILE_CURRENT = 1
131	FILE_END     = 2
132
133	LANG_ENGLISH       = 0x09
134	SUBLANG_ENGLISH_US = 0x01
135
136	FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
137	FORMAT_MESSAGE_IGNORE_INSERTS  = 512
138	FORMAT_MESSAGE_FROM_STRING     = 1024
139	FORMAT_MESSAGE_FROM_HMODULE    = 2048
140	FORMAT_MESSAGE_FROM_SYSTEM     = 4096
141	FORMAT_MESSAGE_ARGUMENT_ARRAY  = 8192
142	FORMAT_MESSAGE_MAX_WIDTH_MASK  = 255
143
144	MAX_PATH      = 260
145	MAX_LONG_PATH = 32768
146
147	MAX_COMPUTERNAME_LENGTH = 15
148
149	TIME_ZONE_ID_UNKNOWN  = 0
150	TIME_ZONE_ID_STANDARD = 1
151
152	TIME_ZONE_ID_DAYLIGHT = 2
153	IGNORE                = 0
154	INFINITE              = 0xffffffff
155
156	WAIT_ABANDONED = 0x00000080
157	WAIT_OBJECT_0  = 0x00000000
158	WAIT_FAILED    = 0xFFFFFFFF
159
160	// Access rights for process.
161	PROCESS_CREATE_PROCESS            = 0x0080
162	PROCESS_CREATE_THREAD             = 0x0002
163	PROCESS_DUP_HANDLE                = 0x0040
164	PROCESS_QUERY_INFORMATION         = 0x0400
165	PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
166	PROCESS_SET_INFORMATION           = 0x0200
167	PROCESS_SET_QUOTA                 = 0x0100
168	PROCESS_SUSPEND_RESUME            = 0x0800
169	PROCESS_TERMINATE                 = 0x0001
170	PROCESS_VM_OPERATION              = 0x0008
171	PROCESS_VM_READ                   = 0x0010
172	PROCESS_VM_WRITE                  = 0x0020
173
174	// Access rights for thread.
175	THREAD_DIRECT_IMPERSONATION      = 0x0200
176	THREAD_GET_CONTEXT               = 0x0008
177	THREAD_IMPERSONATE               = 0x0100
178	THREAD_QUERY_INFORMATION         = 0x0040
179	THREAD_QUERY_LIMITED_INFORMATION = 0x0800
180	THREAD_SET_CONTEXT               = 0x0010
181	THREAD_SET_INFORMATION           = 0x0020
182	THREAD_SET_LIMITED_INFORMATION   = 0x0400
183	THREAD_SET_THREAD_TOKEN          = 0x0080
184	THREAD_SUSPEND_RESUME            = 0x0002
185	THREAD_TERMINATE                 = 0x0001
186
187	FILE_MAP_COPY    = 0x01
188	FILE_MAP_WRITE   = 0x02
189	FILE_MAP_READ    = 0x04
190	FILE_MAP_EXECUTE = 0x20
191
192	CTRL_C_EVENT        = 0
193	CTRL_BREAK_EVENT    = 1
194	CTRL_CLOSE_EVENT    = 2
195	CTRL_LOGOFF_EVENT   = 5
196	CTRL_SHUTDOWN_EVENT = 6
197
198	// Windows reserves errors >= 1<<29 for application use.
199	APPLICATION_ERROR = 1 << 29
200)
201
202const (
203	// Process creation flags.
204	CREATE_BREAKAWAY_FROM_JOB        = 0x01000000
205	CREATE_DEFAULT_ERROR_MODE        = 0x04000000
206	CREATE_NEW_CONSOLE               = 0x00000010
207	CREATE_NEW_PROCESS_GROUP         = 0x00000200
208	CREATE_NO_WINDOW                 = 0x08000000
209	CREATE_PROTECTED_PROCESS         = 0x00040000
210	CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000
211	CREATE_SEPARATE_WOW_VDM          = 0x00000800
212	CREATE_SHARED_WOW_VDM            = 0x00001000
213	CREATE_SUSPENDED                 = 0x00000004
214	CREATE_UNICODE_ENVIRONMENT       = 0x00000400
215	DEBUG_ONLY_THIS_PROCESS          = 0x00000002
216	DEBUG_PROCESS                    = 0x00000001
217	DETACHED_PROCESS                 = 0x00000008
218	EXTENDED_STARTUPINFO_PRESENT     = 0x00080000
219	INHERIT_PARENT_AFFINITY          = 0x00010000
220)
221
222const (
223	// attributes for ProcThreadAttributeList
224	PROC_THREAD_ATTRIBUTE_PARENT_PROCESS    = 0x00020000
225	PROC_THREAD_ATTRIBUTE_HANDLE_LIST       = 0x00020002
226	PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY    = 0x00030003
227	PROC_THREAD_ATTRIBUTE_PREFERRED_NODE    = 0x00020004
228	PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR   = 0x00030005
229	PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY = 0x00020007
230	PROC_THREAD_ATTRIBUTE_UMS_THREAD        = 0x00030006
231	PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL  = 0x0002000b
232)
233
234const (
235	// flags for CreateToolhelp32Snapshot
236	TH32CS_SNAPHEAPLIST = 0x01
237	TH32CS_SNAPPROCESS  = 0x02
238	TH32CS_SNAPTHREAD   = 0x04
239	TH32CS_SNAPMODULE   = 0x08
240	TH32CS_SNAPMODULE32 = 0x10
241	TH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD
242	TH32CS_INHERIT      = 0x80000000
243)
244
245const (
246	// filters for ReadDirectoryChangesW and FindFirstChangeNotificationW
247	FILE_NOTIFY_CHANGE_FILE_NAME   = 0x001
248	FILE_NOTIFY_CHANGE_DIR_NAME    = 0x002
249	FILE_NOTIFY_CHANGE_ATTRIBUTES  = 0x004
250	FILE_NOTIFY_CHANGE_SIZE        = 0x008
251	FILE_NOTIFY_CHANGE_LAST_WRITE  = 0x010
252	FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020
253	FILE_NOTIFY_CHANGE_CREATION    = 0x040
254	FILE_NOTIFY_CHANGE_SECURITY    = 0x100
255)
256
257const (
258	// do not reorder
259	FILE_ACTION_ADDED = iota + 1
260	FILE_ACTION_REMOVED
261	FILE_ACTION_MODIFIED
262	FILE_ACTION_RENAMED_OLD_NAME
263	FILE_ACTION_RENAMED_NEW_NAME
264)
265
266const (
267	// wincrypt.h
268	/* certenrolld_begin -- PROV_RSA_*/
269	PROV_RSA_FULL      = 1
270	PROV_RSA_SIG       = 2
271	PROV_DSS           = 3
272	PROV_FORTEZZA      = 4
273	PROV_MS_EXCHANGE   = 5
274	PROV_SSL           = 6
275	PROV_RSA_SCHANNEL  = 12
276	PROV_DSS_DH        = 13
277	PROV_EC_ECDSA_SIG  = 14
278	PROV_EC_ECNRA_SIG  = 15
279	PROV_EC_ECDSA_FULL = 16
280	PROV_EC_ECNRA_FULL = 17
281	PROV_DH_SCHANNEL   = 18
282	PROV_SPYRUS_LYNKS  = 20
283	PROV_RNG           = 21
284	PROV_INTEL_SEC     = 22
285	PROV_REPLACE_OWF   = 23
286	PROV_RSA_AES       = 24
287
288	/* dwFlags definitions for CryptAcquireContext */
289	CRYPT_VERIFYCONTEXT              = 0xF0000000
290	CRYPT_NEWKEYSET                  = 0x00000008
291	CRYPT_DELETEKEYSET               = 0x00000010
292	CRYPT_MACHINE_KEYSET             = 0x00000020
293	CRYPT_SILENT                     = 0x00000040
294	CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080
295
296	/* Flags for PFXImportCertStore */
297	CRYPT_EXPORTABLE                   = 0x00000001
298	CRYPT_USER_PROTECTED               = 0x00000002
299	CRYPT_USER_KEYSET                  = 0x00001000
300	PKCS12_PREFER_CNG_KSP              = 0x00000100
301	PKCS12_ALWAYS_CNG_KSP              = 0x00000200
302	PKCS12_ALLOW_OVERWRITE_KEY         = 0x00004000
303	PKCS12_NO_PERSIST_KEY              = 0x00008000
304	PKCS12_INCLUDE_EXTENDED_PROPERTIES = 0x00000010
305
306	/* Flags for CryptAcquireCertificatePrivateKey */
307	CRYPT_ACQUIRE_CACHE_FLAG             = 0x00000001
308	CRYPT_ACQUIRE_USE_PROV_INFO_FLAG     = 0x00000002
309	CRYPT_ACQUIRE_COMPARE_KEY_FLAG       = 0x00000004
310	CRYPT_ACQUIRE_NO_HEALING             = 0x00000008
311	CRYPT_ACQUIRE_SILENT_FLAG            = 0x00000040
312	CRYPT_ACQUIRE_WINDOW_HANDLE_FLAG     = 0x00000080
313	CRYPT_ACQUIRE_NCRYPT_KEY_FLAGS_MASK  = 0x00070000
314	CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG  = 0x00010000
315	CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG = 0x00020000
316	CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG   = 0x00040000
317
318	/* pdwKeySpec for CryptAcquireCertificatePrivateKey */
319	AT_KEYEXCHANGE       = 1
320	AT_SIGNATURE         = 2
321	CERT_NCRYPT_KEY_SPEC = 0xFFFFFFFF
322
323	/* Default usage match type is AND with value zero */
324	USAGE_MATCH_TYPE_AND = 0
325	USAGE_MATCH_TYPE_OR  = 1
326
327	/* msgAndCertEncodingType values for CertOpenStore function */
328	X509_ASN_ENCODING   = 0x00000001
329	PKCS_7_ASN_ENCODING = 0x00010000
330
331	/* storeProvider values for CertOpenStore function */
332	CERT_STORE_PROV_MSG               = 1
333	CERT_STORE_PROV_MEMORY            = 2
334	CERT_STORE_PROV_FILE              = 3
335	CERT_STORE_PROV_REG               = 4
336	CERT_STORE_PROV_PKCS7             = 5
337	CERT_STORE_PROV_SERIALIZED        = 6
338	CERT_STORE_PROV_FILENAME_A        = 7
339	CERT_STORE_PROV_FILENAME_W        = 8
340	CERT_STORE_PROV_FILENAME          = CERT_STORE_PROV_FILENAME_W
341	CERT_STORE_PROV_SYSTEM_A          = 9
342	CERT_STORE_PROV_SYSTEM_W          = 10
343	CERT_STORE_PROV_SYSTEM            = CERT_STORE_PROV_SYSTEM_W
344	CERT_STORE_PROV_COLLECTION        = 11
345	CERT_STORE_PROV_SYSTEM_REGISTRY_A = 12
346	CERT_STORE_PROV_SYSTEM_REGISTRY_W = 13
347	CERT_STORE_PROV_SYSTEM_REGISTRY   = CERT_STORE_PROV_SYSTEM_REGISTRY_W
348	CERT_STORE_PROV_PHYSICAL_W        = 14
349	CERT_STORE_PROV_PHYSICAL          = CERT_STORE_PROV_PHYSICAL_W
350	CERT_STORE_PROV_SMART_CARD_W      = 15
351	CERT_STORE_PROV_SMART_CARD        = CERT_STORE_PROV_SMART_CARD_W
352	CERT_STORE_PROV_LDAP_W            = 16
353	CERT_STORE_PROV_LDAP              = CERT_STORE_PROV_LDAP_W
354	CERT_STORE_PROV_PKCS12            = 17
355
356	/* store characteristics (low WORD of flag) for CertOpenStore function */
357	CERT_STORE_NO_CRYPT_RELEASE_FLAG            = 0x00000001
358	CERT_STORE_SET_LOCALIZED_NAME_FLAG          = 0x00000002
359	CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004
360	CERT_STORE_DELETE_FLAG                      = 0x00000010
361	CERT_STORE_UNSAFE_PHYSICAL_FLAG             = 0x00000020
362	CERT_STORE_SHARE_STORE_FLAG                 = 0x00000040
363	CERT_STORE_SHARE_CONTEXT_FLAG               = 0x00000080
364	CERT_STORE_MANIFOLD_FLAG                    = 0x00000100
365	CERT_STORE_ENUM_ARCHIVED_FLAG               = 0x00000200
366	CERT_STORE_UPDATE_KEYID_FLAG                = 0x00000400
367	CERT_STORE_BACKUP_RESTORE_FLAG              = 0x00000800
368	CERT_STORE_MAXIMUM_ALLOWED_FLAG             = 0x00001000
369	CERT_STORE_CREATE_NEW_FLAG                  = 0x00002000
370	CERT_STORE_OPEN_EXISTING_FLAG               = 0x00004000
371	CERT_STORE_READONLY_FLAG                    = 0x00008000
372
373	/* store locations (high WORD of flag) for CertOpenStore function */
374	CERT_SYSTEM_STORE_CURRENT_USER               = 0x00010000
375	CERT_SYSTEM_STORE_LOCAL_MACHINE              = 0x00020000
376	CERT_SYSTEM_STORE_CURRENT_SERVICE            = 0x00040000
377	CERT_SYSTEM_STORE_SERVICES                   = 0x00050000
378	CERT_SYSTEM_STORE_USERS                      = 0x00060000
379	CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY  = 0x00070000
380	CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 0x00080000
381	CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE   = 0x00090000
382	CERT_SYSTEM_STORE_UNPROTECTED_FLAG           = 0x40000000
383	CERT_SYSTEM_STORE_RELOCATE_FLAG              = 0x80000000
384
385	/* Miscellaneous high-WORD flags for CertOpenStore function */
386	CERT_REGISTRY_STORE_REMOTE_FLAG      = 0x00010000
387	CERT_REGISTRY_STORE_SERIALIZED_FLAG  = 0x00020000
388	CERT_REGISTRY_STORE_ROAMING_FLAG     = 0x00040000
389	CERT_REGISTRY_STORE_MY_IE_DIRTY_FLAG = 0x00080000
390	CERT_REGISTRY_STORE_LM_GPT_FLAG      = 0x01000000
391	CERT_REGISTRY_STORE_CLIENT_GPT_FLAG  = 0x80000000
392	CERT_FILE_STORE_COMMIT_ENABLE_FLAG   = 0x00010000
393	CERT_LDAP_STORE_SIGN_FLAG            = 0x00010000
394	CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG  = 0x00020000
395	CERT_LDAP_STORE_OPENED_FLAG          = 0x00040000
396	CERT_LDAP_STORE_UNBIND_FLAG          = 0x00080000
397
398	/* addDisposition values for CertAddCertificateContextToStore function */
399	CERT_STORE_ADD_NEW                                 = 1
400	CERT_STORE_ADD_USE_EXISTING                        = 2
401	CERT_STORE_ADD_REPLACE_EXISTING                    = 3
402	CERT_STORE_ADD_ALWAYS                              = 4
403	CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5
404	CERT_STORE_ADD_NEWER                               = 6
405	CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES            = 7
406
407	/* ErrorStatus values for CertTrustStatus struct */
408	CERT_TRUST_NO_ERROR                          = 0x00000000
409	CERT_TRUST_IS_NOT_TIME_VALID                 = 0x00000001
410	CERT_TRUST_IS_REVOKED                        = 0x00000004
411	CERT_TRUST_IS_NOT_SIGNATURE_VALID            = 0x00000008
412	CERT_TRUST_IS_NOT_VALID_FOR_USAGE            = 0x00000010
413	CERT_TRUST_IS_UNTRUSTED_ROOT                 = 0x00000020
414	CERT_TRUST_REVOCATION_STATUS_UNKNOWN         = 0x00000040
415	CERT_TRUST_IS_CYCLIC                         = 0x00000080
416	CERT_TRUST_INVALID_EXTENSION                 = 0x00000100
417	CERT_TRUST_INVALID_POLICY_CONSTRAINTS        = 0x00000200
418	CERT_TRUST_INVALID_BASIC_CONSTRAINTS         = 0x00000400
419	CERT_TRUST_INVALID_NAME_CONSTRAINTS          = 0x00000800
420	CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000
421	CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT   = 0x00002000
422	CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000
423	CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT      = 0x00008000
424	CERT_TRUST_IS_PARTIAL_CHAIN                  = 0x00010000
425	CERT_TRUST_CTL_IS_NOT_TIME_VALID             = 0x00020000
426	CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID        = 0x00040000
427	CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE        = 0x00080000
428	CERT_TRUST_HAS_WEAK_SIGNATURE                = 0x00100000
429	CERT_TRUST_IS_OFFLINE_REVOCATION             = 0x01000000
430	CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY          = 0x02000000
431	CERT_TRUST_IS_EXPLICIT_DISTRUST              = 0x04000000
432	CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT    = 0x08000000
433
434	/* InfoStatus values for CertTrustStatus struct */
435	CERT_TRUST_HAS_EXACT_MATCH_ISSUER        = 0x00000001
436	CERT_TRUST_HAS_KEY_MATCH_ISSUER          = 0x00000002
437	CERT_TRUST_HAS_NAME_MATCH_ISSUER         = 0x00000004
438	CERT_TRUST_IS_SELF_SIGNED                = 0x00000008
439	CERT_TRUST_HAS_PREFERRED_ISSUER          = 0x00000100
440	CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY     = 0x00000400
441	CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS    = 0x00000400
442	CERT_TRUST_IS_PEER_TRUSTED               = 0x00000800
443	CERT_TRUST_HAS_CRL_VALIDITY_EXTENDED     = 0x00001000
444	CERT_TRUST_IS_FROM_EXCLUSIVE_TRUST_STORE = 0x00002000
445	CERT_TRUST_IS_CA_TRUSTED                 = 0x00004000
446	CERT_TRUST_IS_COMPLEX_CHAIN              = 0x00010000
447
448	/* Certificate Information Flags */
449	CERT_INFO_VERSION_FLAG                 = 1
450	CERT_INFO_SERIAL_NUMBER_FLAG           = 2
451	CERT_INFO_SIGNATURE_ALGORITHM_FLAG     = 3
452	CERT_INFO_ISSUER_FLAG                  = 4
453	CERT_INFO_NOT_BEFORE_FLAG              = 5
454	CERT_INFO_NOT_AFTER_FLAG               = 6
455	CERT_INFO_SUBJECT_FLAG                 = 7
456	CERT_INFO_SUBJECT_PUBLIC_KEY_INFO_FLAG = 8
457	CERT_INFO_ISSUER_UNIQUE_ID_FLAG        = 9
458	CERT_INFO_SUBJECT_UNIQUE_ID_FLAG       = 10
459	CERT_INFO_EXTENSION_FLAG               = 11
460
461	/* dwFindType for CertFindCertificateInStore  */
462	CERT_COMPARE_MASK                     = 0xFFFF
463	CERT_COMPARE_SHIFT                    = 16
464	CERT_COMPARE_ANY                      = 0
465	CERT_COMPARE_SHA1_HASH                = 1
466	CERT_COMPARE_NAME                     = 2
467	CERT_COMPARE_ATTR                     = 3
468	CERT_COMPARE_MD5_HASH                 = 4
469	CERT_COMPARE_PROPERTY                 = 5
470	CERT_COMPARE_PUBLIC_KEY               = 6
471	CERT_COMPARE_HASH                     = CERT_COMPARE_SHA1_HASH
472	CERT_COMPARE_NAME_STR_A               = 7
473	CERT_COMPARE_NAME_STR_W               = 8
474	CERT_COMPARE_KEY_SPEC                 = 9
475	CERT_COMPARE_ENHKEY_USAGE             = 10
476	CERT_COMPARE_CTL_USAGE                = CERT_COMPARE_ENHKEY_USAGE
477	CERT_COMPARE_SUBJECT_CERT             = 11
478	CERT_COMPARE_ISSUER_OF                = 12
479	CERT_COMPARE_EXISTING                 = 13
480	CERT_COMPARE_SIGNATURE_HASH           = 14
481	CERT_COMPARE_KEY_IDENTIFIER           = 15
482	CERT_COMPARE_CERT_ID                  = 16
483	CERT_COMPARE_CROSS_CERT_DIST_POINTS   = 17
484	CERT_COMPARE_PUBKEY_MD5_HASH          = 18
485	CERT_COMPARE_SUBJECT_INFO_ACCESS      = 19
486	CERT_COMPARE_HASH_STR                 = 20
487	CERT_COMPARE_HAS_PRIVATE_KEY          = 21
488	CERT_FIND_ANY                         = (CERT_COMPARE_ANY << CERT_COMPARE_SHIFT)
489	CERT_FIND_SHA1_HASH                   = (CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT)
490	CERT_FIND_MD5_HASH                    = (CERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT)
491	CERT_FIND_SIGNATURE_HASH              = (CERT_COMPARE_SIGNATURE_HASH << CERT_COMPARE_SHIFT)
492	CERT_FIND_KEY_IDENTIFIER              = (CERT_COMPARE_KEY_IDENTIFIER << CERT_COMPARE_SHIFT)
493	CERT_FIND_HASH                        = CERT_FIND_SHA1_HASH
494	CERT_FIND_PROPERTY                    = (CERT_COMPARE_PROPERTY << CERT_COMPARE_SHIFT)
495	CERT_FIND_PUBLIC_KEY                  = (CERT_COMPARE_PUBLIC_KEY << CERT_COMPARE_SHIFT)
496	CERT_FIND_SUBJECT_NAME                = (CERT_COMPARE_NAME<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
497	CERT_FIND_SUBJECT_ATTR                = (CERT_COMPARE_ATTR<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
498	CERT_FIND_ISSUER_NAME                 = (CERT_COMPARE_NAME<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
499	CERT_FIND_ISSUER_ATTR                 = (CERT_COMPARE_ATTR<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
500	CERT_FIND_SUBJECT_STR_A               = (CERT_COMPARE_NAME_STR_A<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
501	CERT_FIND_SUBJECT_STR_W               = (CERT_COMPARE_NAME_STR_W<<CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
502	CERT_FIND_SUBJECT_STR                 = CERT_FIND_SUBJECT_STR_W
503	CERT_FIND_ISSUER_STR_A                = (CERT_COMPARE_NAME_STR_A<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
504	CERT_FIND_ISSUER_STR_W                = (CERT_COMPARE_NAME_STR_W<<CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)
505	CERT_FIND_ISSUER_STR                  = CERT_FIND_ISSUER_STR_W
506	CERT_FIND_KEY_SPEC                    = (CERT_COMPARE_KEY_SPEC << CERT_COMPARE_SHIFT)
507	CERT_FIND_ENHKEY_USAGE                = (CERT_COMPARE_ENHKEY_USAGE << CERT_COMPARE_SHIFT)
508	CERT_FIND_CTL_USAGE                   = CERT_FIND_ENHKEY_USAGE
509	CERT_FIND_SUBJECT_CERT                = (CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT)
510	CERT_FIND_ISSUER_OF                   = (CERT_COMPARE_ISSUER_OF << CERT_COMPARE_SHIFT)
511	CERT_FIND_EXISTING                    = (CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT)
512	CERT_FIND_CERT_ID                     = (CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT)
513	CERT_FIND_CROSS_CERT_DIST_POINTS      = (CERT_COMPARE_CROSS_CERT_DIST_POINTS << CERT_COMPARE_SHIFT)
514	CERT_FIND_PUBKEY_MD5_HASH             = (CERT_COMPARE_PUBKEY_MD5_HASH << CERT_COMPARE_SHIFT)
515	CERT_FIND_SUBJECT_INFO_ACCESS         = (CERT_COMPARE_SUBJECT_INFO_ACCESS << CERT_COMPARE_SHIFT)
516	CERT_FIND_HASH_STR                    = (CERT_COMPARE_HASH_STR << CERT_COMPARE_SHIFT)
517	CERT_FIND_HAS_PRIVATE_KEY             = (CERT_COMPARE_HAS_PRIVATE_KEY << CERT_COMPARE_SHIFT)
518	CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG  = 0x1
519	CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG  = 0x2
520	CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG = 0x4
521	CERT_FIND_NO_ENHKEY_USAGE_FLAG        = 0x8
522	CERT_FIND_OR_ENHKEY_USAGE_FLAG        = 0x10
523	CERT_FIND_VALID_ENHKEY_USAGE_FLAG     = 0x20
524	CERT_FIND_OPTIONAL_CTL_USAGE_FLAG     = CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG
525	CERT_FIND_EXT_ONLY_CTL_USAGE_FLAG     = CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG
526	CERT_FIND_PROP_ONLY_CTL_USAGE_FLAG    = CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG
527	CERT_FIND_NO_CTL_USAGE_FLAG           = CERT_FIND_NO_ENHKEY_USAGE_FLAG
528	CERT_FIND_OR_CTL_USAGE_FLAG           = CERT_FIND_OR_ENHKEY_USAGE_FLAG
529	CERT_FIND_VALID_CTL_USAGE_FLAG        = CERT_FIND_VALID_ENHKEY_USAGE_FLAG
530
531	/* policyOID values for CertVerifyCertificateChainPolicy function */
532	CERT_CHAIN_POLICY_BASE              = 1
533	CERT_CHAIN_POLICY_AUTHENTICODE      = 2
534	CERT_CHAIN_POLICY_AUTHENTICODE_TS   = 3
535	CERT_CHAIN_POLICY_SSL               = 4
536	CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5
537	CERT_CHAIN_POLICY_NT_AUTH           = 6
538	CERT_CHAIN_POLICY_MICROSOFT_ROOT    = 7
539	CERT_CHAIN_POLICY_EV                = 8
540	CERT_CHAIN_POLICY_SSL_F12           = 9
541
542	/* flag for dwFindType CertFindChainInStore  */
543	CERT_CHAIN_FIND_BY_ISSUER = 1
544
545	/* dwFindFlags for CertFindChainInStore when dwFindType == CERT_CHAIN_FIND_BY_ISSUER */
546	CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG    = 0x0001
547	CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG  = 0x0002
548	CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG = 0x0004
549	CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG  = 0x0008
550	CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG         = 0x4000
551	CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG     = 0x8000
552
553	/* Certificate Store close flags */
554	CERT_CLOSE_STORE_FORCE_FLAG = 0x00000001
555	CERT_CLOSE_STORE_CHECK_FLAG = 0x00000002
556
557	/* CryptQueryObject object type */
558	CERT_QUERY_OBJECT_FILE = 1
559	CERT_QUERY_OBJECT_BLOB = 2
560
561	/* CryptQueryObject content type flags */
562	CERT_QUERY_CONTENT_CERT                    = 1
563	CERT_QUERY_CONTENT_CTL                     = 2
564	CERT_QUERY_CONTENT_CRL                     = 3
565	CERT_QUERY_CONTENT_SERIALIZED_STORE        = 4
566	CERT_QUERY_CONTENT_SERIALIZED_CERT         = 5
567	CERT_QUERY_CONTENT_SERIALIZED_CTL          = 6
568	CERT_QUERY_CONTENT_SERIALIZED_CRL          = 7
569	CERT_QUERY_CONTENT_PKCS7_SIGNED            = 8
570	CERT_QUERY_CONTENT_PKCS7_UNSIGNED          = 9
571	CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED      = 10
572	CERT_QUERY_CONTENT_PKCS10                  = 11
573	CERT_QUERY_CONTENT_PFX                     = 12
574	CERT_QUERY_CONTENT_CERT_PAIR               = 13
575	CERT_QUERY_CONTENT_PFX_AND_LOAD            = 14
576	CERT_QUERY_CONTENT_FLAG_CERT               = (1 << CERT_QUERY_CONTENT_CERT)
577	CERT_QUERY_CONTENT_FLAG_CTL                = (1 << CERT_QUERY_CONTENT_CTL)
578	CERT_QUERY_CONTENT_FLAG_CRL                = (1 << CERT_QUERY_CONTENT_CRL)
579	CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE   = (1 << CERT_QUERY_CONTENT_SERIALIZED_STORE)
580	CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT    = (1 << CERT_QUERY_CONTENT_SERIALIZED_CERT)
581	CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL     = (1 << CERT_QUERY_CONTENT_SERIALIZED_CTL)
582	CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL     = (1 << CERT_QUERY_CONTENT_SERIALIZED_CRL)
583	CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED       = (1 << CERT_QUERY_CONTENT_PKCS7_SIGNED)
584	CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED     = (1 << CERT_QUERY_CONTENT_PKCS7_UNSIGNED)
585	CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED = (1 << CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED)
586	CERT_QUERY_CONTENT_FLAG_PKCS10             = (1 << CERT_QUERY_CONTENT_PKCS10)
587	CERT_QUERY_CONTENT_FLAG_PFX                = (1 << CERT_QUERY_CONTENT_PFX)
588	CERT_QUERY_CONTENT_FLAG_CERT_PAIR          = (1 << CERT_QUERY_CONTENT_CERT_PAIR)
589	CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD       = (1 << CERT_QUERY_CONTENT_PFX_AND_LOAD)
590	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)
591	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)
592
593	/* CryptQueryObject format type flags */
594	CERT_QUERY_FORMAT_BINARY                     = 1
595	CERT_QUERY_FORMAT_BASE64_ENCODED             = 2
596	CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED      = 3
597	CERT_QUERY_FORMAT_FLAG_BINARY                = (1 << CERT_QUERY_FORMAT_BINARY)
598	CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED        = (1 << CERT_QUERY_FORMAT_BASE64_ENCODED)
599	CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = (1 << CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED)
600	CERT_QUERY_FORMAT_FLAG_ALL                   = (CERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED)
601
602	/* CertGetNameString name types */
603	CERT_NAME_EMAIL_TYPE            = 1
604	CERT_NAME_RDN_TYPE              = 2
605	CERT_NAME_ATTR_TYPE             = 3
606	CERT_NAME_SIMPLE_DISPLAY_TYPE   = 4
607	CERT_NAME_FRIENDLY_DISPLAY_TYPE = 5
608	CERT_NAME_DNS_TYPE              = 6
609	CERT_NAME_URL_TYPE              = 7
610	CERT_NAME_UPN_TYPE              = 8
611
612	/* CertGetNameString flags */
613	CERT_NAME_ISSUER_FLAG              = 0x1
614	CERT_NAME_DISABLE_IE4_UTF8_FLAG    = 0x10000
615	CERT_NAME_SEARCH_ALL_NAMES_FLAG    = 0x2
616	CERT_NAME_STR_ENABLE_PUNYCODE_FLAG = 0x00200000
617
618	/* AuthType values for SSLExtraCertChainPolicyPara struct */
619	AUTHTYPE_CLIENT = 1
620	AUTHTYPE_SERVER = 2
621
622	/* Checks values for SSLExtraCertChainPolicyPara struct */
623	SECURITY_FLAG_IGNORE_REVOCATION        = 0x00000080
624	SECURITY_FLAG_IGNORE_UNKNOWN_CA        = 0x00000100
625	SECURITY_FLAG_IGNORE_WRONG_USAGE       = 0x00000200
626	SECURITY_FLAG_IGNORE_CERT_CN_INVALID   = 0x00001000
627	SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000
628
629	/* Flags for Crypt[Un]ProtectData */
630	CRYPTPROTECT_UI_FORBIDDEN      = 0x1
631	CRYPTPROTECT_LOCAL_MACHINE     = 0x4
632	CRYPTPROTECT_CRED_SYNC         = 0x8
633	CRYPTPROTECT_AUDIT             = 0x10
634	CRYPTPROTECT_NO_RECOVERY       = 0x20
635	CRYPTPROTECT_VERIFY_PROTECTION = 0x40
636	CRYPTPROTECT_CRED_REGENERATE   = 0x80
637
638	/* Flags for CryptProtectPromptStruct */
639	CRYPTPROTECT_PROMPT_ON_UNPROTECT   = 1
640	CRYPTPROTECT_PROMPT_ON_PROTECT     = 2
641	CRYPTPROTECT_PROMPT_RESERVED       = 4
642	CRYPTPROTECT_PROMPT_STRONG         = 8
643	CRYPTPROTECT_PROMPT_REQUIRE_STRONG = 16
644)
645
646const (
647	// flags for SetErrorMode
648	SEM_FAILCRITICALERRORS     = 0x0001
649	SEM_NOALIGNMENTFAULTEXCEPT = 0x0004
650	SEM_NOGPFAULTERRORBOX      = 0x0002
651	SEM_NOOPENFILEERRORBOX     = 0x8000
652)
653
654const (
655	// Priority class.
656	ABOVE_NORMAL_PRIORITY_CLASS   = 0x00008000
657	BELOW_NORMAL_PRIORITY_CLASS   = 0x00004000
658	HIGH_PRIORITY_CLASS           = 0x00000080
659	IDLE_PRIORITY_CLASS           = 0x00000040
660	NORMAL_PRIORITY_CLASS         = 0x00000020
661	PROCESS_MODE_BACKGROUND_BEGIN = 0x00100000
662	PROCESS_MODE_BACKGROUND_END   = 0x00200000
663	REALTIME_PRIORITY_CLASS       = 0x00000100
664)
665
666/* wintrust.h constants for WinVerifyTrustEx */
667const (
668	WTD_UI_ALL    = 1
669	WTD_UI_NONE   = 2
670	WTD_UI_NOBAD  = 3
671	WTD_UI_NOGOOD = 4
672
673	WTD_REVOKE_NONE       = 0
674	WTD_REVOKE_WHOLECHAIN = 1
675
676	WTD_CHOICE_FILE    = 1
677	WTD_CHOICE_CATALOG = 2
678	WTD_CHOICE_BLOB    = 3
679	WTD_CHOICE_SIGNER  = 4
680	WTD_CHOICE_CERT    = 5
681
682	WTD_STATEACTION_IGNORE           = 0x00000000
683	WTD_STATEACTION_VERIFY           = 0x00000010
684	WTD_STATEACTION_CLOSE            = 0x00000002
685	WTD_STATEACTION_AUTO_CACHE       = 0x00000003
686	WTD_STATEACTION_AUTO_CACHE_FLUSH = 0x00000004
687
688	WTD_USE_IE4_TRUST_FLAG                  = 0x1
689	WTD_NO_IE4_CHAIN_FLAG                   = 0x2
690	WTD_NO_POLICY_USAGE_FLAG                = 0x4
691	WTD_REVOCATION_CHECK_NONE               = 0x10
692	WTD_REVOCATION_CHECK_END_CERT           = 0x20
693	WTD_REVOCATION_CHECK_CHAIN              = 0x40
694	WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = 0x80
695	WTD_SAFER_FLAG                          = 0x100
696	WTD_HASH_ONLY_FLAG                      = 0x200
697	WTD_USE_DEFAULT_OSVER_CHECK             = 0x400
698	WTD_LIFETIME_SIGNING_FLAG               = 0x800
699	WTD_CACHE_ONLY_URL_RETRIEVAL            = 0x1000
700	WTD_DISABLE_MD2_MD4                     = 0x2000
701	WTD_MOTW                                = 0x4000
702
703	WTD_UICONTEXT_EXECUTE = 0
704	WTD_UICONTEXT_INSTALL = 1
705)
706
707var (
708	OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00")
709	OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00")
710	OID_SGC_NETSCAPE        = []byte("2.16.840.1.113730.4.1\x00")
711
712	WINTRUST_ACTION_GENERIC_VERIFY_V2 = GUID{
713		Data1: 0xaac56b,
714		Data2: 0xcd44,
715		Data3: 0x11d0,
716		Data4: [8]byte{0x8c, 0xc2, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee},
717	}
718)
719
720// Pointer represents a pointer to an arbitrary Windows type.
721//
722// Pointer-typed fields may point to one of many different types. It's
723// up to the caller to provide a pointer to the appropriate type, cast
724// to Pointer. The caller must obey the unsafe.Pointer rules while
725// doing so.
726type Pointer *struct{}
727
728// Invented values to support what package os expects.
729type Timeval struct {
730	Sec  int32
731	Usec int32
732}
733
734func (tv *Timeval) Nanoseconds() int64 {
735	return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3
736}
737
738func NsecToTimeval(nsec int64) (tv Timeval) {
739	tv.Sec = int32(nsec / 1e9)
740	tv.Usec = int32(nsec % 1e9 / 1e3)
741	return
742}
743
744type Overlapped struct {
745	Internal     uintptr
746	InternalHigh uintptr
747	Offset       uint32
748	OffsetHigh   uint32
749	HEvent       Handle
750}
751
752type FileNotifyInformation struct {
753	NextEntryOffset uint32
754	Action          uint32
755	FileNameLength  uint32
756	FileName        uint16
757}
758
759type Filetime struct {
760	LowDateTime  uint32
761	HighDateTime uint32
762}
763
764// Nanoseconds returns Filetime ft in nanoseconds
765// since Epoch (00:00:00 UTC, January 1, 1970).
766func (ft *Filetime) Nanoseconds() int64 {
767	// 100-nanosecond intervals since January 1, 1601
768	nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime)
769	// change starting time to the Epoch (00:00:00 UTC, January 1, 1970)
770	nsec -= 116444736000000000
771	// convert into nanoseconds
772	nsec *= 100
773	return nsec
774}
775
776func NsecToFiletime(nsec int64) (ft Filetime) {
777	// convert into 100-nanosecond
778	nsec /= 100
779	// change starting time to January 1, 1601
780	nsec += 116444736000000000
781	// split into high / low
782	ft.LowDateTime = uint32(nsec & 0xffffffff)
783	ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff)
784	return ft
785}
786
787type Win32finddata struct {
788	FileAttributes    uint32
789	CreationTime      Filetime
790	LastAccessTime    Filetime
791	LastWriteTime     Filetime
792	FileSizeHigh      uint32
793	FileSizeLow       uint32
794	Reserved0         uint32
795	Reserved1         uint32
796	FileName          [MAX_PATH - 1]uint16
797	AlternateFileName [13]uint16
798}
799
800// This is the actual system call structure.
801// Win32finddata is what we committed to in Go 1.
802type win32finddata1 struct {
803	FileAttributes    uint32
804	CreationTime      Filetime
805	LastAccessTime    Filetime
806	LastWriteTime     Filetime
807	FileSizeHigh      uint32
808	FileSizeLow       uint32
809	Reserved0         uint32
810	Reserved1         uint32
811	FileName          [MAX_PATH]uint16
812	AlternateFileName [14]uint16
813
814	// The Microsoft documentation for this struct¹ describes three additional
815	// fields: dwFileType, dwCreatorType, and wFinderFlags. However, those fields
816	// are empirically only present in the macOS port of the Win32 API,² and thus
817	// not needed for binaries built for Windows.
818	//
819	// ¹ https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-win32_find_dataw describe
820	// ² https://golang.org/issue/42637#issuecomment-760715755.
821}
822
823func copyFindData(dst *Win32finddata, src *win32finddata1) {
824	dst.FileAttributes = src.FileAttributes
825	dst.CreationTime = src.CreationTime
826	dst.LastAccessTime = src.LastAccessTime
827	dst.LastWriteTime = src.LastWriteTime
828	dst.FileSizeHigh = src.FileSizeHigh
829	dst.FileSizeLow = src.FileSizeLow
830	dst.Reserved0 = src.Reserved0
831	dst.Reserved1 = src.Reserved1
832
833	// The src is 1 element bigger than dst, but it must be NUL.
834	copy(dst.FileName[:], src.FileName[:])
835	copy(dst.AlternateFileName[:], src.AlternateFileName[:])
836}
837
838type ByHandleFileInformation struct {
839	FileAttributes     uint32
840	CreationTime       Filetime
841	LastAccessTime     Filetime
842	LastWriteTime      Filetime
843	VolumeSerialNumber uint32
844	FileSizeHigh       uint32
845	FileSizeLow        uint32
846	NumberOfLinks      uint32
847	FileIndexHigh      uint32
848	FileIndexLow       uint32
849}
850
851const (
852	GetFileExInfoStandard = 0
853	GetFileExMaxInfoLevel = 1
854)
855
856type Win32FileAttributeData struct {
857	FileAttributes uint32
858	CreationTime   Filetime
859	LastAccessTime Filetime
860	LastWriteTime  Filetime
861	FileSizeHigh   uint32
862	FileSizeLow    uint32
863}
864
865// ShowWindow constants
866const (
867	// winuser.h
868	SW_HIDE            = 0
869	SW_NORMAL          = 1
870	SW_SHOWNORMAL      = 1
871	SW_SHOWMINIMIZED   = 2
872	SW_SHOWMAXIMIZED   = 3
873	SW_MAXIMIZE        = 3
874	SW_SHOWNOACTIVATE  = 4
875	SW_SHOW            = 5
876	SW_MINIMIZE        = 6
877	SW_SHOWMINNOACTIVE = 7
878	SW_SHOWNA          = 8
879	SW_RESTORE         = 9
880	SW_SHOWDEFAULT     = 10
881	SW_FORCEMINIMIZE   = 11
882)
883
884type StartupInfo struct {
885	Cb            uint32
886	_             *uint16
887	Desktop       *uint16
888	Title         *uint16
889	X             uint32
890	Y             uint32
891	XSize         uint32
892	YSize         uint32
893	XCountChars   uint32
894	YCountChars   uint32
895	FillAttribute uint32
896	Flags         uint32
897	ShowWindow    uint16
898	_             uint16
899	_             *byte
900	StdInput      Handle
901	StdOutput     Handle
902	StdErr        Handle
903}
904
905type StartupInfoEx struct {
906	StartupInfo
907	ProcThreadAttributeList *ProcThreadAttributeList
908}
909
910// ProcThreadAttributeList is a placeholder type to represent a PROC_THREAD_ATTRIBUTE_LIST.
911//
912// To create a *ProcThreadAttributeList, use NewProcThreadAttributeList, update
913// it with ProcThreadAttributeListContainer.Update, free its memory using
914// ProcThreadAttributeListContainer.Delete, and access the list itself using
915// ProcThreadAttributeListContainer.List.
916type ProcThreadAttributeList struct{}
917
918type ProcThreadAttributeListContainer struct {
919	data            *ProcThreadAttributeList
920	heapAllocations []uintptr
921}
922
923type ProcessInformation struct {
924	Process   Handle
925	Thread    Handle
926	ProcessId uint32
927	ThreadId  uint32
928}
929
930type ProcessEntry32 struct {
931	Size            uint32
932	Usage           uint32
933	ProcessID       uint32
934	DefaultHeapID   uintptr
935	ModuleID        uint32
936	Threads         uint32
937	ParentProcessID uint32
938	PriClassBase    int32
939	Flags           uint32
940	ExeFile         [MAX_PATH]uint16
941}
942
943type ThreadEntry32 struct {
944	Size           uint32
945	Usage          uint32
946	ThreadID       uint32
947	OwnerProcessID uint32
948	BasePri        int32
949	DeltaPri       int32
950	Flags          uint32
951}
952
953type Systemtime struct {
954	Year         uint16
955	Month        uint16
956	DayOfWeek    uint16
957	Day          uint16
958	Hour         uint16
959	Minute       uint16
960	Second       uint16
961	Milliseconds uint16
962}
963
964type Timezoneinformation struct {
965	Bias         int32
966	StandardName [32]uint16
967	StandardDate Systemtime
968	StandardBias int32
969	DaylightName [32]uint16
970	DaylightDate Systemtime
971	DaylightBias int32
972}
973
974// Socket related.
975
976const (
977	AF_UNSPEC  = 0
978	AF_UNIX    = 1
979	AF_INET    = 2
980	AF_NETBIOS = 17
981	AF_INET6   = 23
982	AF_IRDA    = 26
983	AF_BTH     = 32
984
985	SOCK_STREAM    = 1
986	SOCK_DGRAM     = 2
987	SOCK_RAW       = 3
988	SOCK_RDM       = 4
989	SOCK_SEQPACKET = 5
990
991	IPPROTO_IP      = 0
992	IPPROTO_ICMP    = 1
993	IPPROTO_IGMP    = 2
994	BTHPROTO_RFCOMM = 3
995	IPPROTO_TCP     = 6
996	IPPROTO_UDP     = 17
997	IPPROTO_IPV6    = 41
998	IPPROTO_ICMPV6  = 58
999	IPPROTO_RM      = 113
1000
1001	SOL_SOCKET                = 0xffff
1002	SO_REUSEADDR              = 4
1003	SO_KEEPALIVE              = 8
1004	SO_DONTROUTE              = 16
1005	SO_BROADCAST              = 32
1006	SO_LINGER                 = 128
1007	SO_RCVBUF                 = 0x1002
1008	SO_RCVTIMEO               = 0x1006
1009	SO_SNDBUF                 = 0x1001
1010	SO_UPDATE_ACCEPT_CONTEXT  = 0x700b
1011	SO_UPDATE_CONNECT_CONTEXT = 0x7010
1012
1013	IOC_OUT                            = 0x40000000
1014	IOC_IN                             = 0x80000000
1015	IOC_VENDOR                         = 0x18000000
1016	IOC_INOUT                          = IOC_IN | IOC_OUT
1017	IOC_WS2                            = 0x08000000
1018	SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6
1019	SIO_KEEPALIVE_VALS                 = IOC_IN | IOC_VENDOR | 4
1020	SIO_UDP_CONNRESET                  = IOC_IN | IOC_VENDOR | 12
1021
1022	// cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460
1023
1024	IP_HDRINCL         = 0x2
1025	IP_TOS             = 0x3
1026	IP_TTL             = 0x4
1027	IP_MULTICAST_IF    = 0x9
1028	IP_MULTICAST_TTL   = 0xa
1029	IP_MULTICAST_LOOP  = 0xb
1030	IP_ADD_MEMBERSHIP  = 0xc
1031	IP_DROP_MEMBERSHIP = 0xd
1032	IP_PKTINFO         = 0x13
1033
1034	IPV6_V6ONLY         = 0x1b
1035	IPV6_UNICAST_HOPS   = 0x4
1036	IPV6_MULTICAST_IF   = 0x9
1037	IPV6_MULTICAST_HOPS = 0xa
1038	IPV6_MULTICAST_LOOP = 0xb
1039	IPV6_JOIN_GROUP     = 0xc
1040	IPV6_LEAVE_GROUP    = 0xd
1041	IPV6_PKTINFO        = 0x13
1042
1043	MSG_OOB       = 0x1
1044	MSG_PEEK      = 0x2
1045	MSG_DONTROUTE = 0x4
1046	MSG_WAITALL   = 0x8
1047
1048	MSG_TRUNC  = 0x0100
1049	MSG_CTRUNC = 0x0200
1050	MSG_BCAST  = 0x0400
1051	MSG_MCAST  = 0x0800
1052
1053	SOMAXCONN = 0x7fffffff
1054
1055	TCP_NODELAY = 1
1056
1057	SHUT_RD   = 0
1058	SHUT_WR   = 1
1059	SHUT_RDWR = 2
1060
1061	WSADESCRIPTION_LEN = 256
1062	WSASYS_STATUS_LEN  = 128
1063)
1064
1065type WSABuf struct {
1066	Len uint32
1067	Buf *byte
1068}
1069
1070type WSAMsg struct {
1071	Name        *syscall.RawSockaddrAny
1072	Namelen     int32
1073	Buffers     *WSABuf
1074	BufferCount uint32
1075	Control     WSABuf
1076	Flags       uint32
1077}
1078
1079// Flags for WSASocket
1080const (
1081	WSA_FLAG_OVERLAPPED             = 0x01
1082	WSA_FLAG_MULTIPOINT_C_ROOT      = 0x02
1083	WSA_FLAG_MULTIPOINT_C_LEAF      = 0x04
1084	WSA_FLAG_MULTIPOINT_D_ROOT      = 0x08
1085	WSA_FLAG_MULTIPOINT_D_LEAF      = 0x10
1086	WSA_FLAG_ACCESS_SYSTEM_SECURITY = 0x40
1087	WSA_FLAG_NO_HANDLE_INHERIT      = 0x80
1088	WSA_FLAG_REGISTERED_IO          = 0x100
1089)
1090
1091// Invented values to support what package os expects.
1092const (
1093	S_IFMT   = 0x1f000
1094	S_IFIFO  = 0x1000
1095	S_IFCHR  = 0x2000
1096	S_IFDIR  = 0x4000
1097	S_IFBLK  = 0x6000
1098	S_IFREG  = 0x8000
1099	S_IFLNK  = 0xa000
1100	S_IFSOCK = 0xc000
1101	S_ISUID  = 0x800
1102	S_ISGID  = 0x400
1103	S_ISVTX  = 0x200
1104	S_IRUSR  = 0x100
1105	S_IWRITE = 0x80
1106	S_IWUSR  = 0x80
1107	S_IXUSR  = 0x40
1108)
1109
1110const (
1111	FILE_TYPE_CHAR    = 0x0002
1112	FILE_TYPE_DISK    = 0x0001
1113	FILE_TYPE_PIPE    = 0x0003
1114	FILE_TYPE_REMOTE  = 0x8000
1115	FILE_TYPE_UNKNOWN = 0x0000
1116)
1117
1118type Hostent struct {
1119	Name     *byte
1120	Aliases  **byte
1121	AddrType uint16
1122	Length   uint16
1123	AddrList **byte
1124}
1125
1126type Protoent struct {
1127	Name    *byte
1128	Aliases **byte
1129	Proto   uint16
1130}
1131
1132const (
1133	DNS_TYPE_A       = 0x0001
1134	DNS_TYPE_NS      = 0x0002
1135	DNS_TYPE_MD      = 0x0003
1136	DNS_TYPE_MF      = 0x0004
1137	DNS_TYPE_CNAME   = 0x0005
1138	DNS_TYPE_SOA     = 0x0006
1139	DNS_TYPE_MB      = 0x0007
1140	DNS_TYPE_MG      = 0x0008
1141	DNS_TYPE_MR      = 0x0009
1142	DNS_TYPE_NULL    = 0x000a
1143	DNS_TYPE_WKS     = 0x000b
1144	DNS_TYPE_PTR     = 0x000c
1145	DNS_TYPE_HINFO   = 0x000d
1146	DNS_TYPE_MINFO   = 0x000e
1147	DNS_TYPE_MX      = 0x000f
1148	DNS_TYPE_TEXT    = 0x0010
1149	DNS_TYPE_RP      = 0x0011
1150	DNS_TYPE_AFSDB   = 0x0012
1151	DNS_TYPE_X25     = 0x0013
1152	DNS_TYPE_ISDN    = 0x0014
1153	DNS_TYPE_RT      = 0x0015
1154	DNS_TYPE_NSAP    = 0x0016
1155	DNS_TYPE_NSAPPTR = 0x0017
1156	DNS_TYPE_SIG     = 0x0018
1157	DNS_TYPE_KEY     = 0x0019
1158	DNS_TYPE_PX      = 0x001a
1159	DNS_TYPE_GPOS    = 0x001b
1160	DNS_TYPE_AAAA    = 0x001c
1161	DNS_TYPE_LOC     = 0x001d
1162	DNS_TYPE_NXT     = 0x001e
1163	DNS_TYPE_EID     = 0x001f
1164	DNS_TYPE_NIMLOC  = 0x0020
1165	DNS_TYPE_SRV     = 0x0021
1166	DNS_TYPE_ATMA    = 0x0022
1167	DNS_TYPE_NAPTR   = 0x0023
1168	DNS_TYPE_KX      = 0x0024
1169	DNS_TYPE_CERT    = 0x0025
1170	DNS_TYPE_A6      = 0x0026
1171	DNS_TYPE_DNAME   = 0x0027
1172	DNS_TYPE_SINK    = 0x0028
1173	DNS_TYPE_OPT     = 0x0029
1174	DNS_TYPE_DS      = 0x002B
1175	DNS_TYPE_RRSIG   = 0x002E
1176	DNS_TYPE_NSEC    = 0x002F
1177	DNS_TYPE_DNSKEY  = 0x0030
1178	DNS_TYPE_DHCID   = 0x0031
1179	DNS_TYPE_UINFO   = 0x0064
1180	DNS_TYPE_UID     = 0x0065
1181	DNS_TYPE_GID     = 0x0066
1182	DNS_TYPE_UNSPEC  = 0x0067
1183	DNS_TYPE_ADDRS   = 0x00f8
1184	DNS_TYPE_TKEY    = 0x00f9
1185	DNS_TYPE_TSIG    = 0x00fa
1186	DNS_TYPE_IXFR    = 0x00fb
1187	DNS_TYPE_AXFR    = 0x00fc
1188	DNS_TYPE_MAILB   = 0x00fd
1189	DNS_TYPE_MAILA   = 0x00fe
1190	DNS_TYPE_ALL     = 0x00ff
1191	DNS_TYPE_ANY     = 0x00ff
1192	DNS_TYPE_WINS    = 0xff01
1193	DNS_TYPE_WINSR   = 0xff02
1194	DNS_TYPE_NBSTAT  = 0xff01
1195)
1196
1197const (
1198	// flags inside DNSRecord.Dw
1199	DnsSectionQuestion   = 0x0000
1200	DnsSectionAnswer     = 0x0001
1201	DnsSectionAuthority  = 0x0002
1202	DnsSectionAdditional = 0x0003
1203)
1204
1205type DNSSRVData struct {
1206	Target   *uint16
1207	Priority uint16
1208	Weight   uint16
1209	Port     uint16
1210	Pad      uint16
1211}
1212
1213type DNSPTRData struct {
1214	Host *uint16
1215}
1216
1217type DNSMXData struct {
1218	NameExchange *uint16
1219	Preference   uint16
1220	Pad          uint16
1221}
1222
1223type DNSTXTData struct {
1224	StringCount uint16
1225	StringArray [1]*uint16
1226}
1227
1228type DNSRecord struct {
1229	Next     *DNSRecord
1230	Name     *uint16
1231	Type     uint16
1232	Length   uint16
1233	Dw       uint32
1234	Ttl      uint32
1235	Reserved uint32
1236	Data     [40]byte
1237}
1238
1239const (
1240	TF_DISCONNECT         = 1
1241	TF_REUSE_SOCKET       = 2
1242	TF_WRITE_BEHIND       = 4
1243	TF_USE_DEFAULT_WORKER = 0
1244	TF_USE_SYSTEM_THREAD  = 16
1245	TF_USE_KERNEL_APC     = 32
1246)
1247
1248type TransmitFileBuffers struct {
1249	Head       uintptr
1250	HeadLength uint32
1251	Tail       uintptr
1252	TailLength uint32
1253}
1254
1255const (
1256	IFF_UP           = 1
1257	IFF_BROADCAST    = 2
1258	IFF_LOOPBACK     = 4
1259	IFF_POINTTOPOINT = 8
1260	IFF_MULTICAST    = 16
1261)
1262
1263const SIO_GET_INTERFACE_LIST = 0x4004747F
1264
1265// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old.
1266// will be fixed to change variable type as suitable.
1267
1268type SockaddrGen [24]byte
1269
1270type InterfaceInfo struct {
1271	Flags            uint32
1272	Address          SockaddrGen
1273	BroadcastAddress SockaddrGen
1274	Netmask          SockaddrGen
1275}
1276
1277type IpAddressString struct {
1278	String [16]byte
1279}
1280
1281type IpMaskString IpAddressString
1282
1283type IpAddrString struct {
1284	Next      *IpAddrString
1285	IpAddress IpAddressString
1286	IpMask    IpMaskString
1287	Context   uint32
1288}
1289
1290const MAX_ADAPTER_NAME_LENGTH = 256
1291const MAX_ADAPTER_DESCRIPTION_LENGTH = 128
1292const MAX_ADAPTER_ADDRESS_LENGTH = 8
1293
1294type IpAdapterInfo struct {
1295	Next                *IpAdapterInfo
1296	ComboIndex          uint32
1297	AdapterName         [MAX_ADAPTER_NAME_LENGTH + 4]byte
1298	Description         [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte
1299	AddressLength       uint32
1300	Address             [MAX_ADAPTER_ADDRESS_LENGTH]byte
1301	Index               uint32
1302	Type                uint32
1303	DhcpEnabled         uint32
1304	CurrentIpAddress    *IpAddrString
1305	IpAddressList       IpAddrString
1306	GatewayList         IpAddrString
1307	DhcpServer          IpAddrString
1308	HaveWins            bool
1309	PrimaryWinsServer   IpAddrString
1310	SecondaryWinsServer IpAddrString
1311	LeaseObtained       int64
1312	LeaseExpires        int64
1313}
1314
1315const MAXLEN_PHYSADDR = 8
1316const MAX_INTERFACE_NAME_LEN = 256
1317const MAXLEN_IFDESCR = 256
1318
1319type MibIfRow struct {
1320	Name            [MAX_INTERFACE_NAME_LEN]uint16
1321	Index           uint32
1322	Type            uint32
1323	Mtu             uint32
1324	Speed           uint32
1325	PhysAddrLen     uint32
1326	PhysAddr        [MAXLEN_PHYSADDR]byte
1327	AdminStatus     uint32
1328	OperStatus      uint32
1329	LastChange      uint32
1330	InOctets        uint32
1331	InUcastPkts     uint32
1332	InNUcastPkts    uint32
1333	InDiscards      uint32
1334	InErrors        uint32
1335	InUnknownProtos uint32
1336	OutOctets       uint32
1337	OutUcastPkts    uint32
1338	OutNUcastPkts   uint32
1339	OutDiscards     uint32
1340	OutErrors       uint32
1341	OutQLen         uint32
1342	DescrLen        uint32
1343	Descr           [MAXLEN_IFDESCR]byte
1344}
1345
1346type CertInfo struct {
1347	Version              uint32
1348	SerialNumber         CryptIntegerBlob
1349	SignatureAlgorithm   CryptAlgorithmIdentifier
1350	Issuer               CertNameBlob
1351	NotBefore            Filetime
1352	NotAfter             Filetime
1353	Subject              CertNameBlob
1354	SubjectPublicKeyInfo CertPublicKeyInfo
1355	IssuerUniqueId       CryptBitBlob
1356	SubjectUniqueId      CryptBitBlob
1357	CountExtensions      uint32
1358	Extensions           *CertExtension
1359}
1360
1361type CertExtension struct {
1362	ObjId    *byte
1363	Critical int32
1364	Value    CryptObjidBlob
1365}
1366
1367type CryptAlgorithmIdentifier struct {
1368	ObjId      *byte
1369	Parameters CryptObjidBlob
1370}
1371
1372type CertPublicKeyInfo struct {
1373	Algorithm CryptAlgorithmIdentifier
1374	PublicKey CryptBitBlob
1375}
1376
1377type DataBlob struct {
1378	Size uint32
1379	Data *byte
1380}
1381type CryptIntegerBlob DataBlob
1382type CryptUintBlob DataBlob
1383type CryptObjidBlob DataBlob
1384type CertNameBlob DataBlob
1385type CertRdnValueBlob DataBlob
1386type CertBlob DataBlob
1387type CrlBlob DataBlob
1388type CryptDataBlob DataBlob
1389type CryptHashBlob DataBlob
1390type CryptDigestBlob DataBlob
1391type CryptDerBlob DataBlob
1392type CryptAttrBlob DataBlob
1393
1394type CryptBitBlob struct {
1395	Size       uint32
1396	Data       *byte
1397	UnusedBits uint32
1398}
1399
1400type CertContext struct {
1401	EncodingType uint32
1402	EncodedCert  *byte
1403	Length       uint32
1404	CertInfo     *CertInfo
1405	Store        Handle
1406}
1407
1408type CertChainContext struct {
1409	Size                       uint32
1410	TrustStatus                CertTrustStatus
1411	ChainCount                 uint32
1412	Chains                     **CertSimpleChain
1413	LowerQualityChainCount     uint32
1414	LowerQualityChains         **CertChainContext
1415	HasRevocationFreshnessTime uint32
1416	RevocationFreshnessTime    uint32
1417}
1418
1419type CertTrustListInfo struct {
1420	// Not implemented
1421}
1422
1423type CertSimpleChain struct {
1424	Size                       uint32
1425	TrustStatus                CertTrustStatus
1426	NumElements                uint32
1427	Elements                   **CertChainElement
1428	TrustListInfo              *CertTrustListInfo
1429	HasRevocationFreshnessTime uint32
1430	RevocationFreshnessTime    uint32
1431}
1432
1433type CertChainElement struct {
1434	Size              uint32
1435	CertContext       *CertContext
1436	TrustStatus       CertTrustStatus
1437	RevocationInfo    *CertRevocationInfo
1438	IssuanceUsage     *CertEnhKeyUsage
1439	ApplicationUsage  *CertEnhKeyUsage
1440	ExtendedErrorInfo *uint16
1441}
1442
1443type CertRevocationCrlInfo struct {
1444	// Not implemented
1445}
1446
1447type CertRevocationInfo struct {
1448	Size             uint32
1449	RevocationResult uint32
1450	RevocationOid    *byte
1451	OidSpecificInfo  Pointer
1452	HasFreshnessTime uint32
1453	FreshnessTime    uint32
1454	CrlInfo          *CertRevocationCrlInfo
1455}
1456
1457type CertTrustStatus struct {
1458	ErrorStatus uint32
1459	InfoStatus  uint32
1460}
1461
1462type CertUsageMatch struct {
1463	Type  uint32
1464	Usage CertEnhKeyUsage
1465}
1466
1467type CertEnhKeyUsage struct {
1468	Length           uint32
1469	UsageIdentifiers **byte
1470}
1471
1472type CertChainPara struct {
1473	Size                         uint32
1474	RequestedUsage               CertUsageMatch
1475	RequstedIssuancePolicy       CertUsageMatch
1476	URLRetrievalTimeout          uint32
1477	CheckRevocationFreshnessTime uint32
1478	RevocationFreshnessTime      uint32
1479	CacheResync                  *Filetime
1480}
1481
1482type CertChainPolicyPara struct {
1483	Size            uint32
1484	Flags           uint32
1485	ExtraPolicyPara Pointer
1486}
1487
1488type SSLExtraCertChainPolicyPara struct {
1489	Size       uint32
1490	AuthType   uint32
1491	Checks     uint32
1492	ServerName *uint16
1493}
1494
1495type CertChainPolicyStatus struct {
1496	Size              uint32
1497	Error             uint32
1498	ChainIndex        uint32
1499	ElementIndex      uint32
1500	ExtraPolicyStatus Pointer
1501}
1502
1503type CertPolicyInfo struct {
1504	Identifier      *byte
1505	CountQualifiers uint32
1506	Qualifiers      *CertPolicyQualifierInfo
1507}
1508
1509type CertPoliciesInfo struct {
1510	Count       uint32
1511	PolicyInfos *CertPolicyInfo
1512}
1513
1514type CertPolicyQualifierInfo struct {
1515	// Not implemented
1516}
1517
1518type CertStrongSignPara struct {
1519	Size                      uint32
1520	InfoChoice                uint32
1521	InfoOrSerializedInfoOrOID unsafe.Pointer
1522}
1523
1524type CryptProtectPromptStruct struct {
1525	Size        uint32
1526	PromptFlags uint32
1527	App         HWND
1528	Prompt      *uint16
1529}
1530
1531type CertChainFindByIssuerPara struct {
1532	Size                   uint32
1533	UsageIdentifier        *byte
1534	KeySpec                uint32
1535	AcquirePrivateKeyFlags uint32
1536	IssuerCount            uint32
1537	Issuer                 Pointer
1538	FindCallback           Pointer
1539	FindArg                Pointer
1540	IssuerChainIndex       *uint32
1541	IssuerElementIndex     *uint32
1542}
1543
1544type WinTrustData struct {
1545	Size                            uint32
1546	PolicyCallbackData              uintptr
1547	SIPClientData                   uintptr
1548	UIChoice                        uint32
1549	RevocationChecks                uint32
1550	UnionChoice                     uint32
1551	FileOrCatalogOrBlobOrSgnrOrCert unsafe.Pointer
1552	StateAction                     uint32
1553	StateData                       Handle
1554	URLReference                    *uint16
1555	ProvFlags                       uint32
1556	UIContext                       uint32
1557	SignatureSettings               *WinTrustSignatureSettings
1558}
1559
1560type WinTrustFileInfo struct {
1561	Size         uint32
1562	FilePath     *uint16
1563	File         Handle
1564	KnownSubject *GUID
1565}
1566
1567type WinTrustSignatureSettings struct {
1568	Size             uint32
1569	Index            uint32
1570	Flags            uint32
1571	SecondarySigs    uint32
1572	VerifiedSigIndex uint32
1573	CryptoPolicy     *CertStrongSignPara
1574}
1575
1576const (
1577	// do not reorder
1578	HKEY_CLASSES_ROOT = 0x80000000 + iota
1579	HKEY_CURRENT_USER
1580	HKEY_LOCAL_MACHINE
1581	HKEY_USERS
1582	HKEY_PERFORMANCE_DATA
1583	HKEY_CURRENT_CONFIG
1584	HKEY_DYN_DATA
1585
1586	KEY_QUERY_VALUE        = 1
1587	KEY_SET_VALUE          = 2
1588	KEY_CREATE_SUB_KEY     = 4
1589	KEY_ENUMERATE_SUB_KEYS = 8
1590	KEY_NOTIFY             = 16
1591	KEY_CREATE_LINK        = 32
1592	KEY_WRITE              = 0x20006
1593	KEY_EXECUTE            = 0x20019
1594	KEY_READ               = 0x20019
1595	KEY_WOW64_64KEY        = 0x0100
1596	KEY_WOW64_32KEY        = 0x0200
1597	KEY_ALL_ACCESS         = 0xf003f
1598)
1599
1600const (
1601	// do not reorder
1602	REG_NONE = iota
1603	REG_SZ
1604	REG_EXPAND_SZ
1605	REG_BINARY
1606	REG_DWORD_LITTLE_ENDIAN
1607	REG_DWORD_BIG_ENDIAN
1608	REG_LINK
1609	REG_MULTI_SZ
1610	REG_RESOURCE_LIST
1611	REG_FULL_RESOURCE_DESCRIPTOR
1612	REG_RESOURCE_REQUIREMENTS_LIST
1613	REG_QWORD_LITTLE_ENDIAN
1614	REG_DWORD = REG_DWORD_LITTLE_ENDIAN
1615	REG_QWORD = REG_QWORD_LITTLE_ENDIAN
1616)
1617
1618const (
1619	EVENT_MODIFY_STATE = 0x0002
1620	EVENT_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3
1621
1622	MUTANT_QUERY_STATE = 0x0001
1623	MUTANT_ALL_ACCESS  = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MUTANT_QUERY_STATE
1624
1625	SEMAPHORE_MODIFY_STATE = 0x0002
1626	SEMAPHORE_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3
1627
1628	TIMER_QUERY_STATE  = 0x0001
1629	TIMER_MODIFY_STATE = 0x0002
1630	TIMER_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | TIMER_QUERY_STATE | TIMER_MODIFY_STATE
1631
1632	MUTEX_MODIFY_STATE = MUTANT_QUERY_STATE
1633	MUTEX_ALL_ACCESS   = MUTANT_ALL_ACCESS
1634
1635	CREATE_EVENT_MANUAL_RESET  = 0x1
1636	CREATE_EVENT_INITIAL_SET   = 0x2
1637	CREATE_MUTEX_INITIAL_OWNER = 0x1
1638)
1639
1640type AddrinfoW struct {
1641	Flags     int32
1642	Family    int32
1643	Socktype  int32
1644	Protocol  int32
1645	Addrlen   uintptr
1646	Canonname *uint16
1647	Addr      uintptr
1648	Next      *AddrinfoW
1649}
1650
1651const (
1652	AI_PASSIVE     = 1
1653	AI_CANONNAME   = 2
1654	AI_NUMERICHOST = 4
1655)
1656
1657type GUID struct {
1658	Data1 uint32
1659	Data2 uint16
1660	Data3 uint16
1661	Data4 [8]byte
1662}
1663
1664var WSAID_CONNECTEX = GUID{
1665	0x25a207b9,
1666	0xddf3,
1667	0x4660,
1668	[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
1669}
1670
1671var WSAID_WSASENDMSG = GUID{
1672	0xa441e712,
1673	0x754f,
1674	0x43ca,
1675	[8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},
1676}
1677
1678var WSAID_WSARECVMSG = GUID{
1679	0xf689d7c8,
1680	0x6f1f,
1681	0x436b,
1682	[8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},
1683}
1684
1685const (
1686	FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
1687	FILE_SKIP_SET_EVENT_ON_HANDLE        = 2
1688)
1689
1690const (
1691	WSAPROTOCOL_LEN    = 255
1692	MAX_PROTOCOL_CHAIN = 7
1693	BASE_PROTOCOL      = 1
1694	LAYERED_PROTOCOL   = 0
1695
1696	XP1_CONNECTIONLESS           = 0x00000001
1697	XP1_GUARANTEED_DELIVERY      = 0x00000002
1698	XP1_GUARANTEED_ORDER         = 0x00000004
1699	XP1_MESSAGE_ORIENTED         = 0x00000008
1700	XP1_PSEUDO_STREAM            = 0x00000010
1701	XP1_GRACEFUL_CLOSE           = 0x00000020
1702	XP1_EXPEDITED_DATA           = 0x00000040
1703	XP1_CONNECT_DATA             = 0x00000080
1704	XP1_DISCONNECT_DATA          = 0x00000100
1705	XP1_SUPPORT_BROADCAST        = 0x00000200
1706	XP1_SUPPORT_MULTIPOINT       = 0x00000400
1707	XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800
1708	XP1_MULTIPOINT_DATA_PLANE    = 0x00001000
1709	XP1_QOS_SUPPORTED            = 0x00002000
1710	XP1_UNI_SEND                 = 0x00008000
1711	XP1_UNI_RECV                 = 0x00010000
1712	XP1_IFS_HANDLES              = 0x00020000
1713	XP1_PARTIAL_MESSAGE          = 0x00040000
1714	XP1_SAN_SUPPORT_SDP          = 0x00080000
1715
1716	PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001
1717	PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002
1718	PFL_HIDDEN                  = 0x00000004
1719	PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008
1720	PFL_NETWORKDIRECT_PROVIDER  = 0x00000010
1721)
1722
1723type WSAProtocolInfo struct {
1724	ServiceFlags1     uint32
1725	ServiceFlags2     uint32
1726	ServiceFlags3     uint32
1727	ServiceFlags4     uint32
1728	ProviderFlags     uint32
1729	ProviderId        GUID
1730	CatalogEntryId    uint32
1731	ProtocolChain     WSAProtocolChain
1732	Version           int32
1733	AddressFamily     int32
1734	MaxSockAddr       int32
1735	MinSockAddr       int32
1736	SocketType        int32
1737	Protocol          int32
1738	ProtocolMaxOffset int32
1739	NetworkByteOrder  int32
1740	SecurityScheme    int32
1741	MessageSize       uint32
1742	ProviderReserved  uint32
1743	ProtocolName      [WSAPROTOCOL_LEN + 1]uint16
1744}
1745
1746type WSAProtocolChain struct {
1747	ChainLen     int32
1748	ChainEntries [MAX_PROTOCOL_CHAIN]uint32
1749}
1750
1751type TCPKeepalive struct {
1752	OnOff    uint32
1753	Time     uint32
1754	Interval uint32
1755}
1756
1757type symbolicLinkReparseBuffer struct {
1758	SubstituteNameOffset uint16
1759	SubstituteNameLength uint16
1760	PrintNameOffset      uint16
1761	PrintNameLength      uint16
1762	Flags                uint32
1763	PathBuffer           [1]uint16
1764}
1765
1766type mountPointReparseBuffer struct {
1767	SubstituteNameOffset uint16
1768	SubstituteNameLength uint16
1769	PrintNameOffset      uint16
1770	PrintNameLength      uint16
1771	PathBuffer           [1]uint16
1772}
1773
1774type reparseDataBuffer struct {
1775	ReparseTag        uint32
1776	ReparseDataLength uint16
1777	Reserved          uint16
1778
1779	// GenericReparseBuffer
1780	reparseBuffer byte
1781}
1782
1783const (
1784	FSCTL_GET_REPARSE_POINT          = 0x900A8
1785	MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024
1786	IO_REPARSE_TAG_MOUNT_POINT       = 0xA0000003
1787	IO_REPARSE_TAG_SYMLINK           = 0xA000000C
1788	SYMBOLIC_LINK_FLAG_DIRECTORY     = 0x1
1789)
1790
1791const (
1792	ComputerNameNetBIOS                   = 0
1793	ComputerNameDnsHostname               = 1
1794	ComputerNameDnsDomain                 = 2
1795	ComputerNameDnsFullyQualified         = 3
1796	ComputerNamePhysicalNetBIOS           = 4
1797	ComputerNamePhysicalDnsHostname       = 5
1798	ComputerNamePhysicalDnsDomain         = 6
1799	ComputerNamePhysicalDnsFullyQualified = 7
1800	ComputerNameMax                       = 8
1801)
1802
1803// For MessageBox()
1804const (
1805	MB_OK                   = 0x00000000
1806	MB_OKCANCEL             = 0x00000001
1807	MB_ABORTRETRYIGNORE     = 0x00000002
1808	MB_YESNOCANCEL          = 0x00000003
1809	MB_YESNO                = 0x00000004
1810	MB_RETRYCANCEL          = 0x00000005
1811	MB_CANCELTRYCONTINUE    = 0x00000006
1812	MB_ICONHAND             = 0x00000010
1813	MB_ICONQUESTION         = 0x00000020
1814	MB_ICONEXCLAMATION      = 0x00000030
1815	MB_ICONASTERISK         = 0x00000040
1816	MB_USERICON             = 0x00000080
1817	MB_ICONWARNING          = MB_ICONEXCLAMATION
1818	MB_ICONERROR            = MB_ICONHAND
1819	MB_ICONINFORMATION      = MB_ICONASTERISK
1820	MB_ICONSTOP             = MB_ICONHAND
1821	MB_DEFBUTTON1           = 0x00000000
1822	MB_DEFBUTTON2           = 0x00000100
1823	MB_DEFBUTTON3           = 0x00000200
1824	MB_DEFBUTTON4           = 0x00000300
1825	MB_APPLMODAL            = 0x00000000
1826	MB_SYSTEMMODAL          = 0x00001000
1827	MB_TASKMODAL            = 0x00002000
1828	MB_HELP                 = 0x00004000
1829	MB_NOFOCUS              = 0x00008000
1830	MB_SETFOREGROUND        = 0x00010000
1831	MB_DEFAULT_DESKTOP_ONLY = 0x00020000
1832	MB_TOPMOST              = 0x00040000
1833	MB_RIGHT                = 0x00080000
1834	MB_RTLREADING           = 0x00100000
1835	MB_SERVICE_NOTIFICATION = 0x00200000
1836)
1837
1838const (
1839	MOVEFILE_REPLACE_EXISTING      = 0x1
1840	MOVEFILE_COPY_ALLOWED          = 0x2
1841	MOVEFILE_DELAY_UNTIL_REBOOT    = 0x4
1842	MOVEFILE_WRITE_THROUGH         = 0x8
1843	MOVEFILE_CREATE_HARDLINK       = 0x10
1844	MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
1845)
1846
1847const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
1848
1849const (
1850	IF_TYPE_OTHER              = 1
1851	IF_TYPE_ETHERNET_CSMACD    = 6
1852	IF_TYPE_ISO88025_TOKENRING = 9
1853	IF_TYPE_PPP                = 23
1854	IF_TYPE_SOFTWARE_LOOPBACK  = 24
1855	IF_TYPE_ATM                = 37
1856	IF_TYPE_IEEE80211          = 71
1857	IF_TYPE_TUNNEL             = 131
1858	IF_TYPE_IEEE1394           = 144
1859)
1860
1861type SocketAddress struct {
1862	Sockaddr       *syscall.RawSockaddrAny
1863	SockaddrLength int32
1864}
1865
1866// IP returns an IPv4 or IPv6 address, or nil if the underlying SocketAddress is neither.
1867func (addr *SocketAddress) IP() net.IP {
1868	if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet4{}) && addr.Sockaddr.Addr.Family == AF_INET {
1869		return (*RawSockaddrInet4)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
1870	} else if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet6{}) && addr.Sockaddr.Addr.Family == AF_INET6 {
1871		return (*RawSockaddrInet6)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
1872	}
1873	return nil
1874}
1875
1876type IpAdapterUnicastAddress struct {
1877	Length             uint32
1878	Flags              uint32
1879	Next               *IpAdapterUnicastAddress
1880	Address            SocketAddress
1881	PrefixOrigin       int32
1882	SuffixOrigin       int32
1883	DadState           int32
1884	ValidLifetime      uint32
1885	PreferredLifetime  uint32
1886	LeaseLifetime      uint32
1887	OnLinkPrefixLength uint8
1888}
1889
1890type IpAdapterAnycastAddress struct {
1891	Length  uint32
1892	Flags   uint32
1893	Next    *IpAdapterAnycastAddress
1894	Address SocketAddress
1895}
1896
1897type IpAdapterMulticastAddress struct {
1898	Length  uint32
1899	Flags   uint32
1900	Next    *IpAdapterMulticastAddress
1901	Address SocketAddress
1902}
1903
1904type IpAdapterDnsServerAdapter struct {
1905	Length   uint32
1906	Reserved uint32
1907	Next     *IpAdapterDnsServerAdapter
1908	Address  SocketAddress
1909}
1910
1911type IpAdapterPrefix struct {
1912	Length       uint32
1913	Flags        uint32
1914	Next         *IpAdapterPrefix
1915	Address      SocketAddress
1916	PrefixLength uint32
1917}
1918
1919type IpAdapterAddresses struct {
1920	Length                uint32
1921	IfIndex               uint32
1922	Next                  *IpAdapterAddresses
1923	AdapterName           *byte
1924	FirstUnicastAddress   *IpAdapterUnicastAddress
1925	FirstAnycastAddress   *IpAdapterAnycastAddress
1926	FirstMulticastAddress *IpAdapterMulticastAddress
1927	FirstDnsServerAddress *IpAdapterDnsServerAdapter
1928	DnsSuffix             *uint16
1929	Description           *uint16
1930	FriendlyName          *uint16
1931	PhysicalAddress       [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
1932	PhysicalAddressLength uint32
1933	Flags                 uint32
1934	Mtu                   uint32
1935	IfType                uint32
1936	OperStatus            uint32
1937	Ipv6IfIndex           uint32
1938	ZoneIndices           [16]uint32
1939	FirstPrefix           *IpAdapterPrefix
1940	/* more fields might be present here. */
1941}
1942
1943const (
1944	IfOperStatusUp             = 1
1945	IfOperStatusDown           = 2
1946	IfOperStatusTesting        = 3
1947	IfOperStatusUnknown        = 4
1948	IfOperStatusDormant        = 5
1949	IfOperStatusNotPresent     = 6
1950	IfOperStatusLowerLayerDown = 7
1951)
1952
1953// Console related constants used for the mode parameter to SetConsoleMode. See
1954// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
1955
1956const (
1957	ENABLE_PROCESSED_INPUT        = 0x1
1958	ENABLE_LINE_INPUT             = 0x2
1959	ENABLE_ECHO_INPUT             = 0x4
1960	ENABLE_WINDOW_INPUT           = 0x8
1961	ENABLE_MOUSE_INPUT            = 0x10
1962	ENABLE_INSERT_MODE            = 0x20
1963	ENABLE_QUICK_EDIT_MODE        = 0x40
1964	ENABLE_EXTENDED_FLAGS         = 0x80
1965	ENABLE_AUTO_POSITION          = 0x100
1966	ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200
1967
1968	ENABLE_PROCESSED_OUTPUT            = 0x1
1969	ENABLE_WRAP_AT_EOL_OUTPUT          = 0x2
1970	ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
1971	DISABLE_NEWLINE_AUTO_RETURN        = 0x8
1972	ENABLE_LVB_GRID_WORLDWIDE          = 0x10
1973)
1974
1975type Coord struct {
1976	X int16
1977	Y int16
1978}
1979
1980type SmallRect struct {
1981	Left   int16
1982	Top    int16
1983	Right  int16
1984	Bottom int16
1985}
1986
1987// Used with GetConsoleScreenBuffer to retrieve information about a console
1988// screen buffer. See
1989// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str
1990// for details.
1991
1992type ConsoleScreenBufferInfo struct {
1993	Size              Coord
1994	CursorPosition    Coord
1995	Attributes        uint16
1996	Window            SmallRect
1997	MaximumWindowSize Coord
1998}
1999
2000const UNIX_PATH_MAX = 108 // defined in afunix.h
2001
2002const (
2003	// flags for JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags
2004	JOB_OBJECT_LIMIT_ACTIVE_PROCESS             = 0x00000008
2005	JOB_OBJECT_LIMIT_AFFINITY                   = 0x00000010
2006	JOB_OBJECT_LIMIT_BREAKAWAY_OK               = 0x00000800
2007	JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400
2008	JOB_OBJECT_LIMIT_JOB_MEMORY                 = 0x00000200
2009	JOB_OBJECT_LIMIT_JOB_TIME                   = 0x00000004
2010	JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE          = 0x00002000
2011	JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME          = 0x00000040
2012	JOB_OBJECT_LIMIT_PRIORITY_CLASS             = 0x00000020
2013	JOB_OBJECT_LIMIT_PROCESS_MEMORY             = 0x00000100
2014	JOB_OBJECT_LIMIT_PROCESS_TIME               = 0x00000002
2015	JOB_OBJECT_LIMIT_SCHEDULING_CLASS           = 0x00000080
2016	JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK        = 0x00001000
2017	JOB_OBJECT_LIMIT_SUBSET_AFFINITY            = 0x00004000
2018	JOB_OBJECT_LIMIT_WORKINGSET                 = 0x00000001
2019)
2020
2021type IO_COUNTERS struct {
2022	ReadOperationCount  uint64
2023	WriteOperationCount uint64
2024	OtherOperationCount uint64
2025	ReadTransferCount   uint64
2026	WriteTransferCount  uint64
2027	OtherTransferCount  uint64
2028}
2029
2030type JOBOBJECT_EXTENDED_LIMIT_INFORMATION struct {
2031	BasicLimitInformation JOBOBJECT_BASIC_LIMIT_INFORMATION
2032	IoInfo                IO_COUNTERS
2033	ProcessMemoryLimit    uintptr
2034	JobMemoryLimit        uintptr
2035	PeakProcessMemoryUsed uintptr
2036	PeakJobMemoryUsed     uintptr
2037}
2038
2039const (
2040	// UIRestrictionsClass
2041	JOB_OBJECT_UILIMIT_DESKTOP          = 0x00000040
2042	JOB_OBJECT_UILIMIT_DISPLAYSETTINGS  = 0x00000010
2043	JOB_OBJECT_UILIMIT_EXITWINDOWS      = 0x00000080
2044	JOB_OBJECT_UILIMIT_GLOBALATOMS      = 0x00000020
2045	JOB_OBJECT_UILIMIT_HANDLES          = 0x00000001
2046	JOB_OBJECT_UILIMIT_READCLIPBOARD    = 0x00000002
2047	JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x00000008
2048	JOB_OBJECT_UILIMIT_WRITECLIPBOARD   = 0x00000004
2049)
2050
2051type JOBOBJECT_BASIC_UI_RESTRICTIONS struct {
2052	UIRestrictionsClass uint32
2053}
2054
2055const (
2056	// JobObjectInformationClass
2057	JobObjectAssociateCompletionPortInformation = 7
2058	JobObjectBasicLimitInformation              = 2
2059	JobObjectBasicUIRestrictions                = 4
2060	JobObjectCpuRateControlInformation          = 15
2061	JobObjectEndOfJobTimeInformation            = 6
2062	JobObjectExtendedLimitInformation           = 9
2063	JobObjectGroupInformation                   = 11
2064	JobObjectGroupInformationEx                 = 14
2065	JobObjectLimitViolationInformation2         = 35
2066	JobObjectNetRateControlInformation          = 32
2067	JobObjectNotificationLimitInformation       = 12
2068	JobObjectNotificationLimitInformation2      = 34
2069	JobObjectSecurityLimitInformation           = 5
2070)
2071
2072const (
2073	KF_FLAG_DEFAULT                          = 0x00000000
2074	KF_FLAG_FORCE_APP_DATA_REDIRECTION       = 0x00080000
2075	KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET = 0x00040000
2076	KF_FLAG_FORCE_PACKAGE_REDIRECTION        = 0x00020000
2077	KF_FLAG_NO_PACKAGE_REDIRECTION           = 0x00010000
2078	KF_FLAG_FORCE_APPCONTAINER_REDIRECTION   = 0x00020000
2079	KF_FLAG_NO_APPCONTAINER_REDIRECTION      = 0x00010000
2080	KF_FLAG_CREATE                           = 0x00008000
2081	KF_FLAG_DONT_VERIFY                      = 0x00004000
2082	KF_FLAG_DONT_UNEXPAND                    = 0x00002000
2083	KF_FLAG_NO_ALIAS                         = 0x00001000
2084	KF_FLAG_INIT                             = 0x00000800
2085	KF_FLAG_DEFAULT_PATH                     = 0x00000400
2086	KF_FLAG_NOT_PARENT_RELATIVE              = 0x00000200
2087	KF_FLAG_SIMPLE_IDLIST                    = 0x00000100
2088	KF_FLAG_ALIAS_ONLY                       = 0x80000000
2089)
2090
2091type OsVersionInfoEx struct {
2092	osVersionInfoSize uint32
2093	MajorVersion      uint32
2094	MinorVersion      uint32
2095	BuildNumber       uint32
2096	PlatformId        uint32
2097	CsdVersion        [128]uint16
2098	ServicePackMajor  uint16
2099	ServicePackMinor  uint16
2100	SuiteMask         uint16
2101	ProductType       byte
2102	_                 byte
2103}
2104
2105const (
2106	EWX_LOGOFF          = 0x00000000
2107	EWX_SHUTDOWN        = 0x00000001
2108	EWX_REBOOT          = 0x00000002
2109	EWX_FORCE           = 0x00000004
2110	EWX_POWEROFF        = 0x00000008
2111	EWX_FORCEIFHUNG     = 0x00000010
2112	EWX_QUICKRESOLVE    = 0x00000020
2113	EWX_RESTARTAPPS     = 0x00000040
2114	EWX_HYBRID_SHUTDOWN = 0x00400000
2115	EWX_BOOTOPTIONS     = 0x01000000
2116
2117	SHTDN_REASON_FLAG_COMMENT_REQUIRED          = 0x01000000
2118	SHTDN_REASON_FLAG_DIRTY_PROBLEM_ID_REQUIRED = 0x02000000
2119	SHTDN_REASON_FLAG_CLEAN_UI                  = 0x04000000
2120	SHTDN_REASON_FLAG_DIRTY_UI                  = 0x08000000
2121	SHTDN_REASON_FLAG_USER_DEFINED              = 0x40000000
2122	SHTDN_REASON_FLAG_PLANNED                   = 0x80000000
2123	SHTDN_REASON_MAJOR_OTHER                    = 0x00000000
2124	SHTDN_REASON_MAJOR_NONE                     = 0x00000000
2125	SHTDN_REASON_MAJOR_HARDWARE                 = 0x00010000
2126	SHTDN_REASON_MAJOR_OPERATINGSYSTEM          = 0x00020000
2127	SHTDN_REASON_MAJOR_SOFTWARE                 = 0x00030000
2128	SHTDN_REASON_MAJOR_APPLICATION              = 0x00040000
2129	SHTDN_REASON_MAJOR_SYSTEM                   = 0x00050000
2130	SHTDN_REASON_MAJOR_POWER                    = 0x00060000
2131	SHTDN_REASON_MAJOR_LEGACY_API               = 0x00070000
2132	SHTDN_REASON_MINOR_OTHER                    = 0x00000000
2133	SHTDN_REASON_MINOR_NONE                     = 0x000000ff
2134	SHTDN_REASON_MINOR_MAINTENANCE              = 0x00000001
2135	SHTDN_REASON_MINOR_INSTALLATION             = 0x00000002
2136	SHTDN_REASON_MINOR_UPGRADE                  = 0x00000003
2137	SHTDN_REASON_MINOR_RECONFIG                 = 0x00000004
2138	SHTDN_REASON_MINOR_HUNG                     = 0x00000005
2139	SHTDN_REASON_MINOR_UNSTABLE                 = 0x00000006
2140	SHTDN_REASON_MINOR_DISK                     = 0x00000007
2141	SHTDN_REASON_MINOR_PROCESSOR                = 0x00000008
2142	SHTDN_REASON_MINOR_NETWORKCARD              = 0x00000009
2143	SHTDN_REASON_MINOR_POWER_SUPPLY             = 0x0000000a
2144	SHTDN_REASON_MINOR_CORDUNPLUGGED            = 0x0000000b
2145	SHTDN_REASON_MINOR_ENVIRONMENT              = 0x0000000c
2146	SHTDN_REASON_MINOR_HARDWARE_DRIVER          = 0x0000000d
2147	SHTDN_REASON_MINOR_OTHERDRIVER              = 0x0000000e
2148	SHTDN_REASON_MINOR_BLUESCREEN               = 0x0000000F
2149	SHTDN_REASON_MINOR_SERVICEPACK              = 0x00000010
2150	SHTDN_REASON_MINOR_HOTFIX                   = 0x00000011
2151	SHTDN_REASON_MINOR_SECURITYFIX              = 0x00000012
2152	SHTDN_REASON_MINOR_SECURITY                 = 0x00000013
2153	SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY     = 0x00000014
2154	SHTDN_REASON_MINOR_WMI                      = 0x00000015
2155	SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL    = 0x00000016
2156	SHTDN_REASON_MINOR_HOTFIX_UNINSTALL         = 0x00000017
2157	SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL    = 0x00000018
2158	SHTDN_REASON_MINOR_MMC                      = 0x00000019
2159	SHTDN_REASON_MINOR_SYSTEMRESTORE            = 0x0000001a
2160	SHTDN_REASON_MINOR_TERMSRV                  = 0x00000020
2161	SHTDN_REASON_MINOR_DC_PROMOTION             = 0x00000021
2162	SHTDN_REASON_MINOR_DC_DEMOTION              = 0x00000022
2163	SHTDN_REASON_UNKNOWN                        = SHTDN_REASON_MINOR_NONE
2164	SHTDN_REASON_LEGACY_API                     = SHTDN_REASON_MAJOR_LEGACY_API | SHTDN_REASON_FLAG_PLANNED
2165	SHTDN_REASON_VALID_BIT_MASK                 = 0xc0ffffff
2166
2167	SHUTDOWN_NORETRY = 0x1
2168)
2169
2170// Flags used for GetModuleHandleEx
2171const (
2172	GET_MODULE_HANDLE_EX_FLAG_PIN                = 1
2173	GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 2
2174	GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS       = 4
2175)
2176
2177// MUI function flag values
2178const (
2179	MUI_LANGUAGE_ID                    = 0x4
2180	MUI_LANGUAGE_NAME                  = 0x8
2181	MUI_MERGE_SYSTEM_FALLBACK          = 0x10
2182	MUI_MERGE_USER_FALLBACK            = 0x20
2183	MUI_UI_FALLBACK                    = MUI_MERGE_SYSTEM_FALLBACK | MUI_MERGE_USER_FALLBACK
2184	MUI_THREAD_LANGUAGES               = 0x40
2185	MUI_CONSOLE_FILTER                 = 0x100
2186	MUI_COMPLEX_SCRIPT_FILTER          = 0x200
2187	MUI_RESET_FILTERS                  = 0x001
2188	MUI_USER_PREFERRED_UI_LANGUAGES    = 0x10
2189	MUI_USE_INSTALLED_LANGUAGES        = 0x20
2190	MUI_USE_SEARCH_ALL_LANGUAGES       = 0x40
2191	MUI_LANG_NEUTRAL_PE_FILE           = 0x100
2192	MUI_NON_LANG_NEUTRAL_FILE          = 0x200
2193	MUI_MACHINE_LANGUAGE_SETTINGS      = 0x400
2194	MUI_FILETYPE_NOT_LANGUAGE_NEUTRAL  = 0x001
2195	MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN = 0x002
2196	MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI  = 0x004
2197	MUI_QUERY_TYPE                     = 0x001
2198	MUI_QUERY_CHECKSUM                 = 0x002
2199	MUI_QUERY_LANGUAGE_NAME            = 0x004
2200	MUI_QUERY_RESOURCE_TYPES           = 0x008
2201	MUI_FILEINFO_VERSION               = 0x001
2202
2203	MUI_FULL_LANGUAGE      = 0x01
2204	MUI_PARTIAL_LANGUAGE   = 0x02
2205	MUI_LIP_LANGUAGE       = 0x04
2206	MUI_LANGUAGE_INSTALLED = 0x20
2207	MUI_LANGUAGE_LICENSED  = 0x40
2208)
2209
2210// FILE_INFO_BY_HANDLE_CLASS constants for SetFileInformationByHandle/GetFileInformationByHandleEx
2211const (
2212	FileBasicInfo                  = 0
2213	FileStandardInfo               = 1
2214	FileNameInfo                   = 2
2215	FileRenameInfo                 = 3
2216	FileDispositionInfo            = 4
2217	FileAllocationInfo             = 5
2218	FileEndOfFileInfo              = 6
2219	FileStreamInfo                 = 7
2220	FileCompressionInfo            = 8
2221	FileAttributeTagInfo           = 9
2222	FileIdBothDirectoryInfo        = 10
2223	FileIdBothDirectoryRestartInfo = 11
2224	FileIoPriorityHintInfo         = 12
2225	FileRemoteProtocolInfo         = 13
2226	FileFullDirectoryInfo          = 14
2227	FileFullDirectoryRestartInfo   = 15
2228	FileStorageInfo                = 16
2229	FileAlignmentInfo              = 17
2230	FileIdInfo                     = 18
2231	FileIdExtdDirectoryInfo        = 19
2232	FileIdExtdDirectoryRestartInfo = 20
2233	FileDispositionInfoEx          = 21
2234	FileRenameInfoEx               = 22
2235	FileCaseSensitiveInfo          = 23
2236	FileNormalizedNameInfo         = 24
2237)
2238
2239// LoadLibrary flags for determining from where to search for a DLL
2240const (
2241	DONT_RESOLVE_DLL_REFERENCES               = 0x1
2242	LOAD_LIBRARY_AS_DATAFILE                  = 0x2
2243	LOAD_WITH_ALTERED_SEARCH_PATH             = 0x8
2244	LOAD_IGNORE_CODE_AUTHZ_LEVEL              = 0x10
2245	LOAD_LIBRARY_AS_IMAGE_RESOURCE            = 0x20
2246	LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE        = 0x40
2247	LOAD_LIBRARY_REQUIRE_SIGNED_TARGET        = 0x80
2248	LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR          = 0x100
2249	LOAD_LIBRARY_SEARCH_APPLICATION_DIR       = 0x200
2250	LOAD_LIBRARY_SEARCH_USER_DIRS             = 0x400
2251	LOAD_LIBRARY_SEARCH_SYSTEM32              = 0x800
2252	LOAD_LIBRARY_SEARCH_DEFAULT_DIRS          = 0x1000
2253	LOAD_LIBRARY_SAFE_CURRENT_DIRS            = 0x00002000
2254	LOAD_LIBRARY_SEARCH_SYSTEM32_NO_FORWARDER = 0x00004000
2255	LOAD_LIBRARY_OS_INTEGRITY_CONTINUITY      = 0x00008000
2256)
2257
2258// RegNotifyChangeKeyValue notifyFilter flags.
2259const (
2260	// REG_NOTIFY_CHANGE_NAME notifies the caller if a subkey is added or deleted.
2261	REG_NOTIFY_CHANGE_NAME = 0x00000001
2262
2263	// REG_NOTIFY_CHANGE_ATTRIBUTES notifies the caller of changes to the attributes of the key, such as the security descriptor information.
2264	REG_NOTIFY_CHANGE_ATTRIBUTES = 0x00000002
2265
2266	// 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.
2267	REG_NOTIFY_CHANGE_LAST_SET = 0x00000004
2268
2269	// REG_NOTIFY_CHANGE_SECURITY notifies the caller of changes to the security descriptor of the key.
2270	REG_NOTIFY_CHANGE_SECURITY = 0x00000008
2271
2272	// 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.
2273	REG_NOTIFY_THREAD_AGNOSTIC = 0x10000000
2274)
2275
2276type CommTimeouts struct {
2277	ReadIntervalTimeout         uint32
2278	ReadTotalTimeoutMultiplier  uint32
2279	ReadTotalTimeoutConstant    uint32
2280	WriteTotalTimeoutMultiplier uint32
2281	WriteTotalTimeoutConstant   uint32
2282}
2283
2284// NTUnicodeString is a UTF-16 string for NT native APIs, corresponding to UNICODE_STRING.
2285type NTUnicodeString struct {
2286	Length        uint16
2287	MaximumLength uint16
2288	Buffer        *uint16
2289}
2290
2291// NTString is an ANSI string for NT native APIs, corresponding to STRING.
2292type NTString struct {
2293	Length        uint16
2294	MaximumLength uint16
2295	Buffer        *byte
2296}
2297
2298type LIST_ENTRY struct {
2299	Flink *LIST_ENTRY
2300	Blink *LIST_ENTRY
2301}
2302
2303type LDR_DATA_TABLE_ENTRY struct {
2304	reserved1          [2]uintptr
2305	InMemoryOrderLinks LIST_ENTRY
2306	reserved2          [2]uintptr
2307	DllBase            uintptr
2308	reserved3          [2]uintptr
2309	FullDllName        NTUnicodeString
2310	reserved4          [8]byte
2311	reserved5          [3]uintptr
2312	reserved6          uintptr
2313	TimeDateStamp      uint32
2314}
2315
2316type PEB_LDR_DATA struct {
2317	reserved1               [8]byte
2318	reserved2               [3]uintptr
2319	InMemoryOrderModuleList LIST_ENTRY
2320}
2321
2322type CURDIR struct {
2323	DosPath NTUnicodeString
2324	Handle  Handle
2325}
2326
2327type RTL_DRIVE_LETTER_CURDIR struct {
2328	Flags     uint16
2329	Length    uint16
2330	TimeStamp uint32
2331	DosPath   NTString
2332}
2333
2334type RTL_USER_PROCESS_PARAMETERS struct {
2335	MaximumLength, Length uint32
2336
2337	Flags, DebugFlags uint32
2338
2339	ConsoleHandle                                Handle
2340	ConsoleFlags                                 uint32
2341	StandardInput, StandardOutput, StandardError Handle
2342
2343	CurrentDirectory CURDIR
2344	DllPath          NTUnicodeString
2345	ImagePathName    NTUnicodeString
2346	CommandLine      NTUnicodeString
2347	Environment      unsafe.Pointer
2348
2349	StartingX, StartingY, CountX, CountY, CountCharsX, CountCharsY, FillAttribute uint32
2350
2351	WindowFlags, ShowWindowFlags                     uint32
2352	WindowTitle, DesktopInfo, ShellInfo, RuntimeData NTUnicodeString
2353	CurrentDirectories                               [32]RTL_DRIVE_LETTER_CURDIR
2354
2355	EnvironmentSize, EnvironmentVersion uintptr
2356
2357	PackageDependencyData unsafe.Pointer
2358	ProcessGroupId        uint32
2359	LoaderThreads         uint32
2360
2361	RedirectionDllName               NTUnicodeString
2362	HeapPartitionName                NTUnicodeString
2363	DefaultThreadpoolCpuSetMasks     uintptr
2364	DefaultThreadpoolCpuSetMaskCount uint32
2365}
2366
2367type PEB struct {
2368	reserved1              [2]byte
2369	BeingDebugged          byte
2370	BitField               byte
2371	reserved3              uintptr
2372	ImageBaseAddress       uintptr
2373	Ldr                    *PEB_LDR_DATA
2374	ProcessParameters      *RTL_USER_PROCESS_PARAMETERS
2375	reserved4              [3]uintptr
2376	AtlThunkSListPtr       uintptr
2377	reserved5              uintptr
2378	reserved6              uint32
2379	reserved7              uintptr
2380	reserved8              uint32
2381	AtlThunkSListPtr32     uint32
2382	reserved9              [45]uintptr
2383	reserved10             [96]byte
2384	PostProcessInitRoutine uintptr
2385	reserved11             [128]byte
2386	reserved12             [1]uintptr
2387	SessionId              uint32
2388}
2389
2390type OBJECT_ATTRIBUTES struct {
2391	Length             uint32
2392	RootDirectory      Handle
2393	ObjectName         *NTUnicodeString
2394	Attributes         uint32
2395	SecurityDescriptor *SECURITY_DESCRIPTOR
2396	SecurityQoS        *SECURITY_QUALITY_OF_SERVICE
2397}
2398
2399// Values for the Attributes member of OBJECT_ATTRIBUTES.
2400const (
2401	OBJ_INHERIT                       = 0x00000002
2402	OBJ_PERMANENT                     = 0x00000010
2403	OBJ_EXCLUSIVE                     = 0x00000020
2404	OBJ_CASE_INSENSITIVE              = 0x00000040
2405	OBJ_OPENIF                        = 0x00000080
2406	OBJ_OPENLINK                      = 0x00000100
2407	OBJ_KERNEL_HANDLE                 = 0x00000200
2408	OBJ_FORCE_ACCESS_CHECK            = 0x00000400
2409	OBJ_IGNORE_IMPERSONATED_DEVICEMAP = 0x00000800
2410	OBJ_DONT_REPARSE                  = 0x00001000
2411	OBJ_VALID_ATTRIBUTES              = 0x00001FF2
2412)
2413
2414type IO_STATUS_BLOCK struct {
2415	Status      NTStatus
2416	Information uintptr
2417}
2418
2419type RTLP_CURDIR_REF struct {
2420	RefCount int32
2421	Handle   Handle
2422}
2423
2424type RTL_RELATIVE_NAME struct {
2425	RelativeName        NTUnicodeString
2426	ContainingDirectory Handle
2427	CurDirRef           *RTLP_CURDIR_REF
2428}
2429
2430const (
2431	// CreateDisposition flags for NtCreateFile and NtCreateNamedPipeFile.
2432	FILE_SUPERSEDE           = 0x00000000
2433	FILE_OPEN                = 0x00000001
2434	FILE_CREATE              = 0x00000002
2435	FILE_OPEN_IF             = 0x00000003
2436	FILE_OVERWRITE           = 0x00000004
2437	FILE_OVERWRITE_IF        = 0x00000005
2438	FILE_MAXIMUM_DISPOSITION = 0x00000005
2439
2440	// CreateOptions flags for NtCreateFile and NtCreateNamedPipeFile.
2441	FILE_DIRECTORY_FILE            = 0x00000001
2442	FILE_WRITE_THROUGH             = 0x00000002
2443	FILE_SEQUENTIAL_ONLY           = 0x00000004
2444	FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008
2445	FILE_SYNCHRONOUS_IO_ALERT      = 0x00000010
2446	FILE_SYNCHRONOUS_IO_NONALERT   = 0x00000020
2447	FILE_NON_DIRECTORY_FILE        = 0x00000040
2448	FILE_CREATE_TREE_CONNECTION    = 0x00000080
2449	FILE_COMPLETE_IF_OPLOCKED      = 0x00000100
2450	FILE_NO_EA_KNOWLEDGE           = 0x00000200
2451	FILE_OPEN_REMOTE_INSTANCE      = 0x00000400
2452	FILE_RANDOM_ACCESS             = 0x00000800
2453	FILE_DELETE_ON_CLOSE           = 0x00001000
2454	FILE_OPEN_BY_FILE_ID           = 0x00002000
2455	FILE_OPEN_FOR_BACKUP_INTENT    = 0x00004000
2456	FILE_NO_COMPRESSION            = 0x00008000
2457	FILE_OPEN_REQUIRING_OPLOCK     = 0x00010000
2458	FILE_DISALLOW_EXCLUSIVE        = 0x00020000
2459	FILE_RESERVE_OPFILTER          = 0x00100000
2460	FILE_OPEN_REPARSE_POINT        = 0x00200000
2461	FILE_OPEN_NO_RECALL            = 0x00400000
2462	FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
2463
2464	// Parameter constants for NtCreateNamedPipeFile.
2465
2466	FILE_PIPE_BYTE_STREAM_TYPE = 0x00000000
2467	FILE_PIPE_MESSAGE_TYPE     = 0x00000001
2468
2469	FILE_PIPE_ACCEPT_REMOTE_CLIENTS = 0x00000000
2470	FILE_PIPE_REJECT_REMOTE_CLIENTS = 0x00000002
2471
2472	FILE_PIPE_TYPE_VALID_MASK = 0x00000003
2473
2474	FILE_PIPE_BYTE_STREAM_MODE = 0x00000000
2475	FILE_PIPE_MESSAGE_MODE     = 0x00000001
2476
2477	FILE_PIPE_QUEUE_OPERATION    = 0x00000000
2478	FILE_PIPE_COMPLETE_OPERATION = 0x00000001
2479
2480	FILE_PIPE_INBOUND     = 0x00000000
2481	FILE_PIPE_OUTBOUND    = 0x00000001
2482	FILE_PIPE_FULL_DUPLEX = 0x00000002
2483
2484	FILE_PIPE_DISCONNECTED_STATE = 0x00000001
2485	FILE_PIPE_LISTENING_STATE    = 0x00000002
2486	FILE_PIPE_CONNECTED_STATE    = 0x00000003
2487	FILE_PIPE_CLOSING_STATE      = 0x00000004
2488
2489	FILE_PIPE_CLIENT_END = 0x00000000
2490	FILE_PIPE_SERVER_END = 0x00000001
2491)
2492
2493// ProcessInformationClasses for NtQueryInformationProcess and NtSetInformationProcess.
2494const (
2495	ProcessBasicInformation = iota
2496	ProcessQuotaLimits
2497	ProcessIoCounters
2498	ProcessVmCounters
2499	ProcessTimes
2500	ProcessBasePriority
2501	ProcessRaisePriority
2502	ProcessDebugPort
2503	ProcessExceptionPort
2504	ProcessAccessToken
2505	ProcessLdtInformation
2506	ProcessLdtSize
2507	ProcessDefaultHardErrorMode
2508	ProcessIoPortHandlers
2509	ProcessPooledUsageAndLimits
2510	ProcessWorkingSetWatch
2511	ProcessUserModeIOPL
2512	ProcessEnableAlignmentFaultFixup
2513	ProcessPriorityClass
2514	ProcessWx86Information
2515	ProcessHandleCount
2516	ProcessAffinityMask
2517	ProcessPriorityBoost
2518	ProcessDeviceMap
2519	ProcessSessionInformation
2520	ProcessForegroundInformation
2521	ProcessWow64Information
2522	ProcessImageFileName
2523	ProcessLUIDDeviceMapsEnabled
2524	ProcessBreakOnTermination
2525	ProcessDebugObjectHandle
2526	ProcessDebugFlags
2527	ProcessHandleTracing
2528	ProcessIoPriority
2529	ProcessExecuteFlags
2530	ProcessTlsInformation
2531	ProcessCookie
2532	ProcessImageInformation
2533	ProcessCycleTime
2534	ProcessPagePriority
2535	ProcessInstrumentationCallback
2536	ProcessThreadStackAllocation
2537	ProcessWorkingSetWatchEx
2538	ProcessImageFileNameWin32
2539	ProcessImageFileMapping
2540	ProcessAffinityUpdateMode
2541	ProcessMemoryAllocationMode
2542	ProcessGroupInformation
2543	ProcessTokenVirtualizationEnabled
2544	ProcessConsoleHostProcess
2545	ProcessWindowInformation
2546	ProcessHandleInformation
2547	ProcessMitigationPolicy
2548	ProcessDynamicFunctionTableInformation
2549	ProcessHandleCheckingMode
2550	ProcessKeepAliveCount
2551	ProcessRevokeFileHandles
2552	ProcessWorkingSetControl
2553	ProcessHandleTable
2554	ProcessCheckStackExtentsMode
2555	ProcessCommandLineInformation
2556	ProcessProtectionInformation
2557	ProcessMemoryExhaustion
2558	ProcessFaultInformation
2559	ProcessTelemetryIdInformation
2560	ProcessCommitReleaseInformation
2561	ProcessDefaultCpuSetsInformation
2562	ProcessAllowedCpuSetsInformation
2563	ProcessSubsystemProcess
2564	ProcessJobMemoryInformation
2565	ProcessInPrivate
2566	ProcessRaiseUMExceptionOnInvalidHandleClose
2567	ProcessIumChallengeResponse
2568	ProcessChildProcessInformation
2569	ProcessHighGraphicsPriorityInformation
2570	ProcessSubsystemInformation
2571	ProcessEnergyValues
2572	ProcessActivityThrottleState
2573	ProcessActivityThrottlePolicy
2574	ProcessWin32kSyscallFilterInformation
2575	ProcessDisableSystemAllowedCpuSets
2576	ProcessWakeInformation
2577	ProcessEnergyTrackingState
2578	ProcessManageWritesToExecutableMemory
2579	ProcessCaptureTrustletLiveDump
2580	ProcessTelemetryCoverage
2581	ProcessEnclaveInformation
2582	ProcessEnableReadWriteVmLogging
2583	ProcessUptimeInformation
2584	ProcessImageSection
2585	ProcessDebugAuthInformation
2586	ProcessSystemResourceManagement
2587	ProcessSequenceNumber
2588	ProcessLoaderDetour
2589	ProcessSecurityDomainInformation
2590	ProcessCombineSecurityDomainsInformation
2591	ProcessEnableLogging
2592	ProcessLeapSecondInformation
2593	ProcessFiberShadowStackAllocation
2594	ProcessFreeFiberShadowStackAllocation
2595	ProcessAltSystemCallInformation
2596	ProcessDynamicEHContinuationTargets
2597	ProcessDynamicEnforcedCetCompatibleRanges
2598)
2599
2600type PROCESS_BASIC_INFORMATION struct {
2601	ExitStatus                   NTStatus
2602	PebBaseAddress               *PEB
2603	AffinityMask                 uintptr
2604	BasePriority                 int32
2605	UniqueProcessId              uintptr
2606	InheritedFromUniqueProcessId uintptr
2607}
2608
2609// Constants for LocalAlloc flags.
2610const (
2611	LMEM_FIXED          = 0x0
2612	LMEM_MOVEABLE       = 0x2
2613	LMEM_NOCOMPACT      = 0x10
2614	LMEM_NODISCARD      = 0x20
2615	LMEM_ZEROINIT       = 0x40
2616	LMEM_MODIFY         = 0x80
2617	LMEM_DISCARDABLE    = 0xf00
2618	LMEM_VALID_FLAGS    = 0xf72
2619	LMEM_INVALID_HANDLE = 0x8000
2620	LHND                = LMEM_MOVEABLE | LMEM_ZEROINIT
2621	LPTR                = LMEM_FIXED | LMEM_ZEROINIT
2622	NONZEROLHND         = LMEM_MOVEABLE
2623	NONZEROLPTR         = LMEM_FIXED
2624)
2625
2626// Constants for the CreateNamedPipe-family of functions.
2627const (
2628	PIPE_ACCESS_INBOUND  = 0x1
2629	PIPE_ACCESS_OUTBOUND = 0x2
2630	PIPE_ACCESS_DUPLEX   = 0x3
2631
2632	PIPE_CLIENT_END = 0x0
2633	PIPE_SERVER_END = 0x1
2634
2635	PIPE_WAIT                  = 0x0
2636	PIPE_NOWAIT                = 0x1
2637	PIPE_READMODE_BYTE         = 0x0
2638	PIPE_READMODE_MESSAGE      = 0x2
2639	PIPE_TYPE_BYTE             = 0x0
2640	PIPE_TYPE_MESSAGE          = 0x4
2641	PIPE_ACCEPT_REMOTE_CLIENTS = 0x0
2642	PIPE_REJECT_REMOTE_CLIENTS = 0x8
2643
2644	PIPE_UNLIMITED_INSTANCES = 255
2645)
2646
2647// Constants for security attributes when opening named pipes.
2648const (
2649	SECURITY_ANONYMOUS      = SecurityAnonymous << 16
2650	SECURITY_IDENTIFICATION = SecurityIdentification << 16
2651	SECURITY_IMPERSONATION  = SecurityImpersonation << 16
2652	SECURITY_DELEGATION     = SecurityDelegation << 16
2653
2654	SECURITY_CONTEXT_TRACKING = 0x40000
2655	SECURITY_EFFECTIVE_ONLY   = 0x80000
2656
2657	SECURITY_SQOS_PRESENT     = 0x100000
2658	SECURITY_VALID_SQOS_FLAGS = 0x1f0000
2659)
2660
2661// ResourceID represents a 16-bit resource identifier, traditionally created with the MAKEINTRESOURCE macro.
2662type ResourceID uint16
2663
2664// ResourceIDOrString must be either a ResourceID, to specify a resource or resource type by ID,
2665// or a string, to specify a resource or resource type by name.
2666type ResourceIDOrString interface{}
2667
2668// Predefined resource names and types.
2669var (
2670	// Predefined names.
2671	CREATEPROCESS_MANIFEST_RESOURCE_ID                 ResourceID = 1
2672	ISOLATIONAWARE_MANIFEST_RESOURCE_ID                ResourceID = 2
2673	ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID ResourceID = 3
2674	ISOLATIONPOLICY_MANIFEST_RESOURCE_ID               ResourceID = 4
2675	ISOLATIONPOLICY_BROWSER_MANIFEST_RESOURCE_ID       ResourceID = 5
2676	MINIMUM_RESERVED_MANIFEST_RESOURCE_ID              ResourceID = 1  // inclusive
2677	MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID              ResourceID = 16 // inclusive
2678
2679	// Predefined types.
2680	RT_CURSOR       ResourceID = 1
2681	RT_BITMAP       ResourceID = 2
2682	RT_ICON         ResourceID = 3
2683	RT_MENU         ResourceID = 4
2684	RT_DIALOG       ResourceID = 5
2685	RT_STRING       ResourceID = 6
2686	RT_FONTDIR      ResourceID = 7
2687	RT_FONT         ResourceID = 8
2688	RT_ACCELERATOR  ResourceID = 9
2689	RT_RCDATA       ResourceID = 10
2690	RT_MESSAGETABLE ResourceID = 11
2691	RT_GROUP_CURSOR ResourceID = 12
2692	RT_GROUP_ICON   ResourceID = 14
2693	RT_VERSION      ResourceID = 16
2694	RT_DLGINCLUDE   ResourceID = 17
2695	RT_PLUGPLAY     ResourceID = 19
2696	RT_VXD          ResourceID = 20
2697	RT_ANICURSOR    ResourceID = 21
2698	RT_ANIICON      ResourceID = 22
2699	RT_HTML         ResourceID = 23
2700	RT_MANIFEST     ResourceID = 24
2701)
2702
2703type COAUTHIDENTITY struct {
2704	User           *uint16
2705	UserLength     uint32
2706	Domain         *uint16
2707	DomainLength   uint32
2708	Password       *uint16
2709	PasswordLength uint32
2710	Flags          uint32
2711}
2712
2713type COAUTHINFO struct {
2714	AuthnSvc           uint32
2715	AuthzSvc           uint32
2716	ServerPrincName    *uint16
2717	AuthnLevel         uint32
2718	ImpersonationLevel uint32
2719	AuthIdentityData   *COAUTHIDENTITY
2720	Capabilities       uint32
2721}
2722
2723type COSERVERINFO struct {
2724	Reserved1 uint32
2725	Aame      *uint16
2726	AuthInfo  *COAUTHINFO
2727	Reserved2 uint32
2728}
2729
2730type BIND_OPTS3 struct {
2731	CbStruct          uint32
2732	Flags             uint32
2733	Mode              uint32
2734	TickCountDeadline uint32
2735	TrackFlags        uint32
2736	ClassContext      uint32
2737	Locale            uint32
2738	ServerInfo        *COSERVERINFO
2739	Hwnd              HWND
2740}
2741
2742const (
2743	CLSCTX_INPROC_SERVER          = 0x1
2744	CLSCTX_INPROC_HANDLER         = 0x2
2745	CLSCTX_LOCAL_SERVER           = 0x4
2746	CLSCTX_INPROC_SERVER16        = 0x8
2747	CLSCTX_REMOTE_SERVER          = 0x10
2748	CLSCTX_INPROC_HANDLER16       = 0x20
2749	CLSCTX_RESERVED1              = 0x40
2750	CLSCTX_RESERVED2              = 0x80
2751	CLSCTX_RESERVED3              = 0x100
2752	CLSCTX_RESERVED4              = 0x200
2753	CLSCTX_NO_CODE_DOWNLOAD       = 0x400
2754	CLSCTX_RESERVED5              = 0x800
2755	CLSCTX_NO_CUSTOM_MARSHAL      = 0x1000
2756	CLSCTX_ENABLE_CODE_DOWNLOAD   = 0x2000
2757	CLSCTX_NO_FAILURE_LOG         = 0x4000
2758	CLSCTX_DISABLE_AAA            = 0x8000
2759	CLSCTX_ENABLE_AAA             = 0x10000
2760	CLSCTX_FROM_DEFAULT_CONTEXT   = 0x20000
2761	CLSCTX_ACTIVATE_32_BIT_SERVER = 0x40000
2762	CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000
2763	CLSCTX_ENABLE_CLOAKING        = 0x100000
2764	CLSCTX_APPCONTAINER           = 0x400000
2765	CLSCTX_ACTIVATE_AAA_AS_IU     = 0x800000
2766	CLSCTX_PS_DLL                 = 0x80000000
2767
2768	COINIT_MULTITHREADED     = 0x0
2769	COINIT_APARTMENTTHREADED = 0x2
2770	COINIT_DISABLE_OLE1DDE   = 0x4
2771	COINIT_SPEED_OVER_MEMORY = 0x8
2772)
2773
2774// Flag for QueryFullProcessImageName.
2775const PROCESS_NAME_NATIVE = 1
2776