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