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