xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/libdruntime/core/sys/windows/winnt.d (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW API for MS-Windows 3.12
5  *
6  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7  * Source: $(DRUNTIMESRC core/sys/windows/_winnt.d)
8  */
9 module core.sys.windows.winnt;
version(Windows)10 version (Windows):
11 @system:
12 
13 version (ANSI) {} else version = Unicode;
14 
15 public import core.sys.windows.basetsd, core.sys.windows.windef, core.sys.windows.winerror;
16 import core.sys.windows.w32api;
17 
18 /* Translation Notes:
19 The following macros are unneeded for D:
20 FIELD_OFFSET(t,f), CONTAINING_RECORD(address, type, field)
21 */
22 
23 alias void   VOID;
24 alias char   CHAR, CCHAR;
25 alias wchar  WCHAR;
26 alias bool   BOOLEAN;
27 alias byte   FCHAR;
28 alias ubyte  UCHAR;
29 alias short  SHORT;
30 alias ushort LANGID, FSHORT;
31 alias uint   LCID, FLONG, ACCESS_MASK;
32 alias long   LONGLONG, USN;
33 alias ulong  DWORDLONG, ULONGLONG;
34 
35 alias void*  PVOID, LPVOID;
36 alias char*  PSZ, PCHAR, PCCHAR, LPCH, PCH, LPSTR, PSTR;
37 alias wchar* PWCHAR, LPWCH, PWCH, LPWSTR, PWSTR;
38 alias bool*  PBOOLEAN;
39 alias ubyte* PUCHAR;
40 alias short* PSHORT;
41 alias int*   PLONG;
42 alias uint*  PLCID, PACCESS_MASK;
43 alias long*  PLONGLONG;
44 alias ulong* PDWORDLONG, PULONGLONG;
45 
46 // FIXME(MinGW) for __WIN64
47 alias void*  PVOID64;
48 
49 // const versions
50 alias const(char)*  PCCH, LPCCH, PCSTR, LPCSTR;
51 alias const(wchar)* LPCWCH, PCWCH, LPCWSTR, PCWSTR;
52 
53 alias PSTR* PZPSTR;
54 alias PWSTR* PZPWSTR;
55 
version(Unicode)56 version (Unicode) {
57     alias WCHAR TCHAR, _TCHAR;
58 } else {
59     alias CHAR TCHAR, _TCHAR;
60 }
61 
62 alias TCHAR         TBYTE;
63 alias TCHAR*        PTCH , PTBYTE, LPTCH , PTSTR , LPTSTR , LP, PTCHAR;
64 alias const(TCHAR)* PCTCH,         LPCTCH, PCTSTR, LPCTSTR            ;
65 
66 enum char ANSI_NULL = '\0';
67 enum wchar UNICODE_NULL = '\0';
68 
69 enum APPLICATION_ERROR_MASK       = 0x20000000;
70 enum ERROR_SEVERITY_SUCCESS       = 0x00000000;
71 enum ERROR_SEVERITY_INFORMATIONAL = 0x40000000;
72 enum ERROR_SEVERITY_WARNING       = 0x80000000;
73 enum ERROR_SEVERITY_ERROR         = 0xC0000000;
74 
75 // MinGW: also in ddk/ntifs.h
76 enum : USHORT {
77     COMPRESSION_FORMAT_NONE     = 0x0000,
78     COMPRESSION_FORMAT_DEFAULT  = 0x0001,
79     COMPRESSION_FORMAT_LZNT1    = 0x0002,
80     COMPRESSION_ENGINE_STANDARD = 0x0000,
81     COMPRESSION_ENGINE_MAXIMUM  = 0x0100,
82     COMPRESSION_ENGINE_HIBER    = 0x0200
83 }
84 
85 // ACCESS_DENIED_OBJECT_ACE, etc
86 enum DWORD
87     ACE_OBJECT_TYPE_PRESENT           = 0x00000001,
88     ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x00000002;
89 
90 // ACE_HEADER.AceType
91 // also in ddk/ntifs.h
92 enum : BYTE {
93     ACCESS_ALLOWED_ACE_TYPE,
94     ACCESS_DENIED_ACE_TYPE,
95     SYSTEM_AUDIT_ACE_TYPE,
96     SYSTEM_ALARM_ACE_TYPE
97 }
98 
99 // ACE_HEADER.AceFlags
100 enum BYTE
101     OBJECT_INHERIT_ACE         = 0x01,
102     CONTAINER_INHERIT_ACE      = 0x02,
103     NO_PROPAGATE_INHERIT_ACE   = 0x04,
104     INHERIT_ONLY_ACE           = 0x08,
105     INHERITED_ACE              = 0x10,
106     VALID_INHERIT_FLAGS        = 0x1F,
107     SUCCESSFUL_ACCESS_ACE_FLAG = 0x40,
108     FAILED_ACCESS_ACE_FLAG     = 0x80;
109 
110 // Access Mask Format
111 enum ACCESS_MASK
112     DELETE                   = 0x00010000,
113     READ_CONTROL             = 0x00020000,
114     WRITE_DAC                = 0x00040000,
115     WRITE_OWNER              = 0x00080000,
116     SYNCHRONIZE              = 0x00100000,
117     ACCESS_SYSTEM_SECURITY   = 0x01000000,
118     MAXIMUM_ALLOWED          = 0x02000000,
119     GENERIC_READ             = 0x80000000,
120     GENERIC_WRITE            = 0x40000000,
121     GENERIC_EXECUTE          = 0x20000000,
122     GENERIC_ALL              = 0x10000000,
123     STANDARD_RIGHTS_REQUIRED = 0x000F0000,
124     STANDARD_RIGHTS_READ     = 0x00020000,
125     STANDARD_RIGHTS_WRITE    = 0x00020000,
126     STANDARD_RIGHTS_EXECUTE  = 0x00020000,
127     STANDARD_RIGHTS_ALL      = 0x001F0000,
128     SPECIFIC_RIGHTS_ALL      = 0x0000FFFF;
129 
130 
131 enum DWORD INVALID_FILE_ATTRIBUTES = -1;
132 
133 // MinGW: Also in ddk/winddk.h
134 enum DWORD
135     FILE_LIST_DIRECTORY       = 0x00000001,
136     FILE_READ_DATA            = 0x00000001,
137     FILE_ADD_FILE             = 0x00000002,
138     FILE_WRITE_DATA           = 0x00000002,
139     FILE_ADD_SUBDIRECTORY     = 0x00000004,
140     FILE_APPEND_DATA          = 0x00000004,
141     FILE_CREATE_PIPE_INSTANCE = 0x00000004,
142     FILE_READ_EA              = 0x00000008,
143     FILE_READ_PROPERTIES      = 0x00000008,
144     FILE_WRITE_EA             = 0x00000010,
145     FILE_WRITE_PROPERTIES     = 0x00000010,
146     FILE_EXECUTE              = 0x00000020,
147     FILE_TRAVERSE             = 0x00000020,
148     FILE_DELETE_CHILD         = 0x00000040,
149     FILE_READ_ATTRIBUTES      = 0x00000080,
150     FILE_WRITE_ATTRIBUTES     = 0x00000100;
151 
152 enum DWORD
153     FILE_SHARE_READ        = 0x00000001,
154     FILE_SHARE_WRITE       = 0x00000002,
155     FILE_SHARE_DELETE      = 0x00000004,
156     FILE_SHARE_VALID_FLAGS = 0x00000007;
157 
158 enum DWORD
159     FILE_ATTRIBUTE_READONLY            = 0x00000001,
160     FILE_ATTRIBUTE_HIDDEN              = 0x00000002,
161     FILE_ATTRIBUTE_SYSTEM              = 0x00000004,
162     FILE_ATTRIBUTE_DIRECTORY           = 0x00000010,
163     FILE_ATTRIBUTE_ARCHIVE             = 0x00000020,
164     FILE_ATTRIBUTE_DEVICE              = 0x00000040,
165     FILE_ATTRIBUTE_NORMAL              = 0x00000080,
166     FILE_ATTRIBUTE_TEMPORARY           = 0x00000100,
167     FILE_ATTRIBUTE_SPARSE_FILE         = 0x00000200,
168     FILE_ATTRIBUTE_REPARSE_POINT       = 0x00000400,
169     FILE_ATTRIBUTE_COMPRESSED          = 0x00000800,
170     FILE_ATTRIBUTE_OFFLINE             = 0x00001000,
171     FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000,
172     FILE_ATTRIBUTE_ENCRYPTED           = 0x00004000,
173     FILE_ATTRIBUTE_VALID_FLAGS         = 0x00007fb7,
174     FILE_ATTRIBUTE_VALID_SET_FLAGS     = 0x000031a7;
175 
176 // These are not documented on MSDN
177 enum FILE_COPY_STRUCTURED_STORAGE = 0x00000041;
178 enum FILE_STRUCTURED_STORAGE      = 0x00000441;
179 
180 // Nor are these
181 enum FILE_VALID_OPTION_FLAGS          = 0x00ffffff;
182 enum FILE_VALID_PIPE_OPTION_FLAGS     = 0x00000032;
183 enum FILE_VALID_MAILSLOT_OPTION_FLAGS = 0x00000032;
184 enum FILE_VALID_SET_FLAGS             = 0x00000036;
185 
186 enum ULONG
187     FILE_SUPERSEDE           = 0x00000000,
188     FILE_OPEN                = 0x00000001,
189     FILE_CREATE              = 0x00000002,
190     FILE_OPEN_IF             = 0x00000003,
191     FILE_OVERWRITE           = 0x00000004,
192     FILE_OVERWRITE_IF        = 0x00000005,
193     FILE_MAXIMUM_DISPOSITION = 0x00000005;
194 
195 enum ULONG
196     FILE_DIRECTORY_FILE            = 0x00000001,
197     FILE_WRITE_THROUGH             = 0x00000002,
198     FILE_SEQUENTIAL_ONLY           = 0x00000004,
199     FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008,
200     FILE_SYNCHRONOUS_IO_ALERT      = 0x00000010,
201     FILE_SYNCHRONOUS_IO_NONALERT   = 0x00000020,
202     FILE_NON_DIRECTORY_FILE        = 0x00000040,
203     FILE_CREATE_TREE_CONNECTION    = 0x00000080,
204     FILE_COMPLETE_IF_OPLOCKED      = 0x00000100,
205     FILE_NO_EA_KNOWLEDGE           = 0x00000200,
206     FILE_OPEN_FOR_RECOVERY         = 0x00000400,
207     FILE_RANDOM_ACCESS             = 0x00000800,
208     FILE_DELETE_ON_CLOSE           = 0x00001000,
209     FILE_OPEN_BY_FILE_ID           = 0x00002000,
210     FILE_OPEN_FOR_BACKUP_INTENT    = 0x00004000,
211     FILE_NO_COMPRESSION            = 0x00008000,
212     FILE_RESERVE_OPFILTER          = 0x00100000,
213     FILE_OPEN_REPARSE_POINT        = 0x00200000,
214     FILE_OPEN_NO_RECALL            = 0x00400000,
215     FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000;
216 
217 
218 enum ACCESS_MASK
219     FILE_ALL_ACCESS      = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x01FF,
220     FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES
221                            | FILE_EXECUTE | SYNCHRONIZE,
222     FILE_GENERIC_READ    = STANDARD_RIGHTS_READ | FILE_READ_DATA
223                            | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE,
224     FILE_GENERIC_WRITE   = STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA
225                            | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA
226                            | SYNCHRONIZE;
227 
228 // MinGW: end winddk.h
229 // MinGW: also in ddk/ntifs.h
230 enum DWORD
231     FILE_NOTIFY_CHANGE_FILE_NAME    = 0x00000001,
232     FILE_NOTIFY_CHANGE_DIR_NAME     = 0x00000002,
233     FILE_NOTIFY_CHANGE_NAME         = 0x00000003,
234     FILE_NOTIFY_CHANGE_ATTRIBUTES   = 0x00000004,
235     FILE_NOTIFY_CHANGE_SIZE         = 0x00000008,
236     FILE_NOTIFY_CHANGE_LAST_WRITE   = 0x00000010,
237     FILE_NOTIFY_CHANGE_LAST_ACCESS  = 0x00000020,
238     FILE_NOTIFY_CHANGE_CREATION     = 0x00000040,
239     FILE_NOTIFY_CHANGE_EA           = 0x00000080,
240     FILE_NOTIFY_CHANGE_SECURITY     = 0x00000100,
241     FILE_NOTIFY_CHANGE_STREAM_NAME  = 0x00000200,
242     FILE_NOTIFY_CHANGE_STREAM_SIZE  = 0x00000400,
243     FILE_NOTIFY_CHANGE_STREAM_WRITE = 0x00000800,
244     FILE_NOTIFY_VALID_MASK          = 0x00000fff;
245 
246 enum DWORD
247     FILE_CASE_SENSITIVE_SEARCH      = 0x00000001,
248     FILE_CASE_PRESERVED_NAMES       = 0x00000002,
249     FILE_UNICODE_ON_DISK            = 0x00000004,
250     FILE_PERSISTENT_ACLS            = 0x00000008,
251     FILE_FILE_COMPRESSION           = 0x00000010,
252     FILE_VOLUME_QUOTAS              = 0x00000020,
253     FILE_SUPPORTS_SPARSE_FILES      = 0x00000040,
254     FILE_SUPPORTS_REPARSE_POINTS    = 0x00000080,
255     FILE_SUPPORTS_REMOTE_STORAGE    = 0x00000100,
256     FS_LFN_APIS                     = 0x00004000,
257     FILE_VOLUME_IS_COMPRESSED       = 0x00008000,
258     FILE_SUPPORTS_OBJECT_IDS        = 0x00010000,
259     FILE_SUPPORTS_ENCRYPTION        = 0x00020000,
260     FILE_NAMED_STREAMS              = 0x00040000,
261     FILE_READ_ONLY_VOLUME           = 0x00080000,
262     FILE_SEQUENTIAL_WRITE_ONCE      = 0x00100000,
263     FILE_SUPPORTS_TRANSACTIONS      = 0x00200000;
264 
265 // These are not documented on MSDN
266 enum ACCESS_MASK
267     IO_COMPLETION_QUERY_STATE  = 1,
268     IO_COMPLETION_MODIFY_STATE = 2,
269     IO_COMPLETION_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 3;
270 // MinGW: end ntifs.h
271 
272 // MinGW: also in ddk/winddk.h
273 enum DWORD
274     DUPLICATE_CLOSE_SOURCE    = 1,
275     DUPLICATE_SAME_ACCESS     = 2,
276     DUPLICATE_SAME_ATTRIBUTES = 4;
277 // MinGW: end winddk.k
278 
279 enum DWORD
280     MAILSLOT_NO_MESSAGE   = -1,
281     MAILSLOT_WAIT_FOREVER = -1;
282 
283 enum ACCESS_MASK
284     PROCESS_TERMINATE         = 0x0001,
285     PROCESS_CREATE_THREAD     = 0x0002,
286     PROCESS_SET_SESSIONID     = 0x0004,
287     PROCESS_VM_OPERATION      = 0x0008,
288     PROCESS_VM_READ           = 0x0010,
289     PROCESS_VM_WRITE          = 0x0020,
290     PROCESS_DUP_HANDLE        = 0x0040,
291     PROCESS_CREATE_PROCESS    = 0x0080,
292     PROCESS_SET_QUOTA         = 0x0100,
293     PROCESS_SET_INFORMATION   = 0x0200,
294     PROCESS_QUERY_INFORMATION = 0x0400,
295     PROCESS_ALL_ACCESS        = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x0FFF;
296 
297 enum ACCESS_MASK
298     THREAD_TERMINATE            = 0x0001,
299     THREAD_SUSPEND_RESUME       = 0x0002,
300     THREAD_GET_CONTEXT          = 0x0008,
301     THREAD_SET_CONTEXT          = 0x0010,
302     THREAD_SET_INFORMATION      = 0x0020,
303     THREAD_QUERY_INFORMATION    = 0x0040,
304     THREAD_SET_THREAD_TOKEN     = 0x0080,
305     THREAD_IMPERSONATE          = 0x0100,
306     THREAD_DIRECT_IMPERSONATION = 0x0200,
307     THREAD_ALL_ACCESS           = STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3FF;
308 
309 // These are not documented on MSDN
310 enum THREAD_BASE_PRIORITY_LOWRT =  15;
311 enum THREAD_BASE_PRIORITY_MAX   =   2;
312 enum THREAD_BASE_PRIORITY_MIN   =  -2;
313 enum THREAD_BASE_PRIORITY_IDLE  = -15;
314 
315 enum DWORD EXCEPTION_NONCONTINUABLE      =  1;
316 enum size_t EXCEPTION_MAXIMUM_PARAMETERS = 15;
317 
318 // These are not documented on MSDN
319 enum ACCESS_MASK
320     MUTANT_QUERY_STATE = 1,
321     MUTANT_ALL_ACCESS =  STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MUTANT_QUERY_STATE;
322 
323 enum ACCESS_MASK
324     TIMER_QUERY_STATE  = 1,
325     TIMER_MODIFY_STATE = 2,
326     TIMER_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | TIMER_QUERY_STATE
327                          | TIMER_MODIFY_STATE;
328 
329 enum SID_IDENTIFIER_AUTHORITY
330     SECURITY_NULL_SID_AUTHORITY        = {[5: 0]},
331     SECURITY_WORLD_SID_AUTHORITY       = {[5: 1]},
332     SECURITY_LOCAL_SID_AUTHORITY       = {[5: 2]},
333     SECURITY_CREATOR_SID_AUTHORITY     = {[5: 3]},
334     SECURITY_NON_UNIQUE_AUTHORITY      = {[5: 4]},
335     SECURITY_NT_AUTHORITY              = {[5: 5]},
336     SECURITY_MANDATORY_LABEL_AUTHORITY = {[5: 6]};
337 
338 enum DWORD
339     SECURITY_NULL_RID                   =  0,
340     SECURITY_WORLD_RID                  =  0,
341     SECURITY_LOCAL_RID                  =  0,
342     SECURITY_CREATOR_OWNER_RID          =  0,
343     SECURITY_CREATOR_GROUP_RID          =  1,
344     SECURITY_DIALUP_RID                 =  1,
345     SECURITY_NETWORK_RID                =  2,
346     SECURITY_BATCH_RID                  =  3,
347     SECURITY_INTERACTIVE_RID            =  4,
348     SECURITY_LOGON_IDS_RID              =  5,
349     SECURITY_SERVICE_RID                =  6,
350     SECURITY_LOCAL_SYSTEM_RID           = 18,
351     SECURITY_BUILTIN_DOMAIN_RID         = 32,
352     SECURITY_PRINCIPAL_SELF_RID         = 10,
353     SECURITY_CREATOR_OWNER_SERVER_RID   =  2,
354     SECURITY_CREATOR_GROUP_SERVER_RID   =  3,
355     SECURITY_LOGON_IDS_RID_COUNT        =  3,
356     SECURITY_ANONYMOUS_LOGON_RID        =  7,
357     SECURITY_PROXY_RID                  =  8,
358     SECURITY_ENTERPRISE_CONTROLLERS_RID =  9,
359     SECURITY_SERVER_LOGON_RID           = SECURITY_ENTERPRISE_CONTROLLERS_RID,
360     SECURITY_AUTHENTICATED_USER_RID     = 11,
361     SECURITY_RESTRICTED_CODE_RID        = 12,
362     SECURITY_NT_NON_UNIQUE_RID          = 21,
363     SID_REVISION                        =  1;
364 
365 enum : DWORD {
366     DOMAIN_USER_RID_ADMIN        = 0x01F4,
367     DOMAIN_USER_RID_GUEST        = 0x01F5,
368     DOMAIN_GROUP_RID_ADMINS      = 0x0200,
369     DOMAIN_GROUP_RID_USERS       = 0x0201,
370     DOMAIN_ALIAS_RID_ADMINS      = 0x0220,
371     DOMAIN_ALIAS_RID_USERS       = 0x0221,
372     DOMAIN_ALIAS_RID_GUESTS      = 0x0222,
373     DOMAIN_ALIAS_RID_POWER_USERS = 0x0223,
374     DOMAIN_ALIAS_RID_ACCOUNT_OPS = 0x0224,
375     DOMAIN_ALIAS_RID_SYSTEM_OPS  = 0x0225,
376     DOMAIN_ALIAS_RID_PRINT_OPS   = 0x0226,
377     DOMAIN_ALIAS_RID_BACKUP_OPS  = 0x0227,
378     DOMAIN_ALIAS_RID_REPLICATOR  = 0x0228
379 }
380 
381 enum : WORD {
382     SECURITY_MANDATORY_UNTRUSTED_RID         = 0,
383     SECURITY_MANDATORY_LOW_RID               = 0x1000,
384     SECURITY_MANDATORY_MEDIUM_RID            = 0x2000,
385     SECURITY_MANDATORY_HIGH_RID              = 0x3000,
386     SECURITY_MANDATORY_SYSTEM_RID            = 0x4000,
387     SECURITY_MANDATORY_PROTECTED_PROCESS_RID = 0x5000,
388     SECURITY_MANDATORY_MAXIMUM_USER_RID      = SECURITY_MANDATORY_SYSTEM_RID
389 }
390 
391 const TCHAR[]
392     SE_CREATE_TOKEN_NAME           = "SeCreateTokenPrivilege",
393     SE_ASSIGNPRIMARYTOKEN_NAME     = "SeAssignPrimaryTokenPrivilege",
394     SE_LOCK_MEMORY_NAME            = "SeLockMemoryPrivilege",
395     SE_INCREASE_QUOTA_NAME         = "SeIncreaseQuotaPrivilege",
396     SE_UNSOLICITED_INPUT_NAME      = "SeUnsolicitedInputPrivilege",
397     SE_MACHINE_ACCOUNT_NAME        = "SeMachineAccountPrivilege",
398     SE_TCB_NAME                    = "SeTcbPrivilege",
399     SE_SECURITY_NAME               = "SeSecurityPrivilege",
400     SE_TAKE_OWNERSHIP_NAME         = "SeTakeOwnershipPrivilege",
401     SE_LOAD_DRIVER_NAME            = "SeLoadDriverPrivilege",
402     SE_SYSTEM_PROFILE_NAME         = "SeSystemProfilePrivilege",
403     SE_SYSTEMTIME_NAME             = "SeSystemtimePrivilege",
404     SE_PROF_SINGLE_PROCESS_NAME    = "SeProfileSingleProcessPrivilege",
405     SE_INC_BASE_PRIORITY_NAME      = "SeIncreaseBasePriorityPrivilege",
406     SE_CREATE_PAGEFILE_NAME        = "SeCreatePagefilePrivilege",
407     SE_CREATE_PERMANENT_NAME       = "SeCreatePermanentPrivilege",
408     SE_BACKUP_NAME                 = "SeBackupPrivilege",
409     SE_RESTORE_NAME                = "SeRestorePrivilege",
410     SE_SHUTDOWN_NAME               = "SeShutdownPrivilege",
411     SE_DEBUG_NAME                  = "SeDebugPrivilege",
412     SE_AUDIT_NAME                  = "SeAuditPrivilege",
413     SE_SYSTEM_ENVIRONMENT_NAME     = "SeSystemEnvironmentPrivilege",
414     SE_CHANGE_NOTIFY_NAME          = "SeChangeNotifyPrivilege",
415     SE_REMOTE_SHUTDOWN_NAME        = "SeRemoteShutdownPrivilege",
416     SE_CREATE_GLOBAL_NAME          = "SeCreateGlobalPrivilege",
417     SE_UNDOCK_NAME                 = "SeUndockPrivilege",
418     SE_MANAGE_VOLUME_NAME          = "SeManageVolumePrivilege",
419     SE_IMPERSONATE_NAME            = "SeImpersonatePrivilege",
420     SE_ENABLE_DELEGATION_NAME      = "SeEnableDelegationPrivilege",
421     SE_SYNC_AGENT_NAME             = "SeSyncAgentPrivilege",
422     SE_TRUSTED_CREDMAN_ACCESS_NAME = "SeTrustedCredManAccessPrivilege",
423     SE_RELABEL_NAME                = "SeRelabelPrivilege",
424     SE_INCREASE_WORKING_SET_NAME   = "SeIncreaseWorkingSetPrivilege",
425     SE_TIME_ZONE_NAME              = "SeTimeZonePrivilege",
426     SE_CREATE_SYMBOLIC_LINK_NAME   = "SeCreateSymbolicLinkPrivilege";
427 
428 enum DWORD
429     SE_GROUP_MANDATORY          = 0x00000001,
430     SE_GROUP_ENABLED_BY_DEFAULT = 0x00000002,
431     SE_GROUP_ENABLED            = 0x00000004,
432     SE_GROUP_OWNER              = 0x00000008,
433     SE_GROUP_USE_FOR_DENY_ONLY  = 0x00000010,
434     SE_GROUP_INTEGRITY          = 0x00000020,
435     SE_GROUP_INTEGRITY_ENABLED  = 0x00000040,
436     SE_GROUP_RESOURCE           = 0x20000000,
437     SE_GROUP_LOGON_ID           = 0xC0000000;
438 
439 // Primary language identifiers
440 enum : USHORT {
441     LANG_NEUTRAL,
442     LANG_ARABIC,
443     LANG_BULGARIAN,
444     LANG_CATALAN,
445     LANG_CHINESE,
446     LANG_CZECH,
447     LANG_DANISH,
448     LANG_GERMAN,
449     LANG_GREEK,
450     LANG_ENGLISH,
451     LANG_SPANISH,
452     LANG_FINNISH,
453     LANG_FRENCH,
454     LANG_HEBREW,
455     LANG_HUNGARIAN,
456     LANG_ICELANDIC,
457     LANG_ITALIAN,
458     LANG_JAPANESE,
459     LANG_KOREAN,
460     LANG_DUTCH,
461     LANG_NORWEGIAN,
462     LANG_POLISH,
463     LANG_PORTUGUESE,    // = 0x16
464     LANG_ROMANIAN          = 0x18,
465     LANG_RUSSIAN,
466     LANG_CROATIAN,      // = 0x1A
467     LANG_SERBIAN           = 0x1A,
468     LANG_BOSNIAN           = 0x1A,
469     LANG_SLOVAK,
470     LANG_ALBANIAN,
471     LANG_SWEDISH,
472     LANG_THAI,
473     LANG_TURKISH,
474     LANG_URDU,
475     LANG_INDONESIAN,
476     LANG_UKRAINIAN,
477     LANG_BELARUSIAN,
478     LANG_SLOVENIAN,
479     LANG_ESTONIAN,
480     LANG_LATVIAN,
481     LANG_LITHUANIAN,    // = 0x27
482     LANG_FARSI             = 0x29,
483     LANG_PERSIAN           = 0x29,
484     LANG_VIETNAMESE,
485     LANG_ARMENIAN,
486     LANG_AZERI,
487     LANG_BASQUE,
488     LANG_LOWER_SORBIAN, // = 0x2E
489     LANG_UPPER_SORBIAN     = 0x2E,
490     LANG_MACEDONIAN,    // = 0x2F
491     LANG_TSWANA            = 0x32,
492     LANG_XHOSA             = 0x34,
493     LANG_ZULU,
494     LANG_AFRIKAANS,
495     LANG_GEORGIAN,
496     LANG_FAEROESE,
497     LANG_HINDI,
498     LANG_MALTESE,
499     LANG_SAMI,
500     LANG_IRISH,         // = 0x3C
501     LANG_MALAY             = 0x3E,
502     LANG_KAZAK,
503     LANG_KYRGYZ,
504     LANG_SWAHILI,       // = 0x41
505     LANG_UZBEK             = 0x43,
506     LANG_TATAR,
507     LANG_BENGALI,
508     LANG_PUNJABI,
509     LANG_GUJARATI,
510     LANG_ORIYA,
511     LANG_TAMIL,
512     LANG_TELUGU,
513     LANG_KANNADA,
514     LANG_MALAYALAM,
515     LANG_ASSAMESE,
516     LANG_MARATHI,
517     LANG_SANSKRIT,
518     LANG_MONGOLIAN,
519     LANG_TIBETAN,
520     LANG_WELSH,
521     LANG_KHMER,
522     LANG_LAO,           // = 0x54
523     LANG_GALICIAN          = 0x56,
524     LANG_KONKANI,
525     LANG_MANIPURI,
526     LANG_SINDHI,
527     LANG_SYRIAC,
528     LANG_SINHALESE,     // = 0x5B
529     LANG_INUKTITUT         = 0x5D,
530     LANG_AMHARIC,
531     LANG_TAMAZIGHT,
532     LANG_KASHMIRI,
533     LANG_NEPALI,
534     LANG_FRISIAN,
535     LANG_PASHTO,
536     LANG_FILIPINO,
537     LANG_DIVEHI,        // = 0x65
538     LANG_HAUSA             = 0x68,
539     LANG_YORUBA            = 0x6A,
540     LANG_QUECHUA,
541     LANG_SOTHO,
542     LANG_BASHKIR,
543     LANG_LUXEMBOURGISH,
544     LANG_GREENLANDIC,
545     LANG_IGBO,          // = 0x70
546     LANG_TIGRIGNA          = 0x73,
547     LANG_YI                = 0x78,
548     LANG_MAPUDUNGUN        = 0x7A,
549     LANG_MOHAWK            = 0x7C,
550     LANG_BRETON            = 0x7E,
551     LANG_UIGHUR            = 0x80,
552     LANG_MAORI,
553     LANG_OCCITAN,
554     LANG_CORSICAN,
555     LANG_ALSATIAN,
556     LANG_YAKUT,
557     LANG_KICHE,
558     LANG_KINYARWANDA,
559     LANG_WOLOF,         // = 0x88
560     LANG_DARI              = 0x8C,
561     LANG_MALAGASY,      // = 0x8D
562 
563     LANG_SERBIAN_NEUTRAL   = 0x7C1A,
564     LANG_BOSNIAN_NEUTRAL   = 0x781A,
565 
566     LANG_INVARIANT         = 0x7F
567 }
568 
569 
570 // Sublanguage identifiers
571 enum : USHORT {
572     SUBLANG_NEUTRAL,
573     SUBLANG_DEFAULT,
574     SUBLANG_SYS_DEFAULT,
575     SUBLANG_CUSTOM_DEFAULT,                  // =  3
576     SUBLANG_UI_CUSTOM_DEFAULT                   =  3,
577     SUBLANG_CUSTOM_UNSPECIFIED,              // =  4
578 
579     SUBLANG_AFRIKAANS_SOUTH_AFRICA              =  1,
580     SUBLANG_ALBANIAN_ALBANIA                    =  1,
581     SUBLANG_ALSATIAN_FRANCE                     =  1,
582     SUBLANG_AMHARIC_ETHIOPIA                    =  1,
583 
584     SUBLANG_ARABIC_SAUDI_ARABIA                 =  1,
585     SUBLANG_ARABIC_IRAQ,
586     SUBLANG_ARABIC_EGYPT,
587     SUBLANG_ARABIC_LIBYA,
588     SUBLANG_ARABIC_ALGERIA,
589     SUBLANG_ARABIC_MOROCCO,
590     SUBLANG_ARABIC_TUNISIA,
591     SUBLANG_ARABIC_OMAN,
592     SUBLANG_ARABIC_YEMEN,
593     SUBLANG_ARABIC_SYRIA,
594     SUBLANG_ARABIC_JORDAN,
595     SUBLANG_ARABIC_LEBANON,
596     SUBLANG_ARABIC_KUWAIT,
597     SUBLANG_ARABIC_UAE,
598     SUBLANG_ARABIC_BAHRAIN,
599     SUBLANG_ARABIC_QATAR,                    // = 16
600 
601     SUBLANG_ARMENIAN_ARMENIA                    =  1,
602     SUBLANG_ASSAMESE_INDIA                      =  1,
603 
604     SUBLANG_AZERI_LATIN                         =  1,
605     SUBLANG_AZERI_CYRILLIC,                  // =  2
606 
607     SUBLANG_BASHKIR_RUSSIA                      =  1,
608     SUBLANG_BASQUE_BASQUE                       =  1,
609     SUBLANG_BELARUSIAN_BELARUS                  =  1,
610     SUBLANG_BENGALI_INDIA                       =  1,
611 
612     SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN    =  5,
613     SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC =  8,
614 
615     SUBLANG_BRETON_FRANCE                       =  1,
616     SUBLANG_BULGARIAN_BULGARIA                  =  1,
617     SUBLANG_CATALAN_CATALAN                     =  1,
618 
619     SUBLANG_CHINESE_TRADITIONAL                 =  1,
620     SUBLANG_CHINESE_SIMPLIFIED,
621     SUBLANG_CHINESE_HONGKONG,
622     SUBLANG_CHINESE_SINGAPORE,
623     SUBLANG_CHINESE_MACAU,                   // =  5
624 
625     SUBLANG_CORSICAN_FRANCE                     =  1,
626 
627     SUBLANG_CROATIAN_CROATIA                    =  1,
628     SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN   =  4,
629 
630     SUBLANG_CZECH_CZECH_REPUBLIC                =  1,
631     SUBLANG_DANISH_DENMARK                      =  1,
632     SUBLANG_DIVEHI_MALDIVES                     =  1,
633 
634     SUBLANG_DUTCH                               =  1,
635     SUBLANG_DUTCH_BELGIAN,                   // =  2
636 
637     SUBLANG_ENGLISH_US                          =  1,
638     SUBLANG_ENGLISH_UK,
639     SUBLANG_ENGLISH_AUS,
640     SUBLANG_ENGLISH_CAN,
641     SUBLANG_ENGLISH_NZ,
642     SUBLANG_ENGLISH_EIRE,                    // =  6
643     SUBLANG_ENGLISH_IRELAND                     =  6,
644     SUBLANG_ENGLISH_SOUTH_AFRICA,
645     SUBLANG_ENGLISH_JAMAICA,
646     SUBLANG_ENGLISH_CARIBBEAN,
647     SUBLANG_ENGLISH_BELIZE,
648     SUBLANG_ENGLISH_TRINIDAD,
649     SUBLANG_ENGLISH_ZIMBABWE,
650     SUBLANG_ENGLISH_PHILIPPINES,             // = 13
651     SUBLANG_ENGLISH_INDIA                       = 16,
652     SUBLANG_ENGLISH_MALAYSIA,
653     SUBLANG_ENGLISH_SINGAPORE,               // = 18
654 
655     SUBLANG_ESTONIAN_ESTONIA                    =  1,
656     SUBLANG_FAEROESE_FAROE_ISLANDS              =  1,
657     SUBLANG_FILIPINO_PHILIPPINES                =  1,
658     SUBLANG_FINNISH_FINLAND                     =  1,
659 
660     SUBLANG_FRENCH                              =  1,
661     SUBLANG_FRENCH_BELGIAN,
662     SUBLANG_FRENCH_CANADIAN,
663     SUBLANG_FRENCH_SWISS,
664     SUBLANG_FRENCH_LUXEMBOURG,
665     SUBLANG_FRENCH_MONACO,                   // =  6
666 
667     SUBLANG_FRISIAN_NETHERLANDS                 =  1,
668     SUBLANG_GALICIAN_GALICIAN                   =  1,
669     SUBLANG_GEORGIAN_GEORGIA                    =  1,
670 
671     SUBLANG_GERMAN                              =  1,
672     SUBLANG_GERMAN_SWISS,
673     SUBLANG_GERMAN_AUSTRIAN,
674     SUBLANG_GERMAN_LUXEMBOURG,
675     SUBLANG_GERMAN_LIECHTENSTEIN,            // =  5
676 
677     SUBLANG_GREEK_GREECE                        =  1,
678     SUBLANG_GREENLANDIC_GREENLAND               =  1,
679     SUBLANG_GUJARATI_INDIA                      =  1,
680     SUBLANG_HAUSA_NIGERIA                       =  1,
681     SUBLANG_HEBREW_ISRAEL                       =  1,
682     SUBLANG_HINDI_INDIA                         =  1,
683     SUBLANG_HUNGARIAN_HUNGARY                   =  1,
684     SUBLANG_ICELANDIC_ICELAND                   =  1,
685     SUBLANG_IGBO_NIGERIA                        =  1,
686     SUBLANG_INDONESIAN_INDONESIA                =  1,
687 
688     SUBLANG_INUKTITUT_CANADA                    =  1,
689     SUBLANG_INUKTITUT_CANADA_LATIN              =  1,
690 
691     SUBLANG_IRISH_IRELAND                       =  1,
692 
693     SUBLANG_ITALIAN                             =  1,
694     SUBLANG_ITALIAN_SWISS,                   // =  2
695 
696     SUBLANG_JAPANESE_JAPAN                      =  1,
697 
698     SUBLANG_KASHMIRI_INDIA                      =  2,
699     SUBLANG_KASHMIRI_SASIA                      =  2,
700 
701     SUBLANG_KAZAK_KAZAKHSTAN                    =  1,
702     SUBLANG_KHMER_CAMBODIA                      =  1,
703     SUBLANG_KICHE_GUATEMALA                     =  1,
704     SUBLANG_KINYARWANDA_RWANDA                  =  1,
705     SUBLANG_KONKANI_INDIA                       =  1,
706     SUBLANG_KOREAN                              =  1,
707     SUBLANG_KOREAN_JOHAB                        =  2,
708     SUBLANG_KYRGYZ_KYRGYZSTAN                   =  1,
709     SUBLANG_LAO_LAO_PDR                         =  1,
710     SUBLANG_LATVIAN_LATVIA                      =  1,
711 
712     SUBLANG_LITHUANIAN                          =  1,
713     SUBLANG_LITHUANIAN_LITHUANIA                =  1,
714 
715     SUBLANG_LOWER_SORBIAN_GERMANY               =  1,
716     SUBLANG_LUXEMBOURGISH_LUXEMBOURG            =  1,
717     SUBLANG_MACEDONIAN_MACEDONIA                =  1,
718     SUBLANG_MALAYALAM_INDIA                     =  1,
719     SUBLANG_MALTESE_MALTA                       =  1,
720     SUBLANG_MAORI_NEW_ZEALAND                   =  1,
721     SUBLANG_MAPUDUNGUN_CHILE                    =  1,
722     SUBLANG_MARATHI_INDIA                       =  1,
723     SUBLANG_MOHAWK_MOHAWK                       =  1,
724 
725     SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA         =  1,
726     SUBLANG_MONGOLIAN_PRC,                   // =  2
727 
728     SUBLANG_MALAY_MALAYSIA                      =  1,
729     SUBLANG_MALAY_BRUNEI_DARUSSALAM,         // =  2
730 
731     SUBLANG_NEPALI_NEPAL                        =  1,
732     SUBLANG_NEPALI_INDIA,                    // =  2
733 
734     SUBLANG_NORWEGIAN_BOKMAL                    =  1,
735     SUBLANG_NORWEGIAN_NYNORSK,               // =  2
736 
737     SUBLANG_OCCITAN_FRANCE                      =  1,
738     SUBLANG_ORIYA_INDIA                         =  1,
739     SUBLANG_PASHTO_AFGHANISTAN                  =  1,
740     SUBLANG_PERSIAN_IRAN                        =  1,
741     SUBLANG_POLISH_POLAND                       =  1,
742 
743     SUBLANG_PORTUGUESE_BRAZILIAN                =  1,
744     SUBLANG_PORTUGUESE                          =  2,
745     SUBLANG_PORTUGUESE_PORTUGAL,             // =  2
746 
747     SUBLANG_PUNJABI_INDIA                       =  1,
748 
749     SUBLANG_QUECHUA_BOLIVIA                     =  1,
750     SUBLANG_QUECHUA_ECUADOR,
751     SUBLANG_QUECHUA_PERU,                    // =  3
752 
753     SUBLANG_ROMANIAN_ROMANIA                    =  1,
754     SUBLANG_ROMANSH_SWITZERLAND                 =  1,
755     SUBLANG_RUSSIAN_RUSSIA                      =  1,
756 
757     SUBLANG_SAMI_NORTHERN_NORWAY                =  1,
758     SUBLANG_SAMI_NORTHERN_SWEDEN,
759     SUBLANG_SAMI_NORTHERN_FINLAND,           // =  3
760     SUBLANG_SAMI_SKOLT_FINLAND                  =  3,
761     SUBLANG_SAMI_INARI_FINLAND                  =  3,
762     SUBLANG_SAMI_LULE_NORWAY,
763     SUBLANG_SAMI_LULE_SWEDEN,
764     SUBLANG_SAMI_SOUTHERN_NORWAY,
765     SUBLANG_SAMI_SOUTHERN_SWEDEN,            // =  7
766 
767     SUBLANG_SANSKRIT_INDIA                      =  1,
768 
769     SUBLANG_SERBIAN_LATIN                       =  2,
770     SUBLANG_SERBIAN_CYRILLIC,                // =  3
771     SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN    =  6,
772     SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC =  7,
773 
774     SUBLANG_SINDHI_AFGHANISTAN                  =  2,
775     SUBLANG_SINHALESE_SRI_LANKA                 =  1,
776     SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA         =  1,
777     SUBLANG_SLOVAK_SLOVAKIA                     =  1,
778     SUBLANG_SLOVENIAN_SLOVENIA                  =  1,
779 
780     SUBLANG_SPANISH                             =  1,
781     SUBLANG_SPANISH_MEXICAN,
782     SUBLANG_SPANISH_MODERN,
783     SUBLANG_SPANISH_GUATEMALA,
784     SUBLANG_SPANISH_COSTA_RICA,
785     SUBLANG_SPANISH_PANAMA,
786     SUBLANG_SPANISH_DOMINICAN_REPUBLIC,
787     SUBLANG_SPANISH_VENEZUELA,
788     SUBLANG_SPANISH_COLOMBIA,
789     SUBLANG_SPANISH_PERU,
790     SUBLANG_SPANISH_ARGENTINA,
791     SUBLANG_SPANISH_ECUADOR,
792     SUBLANG_SPANISH_CHILE,
793     SUBLANG_SPANISH_URUGUAY,
794     SUBLANG_SPANISH_PARAGUAY,
795     SUBLANG_SPANISH_BOLIVIA,
796     SUBLANG_SPANISH_EL_SALVADOR,
797     SUBLANG_SPANISH_HONDURAS,
798     SUBLANG_SPANISH_NICARAGUA,
799     SUBLANG_SPANISH_PUERTO_RICO,
800     SUBLANG_SPANISH_US,                      // = 21
801 
802     SUBLANG_SWEDISH                             =  1,
803     SUBLANG_SWEDISH_SWEDEN                      =  1,
804     SUBLANG_SWEDISH_FINLAND,                 // =  2
805 
806     SUBLANG_SYRIAC                              =  1,
807     SUBLANG_TAJIK_TAJIKISTAN                    =  1,
808     SUBLANG_TAMAZIGHT_ALGERIA_LATIN             =  2,
809     SUBLANG_TAMIL_INDIA                         =  1,
810     SUBLANG_TATAR_RUSSIA                        =  1,
811     SUBLANG_TELUGU_INDIA                        =  1,
812     SUBLANG_THAI_THAILAND                       =  1,
813     SUBLANG_TIBETAN_PRC                         =  1,
814     SUBLANG_TIBETAN_BHUTAN                      =  2,
815     SUBLANG_TIGRIGNA_ERITREA                    =  1,
816     SUBLANG_TSWANA_SOUTH_AFRICA                 =  1,
817     SUBLANG_TURKISH_TURKEY                      =  1,
818     SUBLANG_TURKMEN_TURKMENISTAN                =  1,
819     SUBLANG_UIGHUR_PRC                          =  1,
820     SUBLANG_UKRAINIAN_UKRAINE                   =  1,
821     SUBLANG_UPPER_SORBIAN_GERMANY               =  1,
822 
823     SUBLANG_URDU_PAKISTAN                       =  1,
824     SUBLANG_URDU_INDIA,                      // =  2
825 
826     SUBLANG_UZBEK_LATIN                         =  1,
827     SUBLANG_UZBEK_CYRILLIC,                  // =  2
828 
829     SUBLANG_VIETNAMESE_VIETNAM                  =  1,
830     SUBLANG_WELSH_UNITED_KINGDOM                =  1,
831     SUBLANG_WOLOF_SENEGAL                       =  1,
832     SUBLANG_YORUBA_NIGERIA                      =  1,
833     SUBLANG_XHOSA_SOUTH_AFRICA                  =  1,
834     SUBLANG_YAKUT_RUSSIA                        =  1,
835     SUBLANG_YI_PRC                              =  1,
836     SUBLANG_ZULU_SOUTH_AFRICA                   =  1
837 }
838 
839 // This is not documented on MSDN
840 enum NLS_VALID_LOCALE_MASK = 1048575;
841 
842 // Sorting identifiers
843 enum : WORD {
844     SORT_DEFAULT              = 0,
845     SORT_JAPANESE_XJIS        = 0,
846     SORT_JAPANESE_UNICODE     = 1,
847     SORT_CHINESE_BIG5         = 0,
848     SORT_CHINESE_PRCP         = 0,
849     SORT_CHINESE_UNICODE      = 1,
850     SORT_CHINESE_PRC          = 2,
851     SORT_CHINESE_BOPOMOFO     = 3,
852     SORT_KOREAN_KSC           = 0,
853     SORT_KOREAN_UNICODE       = 1,
854     SORT_GERMAN_PHONE_BOOK    = 1,
855     SORT_HUNGARIAN_DEFAULT    = 0,
856     SORT_HUNGARIAN_TECHNICAL  = 1,
857     SORT_GEORGIAN_TRADITIONAL = 0,
858     SORT_GEORGIAN_MODERN      = 1
859 }
860 
861 pure nothrow @nogc {
MAKELANGID(uint p,uint s)862     WORD MAKELANGID(/*USHORT*/uint p, /*USHORT*/ uint s) { return cast(WORD)((s << 10) | p); }
PRIMARYLANGID(uint lgid)863     WORD PRIMARYLANGID(/*WORD*/uint lgid) { return cast(WORD)(lgid & 0x3FF); }
SUBLANGID(uint lgid)864     WORD SUBLANGID(/*WORD*/uint lgid) { return cast(WORD)(lgid >>> 10); }
865 
MAKELCID(uint lgid,uint srtid)866     DWORD MAKELCID(/*WORD*/uint lgid, /*WORD*/uint srtid) { return (cast(DWORD) srtid << 16) | cast(DWORD) lgid; }
867     // ???
868     //DWORD MAKESORTLCID(WORD lgid, WORD srtid, WORD ver) { return (MAKELCID(lgid, srtid)) | ((cast(DWORD)ver) << 20); }
LANGIDFROMLCID(LCID lcid)869     WORD LANGIDFROMLCID(LCID lcid) { return cast(WORD) lcid; }
SORTIDFROMLCID(LCID lcid)870     WORD SORTIDFROMLCID(LCID lcid) { return cast(WORD) ((lcid >>> 16) & 0x0F); }
SORTVERSIONFROMLCID(LCID lcid)871     WORD SORTVERSIONFROMLCID(LCID lcid) { return cast(WORD) ((lcid >>> 20) & 0x0F); }
872 }
873 
874 enum WORD LANG_SYSTEM_DEFAULT = (SUBLANG_SYS_DEFAULT << 10) | LANG_NEUTRAL;
875 enum WORD LANG_USER_DEFAULT   = (SUBLANG_DEFAULT << 10) | LANG_NEUTRAL;
876 enum DWORD LOCALE_NEUTRAL     = (SORT_DEFAULT << 16)
877                                  | (SUBLANG_NEUTRAL << 10) | LANG_NEUTRAL;
878 
879 // ---
880 enum : BYTE {
881     ACL_REVISION    = 2,
882     ACL_REVISION_DS = 4
883 }
884 
885 // These are not documented on MSDN
886 enum : BYTE {
887     ACL_REVISION1    = 1,
888     ACL_REVISION2,
889     ACL_REVISION3,
890     ACL_REVISION4 // = 4
891 }
892 
893 enum BYTE
894     MIN_ACL_REVISION = 2,
895     MAX_ACL_REVISION = 4;
896 
897 /+
898 // These aren't necessary for D.
899 enum MINCHAR=0x80;
900 enum MAXCHAR=0x7f;
901 enum MINSHORT=0x8000;
902 enum MAXSHORT=0x7fff;
903 enum MINLONG=0x80000000;
904 enum MAXLONG=0x7fffffff;
905 enum MAXBYTE=0xff;
906 enum MAXWORD=0xffff;
907 enum MAXDWORD=0xffffffff;
908 +/
909 
910 // SYSTEM_INFO.dwProcessorType
911 enum : DWORD {
912     PROCESSOR_INTEL_386     =   386,
913     PROCESSOR_INTEL_486     =   486,
914     PROCESSOR_INTEL_PENTIUM =   586,
915     PROCESSOR_MIPS_R4000    =  4000,
916     PROCESSOR_ALPHA_21064   = 21064,
917     PROCESSOR_INTEL_IA64    =  2200
918 }
919 
920 // SYSTEM_INFO.wProcessorArchitecture
921 enum : WORD {
922     PROCESSOR_ARCHITECTURE_INTEL,
923     PROCESSOR_ARCHITECTURE_MIPS,
924     PROCESSOR_ARCHITECTURE_ALPHA,
925     PROCESSOR_ARCHITECTURE_PPC,
926     PROCESSOR_ARCHITECTURE_SHX,
927     PROCESSOR_ARCHITECTURE_ARM,
928     PROCESSOR_ARCHITECTURE_IA64,
929     PROCESSOR_ARCHITECTURE_ALPHA64,
930     PROCESSOR_ARCHITECTURE_MSIL,
931     PROCESSOR_ARCHITECTURE_AMD64,
932     PROCESSOR_ARCHITECTURE_IA32_ON_WIN64, // = 10
933     PROCESSOR_ARCHITECTURE_UNKNOWN = 0xFFFF
934 }
935 
936 // IsProcessorFeaturePresent()
937 enum : DWORD {
938     PF_FLOATING_POINT_PRECISION_ERRATA,
939     PF_FLOATING_POINT_EMULATED,
940     PF_COMPARE_EXCHANGE_DOUBLE,
941     PF_MMX_INSTRUCTIONS_AVAILABLE,
942     PF_PPC_MOVEMEM_64BIT_OK,
943     PF_ALPHA_BYTE_INSTRUCTIONS,
944     PF_XMMI_INSTRUCTIONS_AVAILABLE,
945     PF_3DNOW_INSTRUCTIONS_AVAILABLE,
946     PF_RDTSC_INSTRUCTION_AVAILABLE,
947     PF_PAE_ENABLED,
948     PF_XMMI64_INSTRUCTIONS_AVAILABLE
949 }
950 
951 // MinGW: also in ddk/ntifs.h
952 enum : DWORD {
953     FILE_ACTION_ADDED = 1,
954     FILE_ACTION_REMOVED,
955     FILE_ACTION_MODIFIED,
956     FILE_ACTION_RENAMED_OLD_NAME,
957     FILE_ACTION_RENAMED_NEW_NAME,
958     FILE_ACTION_ADDED_STREAM,
959     FILE_ACTION_REMOVED_STREAM,
960     FILE_ACTION_MODIFIED_STREAM,
961     FILE_ACTION_REMOVED_BY_DELETE,
962     FILE_ACTION_ID_NOT_TUNNELLED,
963     FILE_ACTION_TUNNELLED_ID_COLLISION // = 11
964 }
965 // MinGW: end ntifs.h
966 
967 enum DWORD
968     HEAP_NO_SERIALIZE             = 0x01,
969     HEAP_GROWABLE                 = 0x02,
970     HEAP_GENERATE_EXCEPTIONS      = 0x04,
971     HEAP_ZERO_MEMORY              = 0x08,
972     HEAP_REALLOC_IN_PLACE_ONLY    = 0x10,
973     HEAP_TAIL_CHECKING_ENABLED    = 0x20,
974     HEAP_FREE_CHECKING_ENABLED    = 0x40,
975     HEAP_DISABLE_COALESCE_ON_FREE = 0x80;
976 
977 // These are not documented on MSDN
978 enum HEAP_CREATE_ALIGN_16       = 0;
979 enum HEAP_CREATE_ENABLE_TRACING = 0x020000;
980 enum HEAP_MAXIMUM_TAG           = 0x000FFF;
981 enum HEAP_PSEUDO_TAG_FLAG       = 0x008000;
982 enum HEAP_TAG_SHIFT             = 16;
983 // ???
984 //MACRO #define HEAP_MAKE_TAG_FLAGS(b,o) ((DWORD)((b)+(o)<<16)))
985 
986 enum ACCESS_MASK
987     KEY_QUERY_VALUE        = 0x000001,
988     KEY_SET_VALUE          = 0x000002,
989     KEY_CREATE_SUB_KEY     = 0x000004,
990     KEY_ENUMERATE_SUB_KEYS = 0x000008,
991     KEY_NOTIFY             = 0x000010,
992     KEY_CREATE_LINK        = 0x000020,
993     KEY_WRITE              = 0x020006,
994     KEY_EXECUTE            = 0x020019,
995     KEY_READ               = 0x020019,
996     KEY_ALL_ACCESS         = 0x0F003F;
997 
998 static if (_WIN32_WINNT >= 0x502) {
999 enum ACCESS_MASK
1000         KEY_WOW64_64KEY    = 0x000100,
1001         KEY_WOW64_32KEY    = 0x000200;
1002 }
1003 
1004 enum DWORD
1005     REG_WHOLE_HIVE_VOLATILE = 1,
1006     REG_REFRESH_HIVE        = 2,
1007     REG_NO_LAZY_FLUSH       = 4;
1008 
1009 enum DWORD
1010     REG_OPTION_RESERVED       =  0,
1011     REG_OPTION_NON_VOLATILE   =  0,
1012     REG_OPTION_VOLATILE       =  1,
1013     REG_OPTION_CREATE_LINK    =  2,
1014     REG_OPTION_BACKUP_RESTORE =  4,
1015     REG_OPTION_OPEN_LINK      =  8,
1016     REG_LEGAL_OPTION          = 15;
1017 
1018 enum SECURITY_INFORMATION
1019     OWNER_SECURITY_INFORMATION            = 0x00000001,
1020     GROUP_SECURITY_INFORMATION            = 0x00000002,
1021     DACL_SECURITY_INFORMATION             = 0x00000004,
1022     SACL_SECURITY_INFORMATION             = 0x00000008,
1023     LABEL_SECURITY_INFORMATION            = 0x00000010,
1024     UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000,
1025     UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000,
1026     PROTECTED_SACL_SECURITY_INFORMATION   = 0x40000000,
1027     PROTECTED_DACL_SECURITY_INFORMATION   = 0x80000000;
1028 
1029 enum DWORD MAXIMUM_PROCESSORS = 32;
1030 
1031 // VirtualAlloc(), etc
1032 // -------------------
1033 
1034 enum : DWORD {
1035     PAGE_NOACCESS          = 0x0001,
1036     PAGE_READONLY          = 0x0002,
1037     PAGE_READWRITE         = 0x0004,
1038     PAGE_WRITECOPY         = 0x0008,
1039     PAGE_EXECUTE           = 0x0010,
1040     PAGE_EXECUTE_READ      = 0x0020,
1041     PAGE_EXECUTE_READWRITE = 0x0040,
1042     PAGE_EXECUTE_WRITECOPY = 0x0080,
1043     PAGE_GUARD             = 0x0100,
1044     PAGE_NOCACHE           = 0x0200
1045 }
1046 
1047 enum : DWORD {
1048     MEM_COMMIT      = 0x00001000,
1049     MEM_RESERVE     = 0x00002000,
1050     MEM_DECOMMIT    = 0x00004000,
1051     MEM_RELEASE     = 0x00008000,
1052     MEM_FREE        = 0x00010000,
1053     MEM_PRIVATE     = 0x00020000,
1054     MEM_MAPPED      = 0x00040000,
1055     MEM_RESET       = 0x00080000,
1056     MEM_TOP_DOWN    = 0x00100000,
1057     MEM_WRITE_WATCH = 0x00200000, // MinGW (???): 98/Me
1058     MEM_PHYSICAL    = 0x00400000,
1059     MEM_4MB_PAGES   = 0x80000000
1060 }
1061 
1062 // MinGW: also in ddk/ntifs.h
1063 // CreateFileMapping()
1064 enum DWORD
1065     SEC_BASED     = 0x00200000,
1066     SEC_NO_CHANGE = 0x00400000,
1067     SEC_FILE      = 0x00800000,
1068     SEC_IMAGE     = 0x01000000,
1069     SEC_VLM       = 0x02000000,
1070     SEC_RESERVE   = 0x04000000,
1071     SEC_COMMIT    = 0x08000000,
1072     SEC_NOCACHE   = 0x10000000,
1073     MEM_IMAGE     = SEC_IMAGE;
1074 // MinGW: end ntifs.h
1075 
1076 // ???
1077 enum ACCESS_MASK
1078     SECTION_QUERY       = 0x000001,
1079     SECTION_MAP_WRITE   = 0x000002,
1080     SECTION_MAP_READ    = 0x000004,
1081     SECTION_MAP_EXECUTE = 0x000008,
1082     SECTION_EXTEND_SIZE = 0x000010,
1083     SECTION_ALL_ACCESS  = 0x0F001F;
1084 
1085 // These are not documented on MSDN
1086 enum MESSAGE_RESOURCE_UNICODE = 1;
1087 enum RTL_CRITSECT_TYPE        = 0;
1088 enum RTL_RESOURCE_TYPE        = 1;
1089 
1090 // COFF file format
1091 // ----------------
1092 
1093 // IMAGE_FILE_HEADER.Characteristics
1094 enum WORD
1095     IMAGE_FILE_RELOCS_STRIPPED         = 0x0001,
1096     IMAGE_FILE_EXECUTABLE_IMAGE        = 0x0002,
1097     IMAGE_FILE_LINE_NUMS_STRIPPED      = 0x0004,
1098     IMAGE_FILE_LOCAL_SYMS_STRIPPED     = 0x0008,
1099     IMAGE_FILE_AGGRESIVE_WS_TRIM       = 0x0010,
1100     IMAGE_FILE_LARGE_ADDRESS_AWARE     = 0x0020,
1101     IMAGE_FILE_BYTES_REVERSED_LO       = 0x0080,
1102     IMAGE_FILE_32BIT_MACHINE           = 0x0100,
1103     IMAGE_FILE_DEBUG_STRIPPED          = 0x0200,
1104     IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400,
1105     IMAGE_FILE_NET_RUN_FROM_SWAP       = 0x0800,
1106     IMAGE_FILE_SYSTEM                  = 0x1000,
1107     IMAGE_FILE_DLL                     = 0x2000,
1108     IMAGE_FILE_UP_SYSTEM_ONLY          = 0x4000,
1109     IMAGE_FILE_BYTES_REVERSED_HI       = 0x8000;
1110 
1111 // IMAGE_FILE_HEADER.Machine
1112 enum : WORD {
1113     IMAGE_FILE_MACHINE_UNKNOWN   = 0x0000,
1114     IMAGE_FILE_MACHINE_I386      = 0x014C,
1115     IMAGE_FILE_MACHINE_R3000     = 0x0162,
1116     IMAGE_FILE_MACHINE_R4000     = 0x0166,
1117     IMAGE_FILE_MACHINE_R10000    = 0x0168,
1118     IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x0169,
1119     IMAGE_FILE_MACHINE_ALPHA     = 0x0184,
1120     IMAGE_FILE_MACHINE_SH3       = 0x01A2,
1121     IMAGE_FILE_MACHINE_SH3DSP    = 0x01A3,
1122     IMAGE_FILE_MACHINE_SH4       = 0x01A6,
1123     IMAGE_FILE_MACHINE_SH5       = 0x01A8,
1124     IMAGE_FILE_MACHINE_ARM       = 0x01C0,
1125     IMAGE_FILE_MACHINE_THUMB     = 0x01C2,
1126     IMAGE_FILE_MACHINE_AM33      = 0x01D3,
1127     IMAGE_FILE_MACHINE_POWERPC   = 0x01F0,
1128     IMAGE_FILE_MACHINE_POWERPCFP = 0x01F1,
1129     IMAGE_FILE_MACHINE_IA64      = 0x0200,
1130     IMAGE_FILE_MACHINE_MIPS16    = 0x0266,
1131     IMAGE_FILE_MACHINE_MIPSFPU   = 0x0366,
1132     IMAGE_FILE_MACHINE_MIPSFPU16 = 0x0466,
1133     IMAGE_FILE_MACHINE_EBC       = 0x0EBC,
1134     IMAGE_FILE_MACHINE_AMD64     = 0x8664,
1135     IMAGE_FILE_MACHINE_M32R      = 0x9041
1136 }
1137 
1138 // ???
1139 enum  {
1140     IMAGE_DOS_SIGNATURE    = 0x5A4D,
1141     IMAGE_OS2_SIGNATURE    = 0x454E,
1142     IMAGE_OS2_SIGNATURE_LE = 0x454C,
1143     IMAGE_VXD_SIGNATURE    = 0x454C,
1144     IMAGE_NT_SIGNATURE     = 0x4550
1145 }
1146 
1147 // IMAGE_OPTIONAL_HEADER.Magic
1148 enum : WORD {
1149     IMAGE_NT_OPTIONAL_HDR32_MAGIC = 0x010B,
1150     IMAGE_ROM_OPTIONAL_HDR_MAGIC  = 0x0107,
1151     IMAGE_NT_OPTIONAL_HDR64_MAGIC = 0x020B
1152 }
1153 
1154 // IMAGE_OPTIONAL_HEADER.Subsystem
1155 enum : WORD {
1156     IMAGE_SUBSYSTEM_UNKNOWN                  =  0,
1157     IMAGE_SUBSYSTEM_NATIVE,
1158     IMAGE_SUBSYSTEM_WINDOWS_GUI,
1159     IMAGE_SUBSYSTEM_WINDOWS_CUI,          // =  3
1160     IMAGE_SUBSYSTEM_OS2_CUI                  =  5,
1161     IMAGE_SUBSYSTEM_POSIX_CUI                =  7,
1162     IMAGE_SUBSYSTEM_NATIVE_WINDOWS,
1163     IMAGE_SUBSYSTEM_WINDOWS_CE_GUI,
1164     IMAGE_SUBSYSTEM_EFI_APPLICATION,
1165     IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER,
1166     IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER,
1167     IMAGE_SUBSYSTEM_EFI_ROM,
1168     IMAGE_SUBSYSTEM_XBOX,                 // = 14
1169     IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16
1170 }
1171 
1172 // IMAGE_OPTIONAL_HEADER.DllCharacteristics
1173 enum WORD
1174     IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE         = 0x0040,
1175     IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY      = 0x0080,
1176     IMAGE_DLL_CHARACTERISTICS_NX_COMPAT            = 0x0100,
1177     IMAGE_DLLCHARACTERISTICS_NO_ISOLATION          = 0x0200,
1178     IMAGE_DLLCHARACTERISTICS_NO_SEH                = 0x0400,
1179     IMAGE_DLLCHARACTERISTICS_NO_BIND               = 0x0800,
1180     IMAGE_DLLCHARACTERISTICS_WDM_DRIVER            = 0x2000,
1181     IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000;
1182 
1183 // ???
1184 enum IMAGE_SEPARATE_DEBUG_SIGNATURE = 0x4944;
1185 
1186 enum size_t
1187     IMAGE_NUMBEROF_DIRECTORY_ENTRIES =  16,
1188     IMAGE_SIZEOF_ROM_OPTIONAL_HEADER =  56,
1189     IMAGE_SIZEOF_STD_OPTIONAL_HEADER =  28,
1190     IMAGE_SIZEOF_NT_OPTIONAL_HEADER  = 224,
1191     IMAGE_SIZEOF_SHORT_NAME          =   8,
1192     IMAGE_SIZEOF_SECTION_HEADER      =  40,
1193     IMAGE_SIZEOF_SYMBOL              =  18,
1194     IMAGE_SIZEOF_AUX_SYMBOL          =  18,
1195     IMAGE_SIZEOF_RELOCATION          =  10,
1196     IMAGE_SIZEOF_BASE_RELOCATION     =   8,
1197     IMAGE_SIZEOF_LINENUMBER          =   6,
1198     IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR  =  60,
1199     SIZEOF_RFPO_DATA                 =  16;
1200 
IMAGE_FIRST_SECTION(PIMAGE_NT_HEADERS h)1201 PIMAGE_SECTION_HEADER IMAGE_FIRST_SECTION(PIMAGE_NT_HEADERS h) {
1202     return cast(PIMAGE_SECTION_HEADER)
1203         (&h.OptionalHeader + h.FileHeader.SizeOfOptionalHeader);
1204 }
1205 
1206 // ImageDirectoryEntryToDataEx()
1207 enum : USHORT {
1208     IMAGE_DIRECTORY_ENTRY_EXPORT             =  0,
1209     IMAGE_DIRECTORY_ENTRY_IMPORT,
1210     IMAGE_DIRECTORY_ENTRY_RESOURCE,
1211     IMAGE_DIRECTORY_ENTRY_EXCEPTION,
1212     IMAGE_DIRECTORY_ENTRY_SECURITY,
1213     IMAGE_DIRECTORY_ENTRY_BASERELOC,
1214     IMAGE_DIRECTORY_ENTRY_DEBUG,
1215     IMAGE_DIRECTORY_ENTRY_COPYRIGHT,      // =  7
1216     IMAGE_DIRECTORY_ENTRY_ARCHITECTURE       =  7,
1217     IMAGE_DIRECTORY_ENTRY_GLOBALPTR,
1218     IMAGE_DIRECTORY_ENTRY_TLS,
1219     IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,
1220     IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
1221     IMAGE_DIRECTORY_ENTRY_IAT,
1222     IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT,
1223     IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, // = 14
1224 }
1225 
1226 // IMAGE_SECTION_HEADER.Characteristics
1227 enum DWORD
1228     IMAGE_SCN_TYPE_REG               = 0x00000000,
1229     IMAGE_SCN_TYPE_DSECT             = 0x00000001,
1230     IMAGE_SCN_TYPE_NOLOAD            = 0x00000002,
1231     IMAGE_SCN_TYPE_GROUP             = 0x00000004,
1232     IMAGE_SCN_TYPE_NO_PAD            = 0x00000008,
1233     IMAGE_SCN_TYPE_COPY              = 0x00000010,
1234     IMAGE_SCN_CNT_CODE               = 0x00000020,
1235     IMAGE_SCN_CNT_INITIALIZED_DATA   = 0x00000040,
1236     IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080,
1237     IMAGE_SCN_LNK_OTHER              = 0x00000100,
1238     IMAGE_SCN_LNK_INFO               = 0x00000200,
1239     IMAGE_SCN_TYPE_OVER              = 0x00000400,
1240     IMAGE_SCN_LNK_REMOVE             = 0x00000800,
1241     IMAGE_SCN_LNK_COMDAT             = 0x00001000,
1242     IMAGE_SCN_MEM_FARDATA            = 0x00008000,
1243     IMAGE_SCN_GPREL                  = 0x00008000,
1244     IMAGE_SCN_MEM_PURGEABLE          = 0x00020000,
1245     IMAGE_SCN_MEM_16BIT              = 0x00020000,
1246     IMAGE_SCN_MEM_LOCKED             = 0x00040000,
1247     IMAGE_SCN_MEM_PRELOAD            = 0x00080000,
1248     IMAGE_SCN_ALIGN_1BYTES           = 0x00100000,
1249     IMAGE_SCN_ALIGN_2BYTES           = 0x00200000,
1250     IMAGE_SCN_ALIGN_4BYTES           = 0x00300000,
1251     IMAGE_SCN_ALIGN_8BYTES           = 0x00400000,
1252     IMAGE_SCN_ALIGN_16BYTES          = 0x00500000,
1253     IMAGE_SCN_ALIGN_32BYTES          = 0x00600000,
1254     IMAGE_SCN_ALIGN_64BYTES          = 0x00700000,
1255     IMAGE_SCN_ALIGN_128BYTES         = 0x00800000,
1256     IMAGE_SCN_ALIGN_256BYTES         = 0x00900000,
1257     IMAGE_SCN_ALIGN_512BYTES         = 0x00A00000,
1258     IMAGE_SCN_ALIGN_1024BYTES        = 0x00B00000,
1259     IMAGE_SCN_ALIGN_2048BYTES        = 0x00C00000,
1260     IMAGE_SCN_ALIGN_4096BYTES        = 0x00D00000,
1261     IMAGE_SCN_ALIGN_8192BYTES        = 0x00E00000,
1262     IMAGE_SCN_LNK_NRELOC_OVFL        = 0x01000000,
1263     IMAGE_SCN_MEM_DISCARDABLE        = 0x02000000,
1264     IMAGE_SCN_MEM_NOT_CACHED         = 0x04000000,
1265     IMAGE_SCN_MEM_NOT_PAGED          = 0x08000000,
1266     IMAGE_SCN_MEM_SHARED             = 0x10000000,
1267     IMAGE_SCN_MEM_EXECUTE            = 0x20000000,
1268     IMAGE_SCN_MEM_READ               = 0x40000000,
1269     IMAGE_SCN_MEM_WRITE              = 0x80000000;
1270 
1271 /*  The following constants are mostlydocumented at
1272  *  http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/pecoff.doc
1273  *  but don't seem to be defined in the HTML docs.
1274  */
1275 enum : SHORT {
1276     IMAGE_SYM_UNDEFINED =  0,
1277     IMAGE_SYM_ABSOLUTE  = -1,
1278     IMAGE_SYM_DEBUG     = -2
1279 }
1280 
1281 enum : ubyte {
1282     IMAGE_SYM_TYPE_NULL,
1283     IMAGE_SYM_TYPE_VOID,
1284     IMAGE_SYM_TYPE_CHAR,
1285     IMAGE_SYM_TYPE_SHORT,
1286     IMAGE_SYM_TYPE_INT,
1287     IMAGE_SYM_TYPE_LONG,
1288     IMAGE_SYM_TYPE_FLOAT,
1289     IMAGE_SYM_TYPE_DOUBLE,
1290     IMAGE_SYM_TYPE_STRUCT,
1291     IMAGE_SYM_TYPE_UNION,
1292     IMAGE_SYM_TYPE_ENUM,
1293     IMAGE_SYM_TYPE_MOE,
1294     IMAGE_SYM_TYPE_BYTE,
1295     IMAGE_SYM_TYPE_WORD,
1296     IMAGE_SYM_TYPE_UINT,
1297     IMAGE_SYM_TYPE_DWORD // = 15
1298 }
1299 enum IMAGE_SYM_TYPE_PCODE = 32768; // ???
1300 
1301 enum : ubyte {
1302     IMAGE_SYM_DTYPE_NULL,
1303     IMAGE_SYM_DTYPE_POINTER,
1304     IMAGE_SYM_DTYPE_FUNCTION,
1305     IMAGE_SYM_DTYPE_ARRAY
1306 }
1307 
1308 enum : BYTE {
1309     IMAGE_SYM_CLASS_END_OF_FUNCTION  = 0xFF,
1310     IMAGE_SYM_CLASS_NULL             =   0,
1311     IMAGE_SYM_CLASS_AUTOMATIC,
1312     IMAGE_SYM_CLASS_EXTERNAL,
1313     IMAGE_SYM_CLASS_STATIC,
1314     IMAGE_SYM_CLASS_REGISTER,
1315     IMAGE_SYM_CLASS_EXTERNAL_DEF,
1316     IMAGE_SYM_CLASS_LABEL,
1317     IMAGE_SYM_CLASS_UNDEFINED_LABEL,
1318     IMAGE_SYM_CLASS_MEMBER_OF_STRUCT,
1319     IMAGE_SYM_CLASS_ARGUMENT,
1320     IMAGE_SYM_CLASS_STRUCT_TAG,
1321     IMAGE_SYM_CLASS_MEMBER_OF_UNION,
1322     IMAGE_SYM_CLASS_UNION_TAG,
1323     IMAGE_SYM_CLASS_TYPE_DEFINITION,
1324     IMAGE_SYM_CLASS_UNDEFINED_STATIC,
1325     IMAGE_SYM_CLASS_ENUM_TAG,
1326     IMAGE_SYM_CLASS_MEMBER_OF_ENUM,
1327     IMAGE_SYM_CLASS_REGISTER_PARAM,
1328     IMAGE_SYM_CLASS_BIT_FIELD,    // =  18
1329     IMAGE_SYM_CLASS_FAR_EXTERNAL     =  68,
1330     IMAGE_SYM_CLASS_BLOCK            = 100,
1331     IMAGE_SYM_CLASS_FUNCTION,
1332     IMAGE_SYM_CLASS_END_OF_STRUCT,
1333     IMAGE_SYM_CLASS_FILE,
1334     IMAGE_SYM_CLASS_SECTION,
1335     IMAGE_SYM_CLASS_WEAK_EXTERNAL,// = 105
1336     IMAGE_SYM_CLASS_CLR_TOKEN        = 107
1337 }
1338 
1339 enum : BYTE {
1340     IMAGE_COMDAT_SELECT_NODUPLICATES = 1,
1341     IMAGE_COMDAT_SELECT_ANY,
1342     IMAGE_COMDAT_SELECT_SAME_SIZE,
1343     IMAGE_COMDAT_SELECT_EXACT_MATCH,
1344     IMAGE_COMDAT_SELECT_ASSOCIATIVE,
1345     IMAGE_COMDAT_SELECT_LARGEST,
1346     IMAGE_COMDAT_SELECT_NEWEST    // = 7
1347 }
1348 
1349 enum : DWORD {
1350     IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1,
1351     IMAGE_WEAK_EXTERN_SEARCH_LIBRARY,
1352     IMAGE_WEAK_EXTERN_SEARCH_ALIAS
1353 }
1354 
1355 enum : WORD {
1356     IMAGE_REL_I386_ABSOLUTE       = 0x0000,
1357     IMAGE_REL_I386_DIR16          = 0x0001,
1358     IMAGE_REL_I386_REL16          = 0x0002,
1359     IMAGE_REL_I386_DIR32          = 0x0006,
1360     IMAGE_REL_I386_DIR32NB        = 0x0007,
1361     IMAGE_REL_I386_SEG12          = 0x0009,
1362     IMAGE_REL_I386_SECTION        = 0x000A,
1363     IMAGE_REL_I386_SECREL         = 0x000B,
1364     IMAGE_REL_I386_TOKEN          = 0x000C,
1365     IMAGE_REL_I386_SECREL7        = 0x000D,
1366     IMAGE_REL_I386_REL32          = 0x0014
1367 }
1368 
1369 enum : WORD {
1370     IMAGE_REL_AMD64_ABSOLUTE      = 0x0000,
1371     IMAGE_REL_AMD64_ADDR64        = 0x0001,
1372     IMAGE_REL_AMD64_ADDR32        = 0x0002,
1373     IMAGE_REL_AMD64_ADDR32NB      = 0x0003,
1374     IMAGE_REL_AMD64_REL32         = 0x0004,
1375     IMAGE_REL_AMD64_REL32_1       = 0x0005,
1376     IMAGE_REL_AMD64_REL32_2       = 0x0006,
1377     IMAGE_REL_AMD64_REL32_3       = 0x0007,
1378     IMAGE_REL_AMD64_REL32_4       = 0x0008,
1379     IMAGE_REL_AMD64_REL32_5       = 0x0009,
1380     IMAGE_REL_AMD64_SECTION       = 0x000A,
1381     IMAGE_REL_AMD64_SECREL        = 0x000B,
1382     IMAGE_REL_AMD64_SECREL7       = 0x000C,
1383     IMAGE_REL_AMD64_TOKEN         = 0x000D,
1384     IMAGE_REL_AMD64_SREL32        = 0x000E,
1385     IMAGE_REL_AMD64_PAIR          = 0x000F,
1386     IMAGE_REL_AMD64_SSPAN32       = 0x0010
1387 }
1388 
1389 enum : WORD {
1390     IMAGE_REL_IA64_ABSOLUTE       = 0x0000,
1391     IMAGE_REL_IA64_IMM14          = 0x0001,
1392     IMAGE_REL_IA64_IMM22          = 0x0002,
1393     IMAGE_REL_IA64_IMM64          = 0x0003,
1394     IMAGE_REL_IA64_DIR32          = 0x0004,
1395     IMAGE_REL_IA64_DIR64          = 0x0005,
1396     IMAGE_REL_IA64_PCREL21B       = 0x0006,
1397     IMAGE_REL_IA64_PCREL21M       = 0x0007,
1398     IMAGE_REL_IA64_PCREL21F       = 0x0008,
1399     IMAGE_REL_IA64_GPREL22        = 0x0009,
1400     IMAGE_REL_IA64_LTOFF22        = 0x000A,
1401     IMAGE_REL_IA64_SECTION        = 0x000B,
1402     IMAGE_REL_IA64_SECREL22       = 0x000C,
1403     IMAGE_REL_IA64_SECREL64I      = 0x000D,
1404     IMAGE_REL_IA64_SECREL32       = 0x000E,
1405     IMAGE_REL_IA64_DIR32NB        = 0x0010,
1406     IMAGE_REL_IA64_SREL14         = 0x0011,
1407     IMAGE_REL_IA64_SREL22         = 0x0012,
1408     IMAGE_REL_IA64_SREL32         = 0x0013,
1409     IMAGE_REL_IA64_UREL32         = 0x0014,
1410     IMAGE_REL_IA64_PCREL60X       = 0x0015,
1411     IMAGE_REL_IA64_PCREL60B       = 0x0016,
1412     IMAGE_REL_IA64_PCREL60F       = 0x0017,
1413     IMAGE_REL_IA64_PCREL60I       = 0x0018,
1414     IMAGE_REL_IA64_PCREL60M       = 0x0019,
1415     IMAGE_REL_IA64_IMMGPREL64     = 0x001A,
1416     IMAGE_REL_IA64_TOKEN          = 0x001B,
1417     IMAGE_REL_IA64_GPREL32        = 0x001C,
1418     IMAGE_REL_IA64_ADDEND         = 0x001F
1419 }
1420 
1421 enum : WORD {
1422     IMAGE_REL_SH3_ABSOLUTE        = 0x0000,
1423     IMAGE_REL_SH3_DIRECT16        = 0x0001,
1424     IMAGE_REL_SH3_DIRECT32        = 0x0002,
1425     IMAGE_REL_SH3_DIRECT8         = 0x0003,
1426     IMAGE_REL_SH3_DIRECT8_WORD    = 0x0004,
1427     IMAGE_REL_SH3_DIRECT8_LONG    = 0x0005,
1428     IMAGE_REL_SH3_DIRECT4         = 0x0006,
1429     IMAGE_REL_SH3_DIRECT4_WORD    = 0x0007,
1430     IMAGE_REL_SH3_DIRECT4_LONG    = 0x0008,
1431     IMAGE_REL_SH3_PCREL8_WORD     = 0x0009,
1432     IMAGE_REL_SH3_PCREL8_LONG     = 0x000A,
1433     IMAGE_REL_SH3_PCREL12_WORD    = 0x000B,
1434     IMAGE_REL_SH3_STARTOF_SECTION = 0x000C,
1435     IMAGE_REL_SH3_SIZEOF_SECTION  = 0x000D,
1436     IMAGE_REL_SH3_SECTION         = 0x000E,
1437     IMAGE_REL_SH3_SECREL          = 0x000F,
1438     IMAGE_REL_SH3_DIRECT32_NB     = 0x0010,
1439     IMAGE_REL_SH3_GPREL4_LONG     = 0x0011,
1440     IMAGE_REL_SH3_TOKEN           = 0x0012,
1441     IMAGE_REL_SHM_PCRELPT         = 0x0013,
1442     IMAGE_REL_SHM_REFLO           = 0x0014,
1443     IMAGE_REL_SHM_REFHALF         = 0x0015,
1444     IMAGE_REL_SHM_RELLO           = 0x0016,
1445     IMAGE_REL_SHM_RELHALF         = 0x0017,
1446     IMAGE_REL_SHM_PAIR            = 0x0018,
1447     IMAGE_REL_SHM_NOMODE          = 0x8000
1448 }
1449 
1450 enum : WORD {
1451     IMAGE_REL_M32R_ABSOLUTE       = 0x0000,
1452     IMAGE_REL_M32R_ADDR32         = 0x0001,
1453     IMAGE_REL_M32R_ADDR32NB       = 0x0002,
1454     IMAGE_REL_M32R_ADDR24         = 0x0003,
1455     IMAGE_REL_M32R_GPREL16        = 0x0004,
1456     IMAGE_REL_M32R_PCREL24        = 0x0005,
1457     IMAGE_REL_M32R_PCREL16        = 0x0006,
1458     IMAGE_REL_M32R_PCREL8         = 0x0007,
1459     IMAGE_REL_M32R_REFHALF        = 0x0008,
1460     IMAGE_REL_M32R_REFHI          = 0x0009,
1461     IMAGE_REL_M32R_REFLO          = 0x000A,
1462     IMAGE_REL_M32R_PAIR           = 0x000B,
1463     IMAGE_REL_M32R_SECTION        = 0x000C,
1464     IMAGE_REL_M32R_SECREL         = 0x000D,
1465     IMAGE_REL_M32R_TOKEN          = 0x000E
1466 }
1467 
1468 enum : WORD {
1469     IMAGE_REL_MIPS_ABSOLUTE       = 0x0000,
1470     IMAGE_REL_MIPS_REFHALF        = 0x0001,
1471     IMAGE_REL_MIPS_REFWORD        = 0x0002,
1472     IMAGE_REL_MIPS_JMPADDR        = 0x0003,
1473     IMAGE_REL_MIPS_REFHI          = 0x0004,
1474     IMAGE_REL_MIPS_REFLO          = 0x0005,
1475     IMAGE_REL_MIPS_GPREL          = 0x0006,
1476     IMAGE_REL_MIPS_LITERAL        = 0x0007,
1477     IMAGE_REL_MIPS_SECTION        = 0x000A,
1478     IMAGE_REL_MIPS_SECREL         = 0x000B,
1479     IMAGE_REL_MIPS_SECRELLO       = 0x000C,
1480     IMAGE_REL_MIPS_SECRELHI       = 0x000D,
1481     IMAGE_REL_MIPS_JMPADDR16      = 0x0010,
1482     IMAGE_REL_MIPS_REFWORDNB      = 0x0022,
1483     IMAGE_REL_MIPS_PAIR           = 0x0025
1484 }
1485 
1486 
1487 enum : WORD {
1488     IMAGE_REL_ALPHA_ABSOLUTE,
1489     IMAGE_REL_ALPHA_REFLONG,
1490     IMAGE_REL_ALPHA_REFQUAD,
1491     IMAGE_REL_ALPHA_GPREL32,
1492     IMAGE_REL_ALPHA_LITERAL,
1493     IMAGE_REL_ALPHA_LITUSE,
1494     IMAGE_REL_ALPHA_GPDISP,
1495     IMAGE_REL_ALPHA_BRADDR,
1496     IMAGE_REL_ALPHA_HINT,
1497     IMAGE_REL_ALPHA_INLINE_REFLONG,
1498     IMAGE_REL_ALPHA_REFHI,
1499     IMAGE_REL_ALPHA_REFLO,
1500     IMAGE_REL_ALPHA_PAIR,
1501     IMAGE_REL_ALPHA_MATCH,
1502     IMAGE_REL_ALPHA_SECTION,
1503     IMAGE_REL_ALPHA_SECREL,
1504     IMAGE_REL_ALPHA_REFLONGNB,
1505     IMAGE_REL_ALPHA_SECRELLO,
1506     IMAGE_REL_ALPHA_SECRELHI // = 18
1507 }
1508 
1509 enum : WORD {
1510     IMAGE_REL_PPC_ABSOLUTE,
1511     IMAGE_REL_PPC_ADDR64,
1512     IMAGE_REL_PPC_ADDR32,
1513     IMAGE_REL_PPC_ADDR24,
1514     IMAGE_REL_PPC_ADDR16,
1515     IMAGE_REL_PPC_ADDR14,
1516     IMAGE_REL_PPC_REL24,
1517     IMAGE_REL_PPC_REL14,
1518     IMAGE_REL_PPC_TOCREL16,
1519     IMAGE_REL_PPC_TOCREL14,
1520     IMAGE_REL_PPC_ADDR32NB,
1521     IMAGE_REL_PPC_SECREL,
1522     IMAGE_REL_PPC_SECTION,
1523     IMAGE_REL_PPC_IFGLUE,
1524     IMAGE_REL_PPC_IMGLUE,
1525     IMAGE_REL_PPC_SECREL16,
1526     IMAGE_REL_PPC_REFHI,
1527     IMAGE_REL_PPC_REFLO,
1528     IMAGE_REL_PPC_PAIR // = 18
1529 }
1530 
1531 // ???
1532 enum IMAGE_REL_PPC_TYPEMASK = 0x00FF;
1533 enum IMAGE_REL_PPC_NEG      = 0x0100;
1534 enum IMAGE_REL_PPC_BRTAKEN  = 0x0200;
1535 enum IMAGE_REL_PPC_BRNTAKEN = 0x0400;
1536 enum IMAGE_REL_PPC_TOCDEFN  = 0x0800;
1537 
1538 enum {
1539     IMAGE_REL_BASED_ABSOLUTE,
1540     IMAGE_REL_BASED_HIGH,
1541     IMAGE_REL_BASED_LOW,
1542     IMAGE_REL_BASED_HIGHLOW,
1543     IMAGE_REL_BASED_HIGHADJ,
1544     IMAGE_REL_BASED_MIPS_JMPADDR
1545 }
1546 // End of constants documented in pecoff.doc
1547 
1548 enum size_t IMAGE_ARCHIVE_START_SIZE = 8;
1549 
1550 const TCHAR[]
1551     IMAGE_ARCHIVE_START            = "!<arch>\n",
1552     IMAGE_ARCHIVE_END              = "`\n",
1553     IMAGE_ARCHIVE_PAD              = "\n",
1554     IMAGE_ARCHIVE_LINKER_MEMBER    = "/               ",
1555     IMAGE_ARCHIVE_LONGNAMES_MEMBER = "//              ";
1556 
1557 enum IMAGE_ORDINAL_FLAG32 = 0x80000000;
1558 
IMAGE_ORDINAL64(ulong Ordinal)1559 ulong IMAGE_ORDINAL64(ulong Ordinal) { return Ordinal & 0xFFFF; }
IMAGE_ORDINAL32(uint Ordinal)1560 uint IMAGE_ORDINAL32(uint Ordinal)   { return Ordinal & 0xFFFF; }
1561 
IMAGE_SNAP_BY_ORDINAL32(uint Ordinal)1562 bool IMAGE_SNAP_BY_ORDINAL32(uint Ordinal) {
1563     return (Ordinal & IMAGE_ORDINAL_FLAG32) != 0;
1564 }
1565 
1566 enum ulong IMAGE_ORDINAL_FLAG64 = 0x8000000000000000;
1567 
IMAGE_SNAP_BY_ORDINAL64(ulong Ordinal)1568 bool IMAGE_SNAP_BY_ORDINAL64(ulong Ordinal) {
1569     return (Ordinal & IMAGE_ORDINAL_FLAG64) != 0;
1570 }
1571 
1572 // ???
1573 enum IMAGE_RESOURCE_NAME_IS_STRING    = 0x80000000;
1574 enum IMAGE_RESOURCE_DATA_IS_DIRECTORY = 0x80000000;
1575 
1576 enum : DWORD {
1577     IMAGE_DEBUG_TYPE_UNKNOWN,
1578     IMAGE_DEBUG_TYPE_COFF,
1579     IMAGE_DEBUG_TYPE_CODEVIEW,
1580     IMAGE_DEBUG_TYPE_FPO,
1581     IMAGE_DEBUG_TYPE_MISC,
1582     IMAGE_DEBUG_TYPE_EXCEPTION,
1583     IMAGE_DEBUG_TYPE_FIXUP,
1584     IMAGE_DEBUG_TYPE_OMAP_TO_SRC,
1585     IMAGE_DEBUG_TYPE_OMAP_FROM_SRC,
1586     IMAGE_DEBUG_TYPE_BORLAND // = 9
1587 }
1588 
1589 enum : ubyte {
1590     FRAME_FPO,
1591     FRAME_TRAP,
1592     FRAME_TSS,
1593     FRAME_NONFPO
1594 }
1595 
1596 // ???
1597 enum IMAGE_DEBUG_MISC_EXENAME = 1;
1598 
1599 // ???
1600 enum N_BTMASK = 0x000F;
1601 enum N_TMASK  = 0x0030;
1602 enum N_TMASK1 = 0x00C0;
1603 enum N_TMASK2 = 0x00F0;
1604 enum N_BTSHFT = 4;
1605 enum N_TSHIFT = 2;
1606 
1607 enum int
1608     IS_TEXT_UNICODE_ASCII16            = 0x0001,
1609     IS_TEXT_UNICODE_STATISTICS         = 0x0002,
1610     IS_TEXT_UNICODE_CONTROLS           = 0x0004,
1611     IS_TEXT_UNICODE_SIGNATURE          = 0x0008,
1612     IS_TEXT_UNICODE_REVERSE_ASCII16    = 0x0010,
1613     IS_TEXT_UNICODE_REVERSE_STATISTICS = 0x0020,
1614     IS_TEXT_UNICODE_REVERSE_CONTROLS   = 0x0040,
1615     IS_TEXT_UNICODE_REVERSE_SIGNATURE  = 0x0080,
1616     IS_TEXT_UNICODE_ILLEGAL_CHARS      = 0x0100,
1617     IS_TEXT_UNICODE_ODD_LENGTH         = 0x0200,
1618     IS_TEXT_UNICODE_NULL_BYTES         = 0x1000,
1619     IS_TEXT_UNICODE_UNICODE_MASK       = 0x000F,
1620     IS_TEXT_UNICODE_REVERSE_MASK       = 0x00F0,
1621     IS_TEXT_UNICODE_NOT_UNICODE_MASK   = 0x0F00,
1622     IS_TEXT_UNICODE_NOT_ASCII_MASK     = 0xF000;
1623 
1624 enum DWORD
1625     SERVICE_KERNEL_DRIVER       = 0x0001,
1626     SERVICE_FILE_SYSTEM_DRIVER  = 0x0002,
1627     SERVICE_ADAPTER             = 0x0004,
1628     SERVICE_RECOGNIZER_DRIVER   = 0x0008,
1629     SERVICE_WIN32_OWN_PROCESS   = 0x0010,
1630     SERVICE_WIN32_SHARE_PROCESS = 0x0020,
1631     SERVICE_INTERACTIVE_PROCESS = 0x0100,
1632     SERVICE_DRIVER              = 0x000B,
1633     SERVICE_WIN32               = 0x0030,
1634     SERVICE_TYPE_ALL            = 0x013F;
1635 
1636 enum : DWORD {
1637     SERVICE_BOOT_START   = 0,
1638     SERVICE_SYSTEM_START = 1,
1639     SERVICE_AUTO_START   = 2,
1640     SERVICE_DEMAND_START = 3,
1641     SERVICE_DISABLED     = 4
1642 }
1643 
1644 enum : DWORD {
1645     SERVICE_ERROR_IGNORE   = 0,
1646     SERVICE_ERROR_NORMAL   = 1,
1647     SERVICE_ERROR_SEVERE   = 2,
1648     SERVICE_ERROR_CRITICAL = 3
1649 }
1650 
1651 
1652 enum uint
1653     SE_OWNER_DEFAULTED          = 0x0001,
1654     SE_GROUP_DEFAULTED          = 0x0002,
1655     SE_DACL_PRESENT             = 0x0004,
1656     SE_DACL_DEFAULTED           = 0x0008,
1657     SE_SACL_PRESENT             = 0x0010,
1658     SE_SACL_DEFAULTED           = 0x0020,
1659     SE_DACL_AUTO_INHERIT_REQ    = 0x0100,
1660     SE_SACL_AUTO_INHERIT_REQ    = 0x0200,
1661     SE_DACL_AUTO_INHERITED      = 0x0400,
1662     SE_SACL_AUTO_INHERITED      = 0x0800,
1663     SE_DACL_PROTECTED           = 0x1000,
1664     SE_SACL_PROTECTED           = 0x2000,
1665     SE_SELF_RELATIVE            = 0x8000;
1666 
1667 enum SECURITY_IMPERSONATION_LEVEL {
1668     SecurityAnonymous,
1669     SecurityIdentification,
1670     SecurityImpersonation,
1671     SecurityDelegation
1672 }
1673 alias SECURITY_IMPERSONATION_LEVEL* PSECURITY_IMPERSONATION_LEVEL;
1674 
1675 alias BOOLEAN SECURITY_CONTEXT_TRACKING_MODE;
1676 alias BOOLEAN* PSECURITY_CONTEXT_TRACKING_MODE;
1677 
1678 enum size_t SECURITY_DESCRIPTOR_MIN_LENGTH = 20;
1679 
1680 enum DWORD
1681     SECURITY_DESCRIPTOR_REVISION  = 1,
1682     SECURITY_DESCRIPTOR_REVISION1 = 1;
1683 
1684 enum DWORD
1685     SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001,
1686     SE_PRIVILEGE_ENABLED            = 0x00000002,
1687     SE_PRIVILEGE_USED_FOR_ACCESS    = 0x80000000;
1688 
1689 enum DWORD PRIVILEGE_SET_ALL_NECESSARY = 1;
1690 
1691 enum SECURITY_IMPERSONATION_LEVEL
1692     SECURITY_MAX_IMPERSONATION_LEVEL = SECURITY_IMPERSONATION_LEVEL.SecurityDelegation,
1693     DEFAULT_IMPERSONATION_LEVEL      = SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation;
1694 
1695 enum BOOLEAN
1696     SECURITY_DYNAMIC_TRACKING = true,
1697     SECURITY_STATIC_TRACKING  = false;
1698 
1699 // also in ddk/ntifs.h
1700 enum DWORD
1701     TOKEN_ASSIGN_PRIMARY    = 0x0001,
1702     TOKEN_DUPLICATE         = 0x0002,
1703     TOKEN_IMPERSONATE       = 0x0004,
1704     TOKEN_QUERY             = 0x0008,
1705     TOKEN_QUERY_SOURCE      = 0x0010,
1706     TOKEN_ADJUST_PRIVILEGES = 0x0020,
1707     TOKEN_ADJUST_GROUPS     = 0x0040,
1708     TOKEN_ADJUST_DEFAULT    = 0x0080,
1709 
1710     TOKEN_ALL_ACCESS        = STANDARD_RIGHTS_REQUIRED
1711                               | TOKEN_ASSIGN_PRIMARY
1712                               | TOKEN_DUPLICATE
1713                               | TOKEN_IMPERSONATE
1714                               | TOKEN_QUERY
1715                               | TOKEN_QUERY_SOURCE
1716                               | TOKEN_ADJUST_PRIVILEGES
1717                               | TOKEN_ADJUST_GROUPS
1718                               | TOKEN_ADJUST_DEFAULT,
1719     TOKEN_READ              = STANDARD_RIGHTS_READ | TOKEN_QUERY,
1720     TOKEN_WRITE             = STANDARD_RIGHTS_WRITE
1721                               | TOKEN_ADJUST_PRIVILEGES
1722                               | TOKEN_ADJUST_GROUPS
1723                               | TOKEN_ADJUST_DEFAULT,
1724     TOKEN_EXECUTE           = STANDARD_RIGHTS_EXECUTE;
1725 
1726 enum size_t TOKEN_SOURCE_LENGTH = 8;
1727 // end ddk/ntifs.h
1728 
1729 enum : DWORD {
1730     DLL_PROCESS_DETACH,
1731     DLL_PROCESS_ATTACH,
1732     DLL_THREAD_ATTACH,
1733     DLL_THREAD_DETACH
1734 }
1735 
1736 enum : DWORD {
1737     DBG_CONTINUE              = 0x00010002,
1738     DBG_TERMINATE_THREAD      = 0x40010003,
1739     DBG_TERMINATE_PROCESS     = 0x40010004,
1740     DBG_CONTROL_C             = 0x40010005,
1741     DBG_CONTROL_BREAK         = 0x40010008,
1742     DBG_EXCEPTION_NOT_HANDLED = 0x80010001
1743 }
1744 
1745 enum : DWORD {
1746     TAPE_ABSOLUTE_POSITION,
1747     TAPE_LOGICAL_POSITION,
1748     TAPE_PSEUDO_LOGICAL_POSITION
1749 }
1750 
1751 enum : DWORD {
1752     TAPE_REWIND,
1753     TAPE_ABSOLUTE_BLOCK,
1754     TAPE_LOGICAL_BLOCK,
1755     TAPE_PSEUDO_LOGICAL_BLOCK,
1756     TAPE_SPACE_END_OF_DATA,
1757     TAPE_SPACE_RELATIVE_BLOCKS,
1758     TAPE_SPACE_FILEMARKS,
1759     TAPE_SPACE_SEQUENTIAL_FMKS,
1760     TAPE_SPACE_SETMARKS,
1761     TAPE_SPACE_SEQUENTIAL_SMKS
1762 }
1763 
1764 enum DWORD
1765     TAPE_DRIVE_FIXED            = 0x00000001,
1766     TAPE_DRIVE_SELECT           = 0x00000002,
1767     TAPE_DRIVE_INITIATOR        = 0x00000004,
1768     TAPE_DRIVE_ERASE_SHORT      = 0x00000010,
1769     TAPE_DRIVE_ERASE_LONG       = 0x00000020,
1770     TAPE_DRIVE_ERASE_BOP_ONLY   = 0x00000040,
1771     TAPE_DRIVE_ERASE_IMMEDIATE  = 0x00000080,
1772     TAPE_DRIVE_TAPE_CAPACITY    = 0x00000100,
1773     TAPE_DRIVE_TAPE_REMAINING   = 0x00000200,
1774     TAPE_DRIVE_FIXED_BLOCK      = 0x00000400,
1775     TAPE_DRIVE_VARIABLE_BLOCK   = 0x00000800,
1776     TAPE_DRIVE_WRITE_PROTECT    = 0x00001000,
1777     TAPE_DRIVE_EOT_WZ_SIZE      = 0x00002000,
1778     TAPE_DRIVE_ECC              = 0x00010000,
1779     TAPE_DRIVE_COMPRESSION      = 0x00020000,
1780     TAPE_DRIVE_PADDING          = 0x00040000,
1781     TAPE_DRIVE_REPORT_SMKS      = 0x00080000,
1782     TAPE_DRIVE_GET_ABSOLUTE_BLK = 0x00100000,
1783     TAPE_DRIVE_GET_LOGICAL_BLK  = 0x00200000,
1784     TAPE_DRIVE_SET_EOT_WZ_SIZE  = 0x00400000,
1785     TAPE_DRIVE_EJECT_MEDIA      = 0x01000000,
1786     TAPE_DRIVE_CLEAN_REQUESTS   = 0x02000000,
1787     TAPE_DRIVE_SET_CMP_BOP_ONLY = 0x04000000,
1788     TAPE_DRIVE_RESERVED_BIT     = 0x80000000;
1789 
1790 enum DWORD
1791     TAPE_DRIVE_LOAD_UNLOAD      = 0x80000001,
1792     TAPE_DRIVE_TENSION          = 0x80000002,
1793     TAPE_DRIVE_LOCK_UNLOCK      = 0x80000004,
1794     TAPE_DRIVE_REWIND_IMMEDIATE = 0x80000008,
1795     TAPE_DRIVE_SET_BLOCK_SIZE   = 0x80000010,
1796     TAPE_DRIVE_LOAD_UNLD_IMMED  = 0x80000020,
1797     TAPE_DRIVE_TENSION_IMMED    = 0x80000040,
1798     TAPE_DRIVE_LOCK_UNLK_IMMED  = 0x80000080,
1799     TAPE_DRIVE_SET_ECC          = 0x80000100,
1800     TAPE_DRIVE_SET_COMPRESSION  = 0x80000200,
1801     TAPE_DRIVE_SET_PADDING      = 0x80000400,
1802     TAPE_DRIVE_SET_REPORT_SMKS  = 0x80000800,
1803     TAPE_DRIVE_ABSOLUTE_BLK     = 0x80001000,
1804     TAPE_DRIVE_ABS_BLK_IMMED    = 0x80002000,
1805     TAPE_DRIVE_LOGICAL_BLK      = 0x80004000,
1806     TAPE_DRIVE_LOG_BLK_IMMED    = 0x80008000,
1807     TAPE_DRIVE_END_OF_DATA      = 0x80010000,
1808     TAPE_DRIVE_RELATIVE_BLKS    = 0x80020000,
1809     TAPE_DRIVE_FILEMARKS        = 0x80040000,
1810     TAPE_DRIVE_SEQUENTIAL_FMKS  = 0x80080000,
1811     TAPE_DRIVE_SETMARKS         = 0x80100000,
1812     TAPE_DRIVE_SEQUENTIAL_SMKS  = 0x80200000,
1813     TAPE_DRIVE_REVERSE_POSITION = 0x80400000,
1814     TAPE_DRIVE_SPACE_IMMEDIATE  = 0x80800000,
1815     TAPE_DRIVE_WRITE_SETMARKS   = 0x81000000,
1816     TAPE_DRIVE_WRITE_FILEMARKS  = 0x82000000,
1817     TAPE_DRIVE_WRITE_SHORT_FMKS = 0x84000000,
1818     TAPE_DRIVE_WRITE_LONG_FMKS  = 0x88000000,
1819     TAPE_DRIVE_WRITE_MARK_IMMED = 0x90000000,
1820     TAPE_DRIVE_FORMAT           = 0xA0000000,
1821     TAPE_DRIVE_FORMAT_IMMEDIATE = 0xC0000000,
1822     TAPE_DRIVE_HIGH_FEATURES    = 0x80000000;
1823 
1824 enum : DWORD {
1825     TAPE_FIXED_PARTITIONS     = 0,
1826     TAPE_SELECT_PARTITIONS    = 1,
1827     TAPE_INITIATOR_PARTITIONS = 2
1828 }
1829 
1830 enum : DWORD {
1831     TAPE_SETMARKS,
1832     TAPE_FILEMARKS,
1833     TAPE_SHORT_FILEMARKS,
1834     TAPE_LONG_FILEMARKS
1835 }
1836 
1837 enum : DWORD {
1838     TAPE_ERASE_SHORT,
1839     TAPE_ERASE_LONG
1840 }
1841 
1842 enum : DWORD {
1843     TAPE_LOAD,
1844     TAPE_UNLOAD,
1845     TAPE_TENSION,
1846     TAPE_LOCK,
1847     TAPE_UNLOCK,
1848     TAPE_FORMAT
1849 }
1850 
1851 enum : ULONG32 {
1852     VER_PLATFORM_WIN32s,
1853     VER_PLATFORM_WIN32_WINDOWS,
1854     VER_PLATFORM_WIN32_NT
1855 }
1856 
1857 enum : UCHAR {
1858     VER_NT_WORKSTATION = 1,
1859     VER_NT_DOMAIN_CONTROLLER,
1860     VER_NT_SERVER
1861 }
1862 
1863 enum USHORT
1864     VER_SUITE_SMALLBUSINESS            = 0x0001,
1865     VER_SUITE_ENTERPRISE               = 0x0002,
1866     VER_SUITE_BACKOFFICE               = 0x0004,
1867     VER_SUITE_TERMINAL                 = 0x0010,
1868     VER_SUITE_SMALLBUSINESS_RESTRICTED = 0x0020,
1869     VER_SUITE_EMBEDDEDNT               = 0x0040,
1870     VER_SUITE_DATACENTER               = 0x0080,
1871     VER_SUITE_SINGLEUSERTS             = 0x0100,
1872     VER_SUITE_PERSONAL                 = 0x0200,
1873     VER_SUITE_BLADE                    = 0x0400,
1874     VER_SUITE_STORAGE_SERVER           = 0x2000,
1875     VER_SUITE_COMPUTE_SERVER           = 0x4000;
1876 
1877 enum ULONG
1878     WT_EXECUTEDEFAULT            = 0x00000000,
1879     WT_EXECUTEINIOTHREAD         = 0x00000001,
1880     WT_EXECUTEINWAITTHREAD       = 0x00000004,
1881     WT_EXECUTEONLYONCE           = 0x00000008,
1882     WT_EXECUTELONGFUNCTION       = 0x00000010,
1883     WT_EXECUTEINTIMERTHREAD      = 0x00000020,
1884     WT_EXECUTEINPERSISTENTTHREAD = 0x00000080,
1885     WT_TRANSFER_IMPERSONATION    = 0x00000100;
1886 
1887 static if (_WIN32_WINNT >= 0x500) {
1888 enum DWORD
1889         VER_MINORVERSION     = 0x01,
1890         VER_MAJORVERSION     = 0x02,
1891         VER_BUILDNUMBER      = 0x04,
1892         VER_PLATFORMID       = 0x08,
1893         VER_SERVICEPACKMINOR = 0x10,
1894         VER_SERVICEPACKMAJOR = 0x20,
1895         VER_SUITENAME        = 0x40,
1896         VER_PRODUCT_TYPE     = 0x80;
1897 
1898     enum : DWORD {
1899         VER_EQUAL = 1,
1900         VER_GREATER,
1901         VER_GREATER_EQUAL,
1902         VER_LESS,
1903         VER_LESS_EQUAL,
1904         VER_AND,
1905         VER_OR // = 7
1906     }
1907 }
1908 
1909 static if (_WIN32_WINNT >= 0x501) {
1910     enum : ULONG {
1911         ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION       = 1,
1912         ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,
1913         ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION,
1914         ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION,
1915         ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION,
1916         ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION,
1917         ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION, // = 7
1918         ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES             = 9
1919     }
1920 }
1921 
1922 // Macros
1923 BYTE BTYPE(BYTE x) { return cast(BYTE) (x & N_BTMASK); }
1924 bool ISPTR(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT); }
1925 bool ISFCN(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT); }
1926 bool ISARY(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT); }
1927 bool ISTAG(uint x) {
1928     return x == IMAGE_SYM_CLASS_STRUCT_TAG
1929         || x == IMAGE_SYM_CLASS_UNION_TAG
1930         || x == IMAGE_SYM_CLASS_ENUM_TAG;
1931 }
1932 uint INCREF(uint x) {
1933     return ((x & ~N_BTMASK) << N_TSHIFT) | (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT)
1934       | (x & N_BTMASK);
1935 }
1936 uint DECREF(uint x) { return ((x >>> N_TSHIFT) & ~N_BTMASK) | (x & N_BTMASK); }
1937 
1938 enum DWORD TLS_MINIMUM_AVAILABLE = 64;
1939 
1940 enum ULONG
1941     IO_REPARSE_TAG_RESERVED_ZERO  = 0,
1942     IO_REPARSE_TAG_RESERVED_ONE   = 1,
1943     IO_REPARSE_TAG_RESERVED_RANGE = IO_REPARSE_TAG_RESERVED_ONE,
1944     IO_REPARSE_TAG_SYMBOLIC_LINK  = IO_REPARSE_TAG_RESERVED_ZERO,
1945     IO_REPARSE_TAG_MOUNT_POINT    = 0xA0000003,
1946     IO_REPARSE_TAG_SYMLINK        = 0xA000000C,
1947     IO_REPARSE_TAG_VALID_VALUES   = 0xE000FFFF;
1948 
1949 /*  Although these are semantically boolean, they are documented and
1950  *  implemented to return ULONG; this behaviour is preserved for compatibility
1951  */
1952 ULONG IsReparseTagMicrosoft(ULONG x)     { return x & 0x80000000; }
1953 ULONG IsReparseTagHighLatency(ULONG x)   { return x & 0x40000000; }
1954 ULONG IsReparseTagNameSurrogate(ULONG x) { return x & 0x20000000; }
1955 
1956 bool IsReparseTagValid(ULONG x) {
1957     return !(x & ~IO_REPARSE_TAG_VALID_VALUES) && (x > IO_REPARSE_TAG_RESERVED_RANGE);
1958 }
1959 
1960 // Doesn't seem to make sense, but anyway....
1961 ULONG WT_SET_MAX_THREADPOOL_THREADS(ref ULONG Flags, ushort Limit) {
1962     return Flags |= Limit << 16;
1963 }
1964 
1965 import core.sys.windows.basetyps;
1966 /* also in core.sys.windows.basetyps
1967 struct GUID {
1968     uint  Data1;
1969     ushort Data2;
1970     ushort Data3;
1971     ubyte  Data4[8];
1972 }
1973 alias GUID* REFGUID, LPGUID;
1974 */
1975 
1976 struct GENERIC_MAPPING {
1977     ACCESS_MASK GenericRead;
1978     ACCESS_MASK GenericWrite;
1979     ACCESS_MASK GenericExecute;
1980     ACCESS_MASK GenericAll;
1981 }
1982 alias GENERIC_MAPPING* PGENERIC_MAPPING;
1983 
1984 struct ACE_HEADER {
1985     BYTE AceType;
1986     BYTE AceFlags;
1987     WORD AceSize;
1988 }
1989 alias ACE_HEADER* PACE_HEADER;
1990 
1991 struct ACCESS_ALLOWED_ACE {
1992     ACE_HEADER  Header;
1993     ACCESS_MASK Mask;
1994     DWORD       SidStart;
1995 }
1996 alias ACCESS_ALLOWED_ACE* PACCESS_ALLOWED_ACE;
1997 
1998 struct ACCESS_DENIED_ACE {
1999     ACE_HEADER  Header;
2000     ACCESS_MASK Mask;
2001     DWORD       SidStart;
2002 }
2003 alias ACCESS_DENIED_ACE* PACCESS_DENIED_ACE;
2004 
2005 struct SYSTEM_AUDIT_ACE {
2006     ACE_HEADER  Header;
2007     ACCESS_MASK Mask;
2008     DWORD       SidStart;
2009 }
2010 alias SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;
2011 
2012 struct SYSTEM_ALARM_ACE {
2013     ACE_HEADER  Header;
2014     ACCESS_MASK Mask;
2015     DWORD       SidStart;
2016 }
2017 alias SYSTEM_ALARM_ACE* PSYSTEM_ALARM_ACE;
2018 
2019 struct ACCESS_ALLOWED_OBJECT_ACE {
2020     ACE_HEADER  Header;
2021     ACCESS_MASK Mask;
2022     DWORD       Flags;
2023     GUID        ObjectType;
2024     GUID        InheritedObjectType;
2025     DWORD       SidStart;
2026 }
2027 alias ACCESS_ALLOWED_OBJECT_ACE* PACCESS_ALLOWED_OBJECT_ACE;
2028 
2029 struct ACCESS_DENIED_OBJECT_ACE {
2030     ACE_HEADER  Header;
2031     ACCESS_MASK Mask;
2032     DWORD       Flags;
2033     GUID        ObjectType;
2034     GUID        InheritedObjectType;
2035     DWORD       SidStart;
2036 }
2037 alias ACCESS_DENIED_OBJECT_ACE* PACCESS_DENIED_OBJECT_ACE;
2038 
2039 struct SYSTEM_AUDIT_OBJECT_ACE {
2040     ACE_HEADER  Header;
2041     ACCESS_MASK Mask;
2042     DWORD       Flags;
2043     GUID        ObjectType;
2044     GUID        InheritedObjectType;
2045     DWORD       SidStart;
2046 }
2047 alias SYSTEM_AUDIT_OBJECT_ACE* PSYSTEM_AUDIT_OBJECT_ACE;
2048 
2049 struct SYSTEM_ALARM_OBJECT_ACE {
2050     ACE_HEADER  Header;
2051     ACCESS_MASK Mask;
2052     DWORD       Flags;
2053     GUID        ObjectType;
2054     GUID        InheritedObjectType;
2055     DWORD       SidStart;
2056 }
2057 alias SYSTEM_ALARM_OBJECT_ACE* PSYSTEM_ALARM_OBJECT_ACE;
2058 
2059 struct ACL {
2060     BYTE AclRevision;
2061     BYTE Sbz1;
2062     WORD AclSize;
2063     WORD AceCount;
2064     WORD Sbz2;
2065 }
2066 alias ACL* PACL;
2067 
2068 struct ACL_REVISION_INFORMATION {
2069     DWORD AclRevision;
2070 }
2071 
2072 struct ACL_SIZE_INFORMATION {
2073     DWORD AceCount;
2074     DWORD AclBytesInUse;
2075     DWORD AclBytesFree;
2076 }
2077 
2078 version (X86) {
2079     // ???
2080 enum SIZE_OF_80387_REGISTERS     = 80;
2081 enum CONTEXT_i386                = 0x010000;
2082 enum CONTEXT_i486                = 0x010000;
2083 enum CONTEXT_CONTROL             = CONTEXT_i386 | 0x01;
2084 enum CONTEXT_INTEGER             = CONTEXT_i386 | 0x02;
2085 enum CONTEXT_SEGMENTS            = CONTEXT_i386 | 0x04;
2086 enum CONTEXT_FLOATING_POINT      = CONTEXT_i386 | 0x08;
2087 enum CONTEXT_DEBUG_REGISTERS     = CONTEXT_i386 | 0x10;
2088 enum CONTEXT_EXTENDED_REGISTERS  = CONTEXT_i386 | 0x20;
2089 enum CONTEXT_FULL                = CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS;
2090 enum CONTEXT_ALL                 = CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS |
2091                                         CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS |
2092                                         CONTEXT_EXTENDED_REGISTERS;
2093 
2094 enum MAXIMUM_SUPPORTED_EXTENSION = 512;
2095 
2096     struct FLOATING_SAVE_AREA {
2097         DWORD    ControlWord;
2098         DWORD    StatusWord;
2099         DWORD    TagWord;
2100         DWORD    ErrorOffset;
2101         DWORD    ErrorSelector;
2102         DWORD    DataOffset;
2103         DWORD    DataSelector;
2104         BYTE[80] RegisterArea;
2105         DWORD    Cr0NpxState;
2106     }
2107 
2108     struct CONTEXT {
2109         DWORD ContextFlags;
2110         DWORD Dr0;
2111         DWORD Dr1;
2112         DWORD Dr2;
2113         DWORD Dr3;
2114         DWORD Dr6;
2115         DWORD Dr7;
2116         FLOATING_SAVE_AREA FloatSave;
2117         DWORD SegGs;
2118         DWORD SegFs;
2119         DWORD SegEs;
2120         DWORD SegDs;
2121         DWORD Edi;
2122         DWORD Esi;
2123         DWORD Ebx;
2124         DWORD Edx;
2125         DWORD Ecx;
2126         DWORD Eax;
2127         DWORD Ebp;
2128         DWORD Eip;
2129         DWORD SegCs;
2130         DWORD EFlags;
2131         DWORD Esp;
2132         DWORD SegSs;
2133         BYTE[MAXIMUM_SUPPORTED_EXTENSION] ExtendedRegisters;
2134     }
2135 
2136 } else version (X86_64)
2137 {
2138 enum CONTEXT_AMD64 = 0x100000;
2139 
2140 enum CONTEXT_CONTROL         = (CONTEXT_AMD64 | 0x1L);
2141 enum CONTEXT_INTEGER         = (CONTEXT_AMD64 | 0x2L);
2142 enum CONTEXT_SEGMENTS        = (CONTEXT_AMD64 | 0x4L);
2143 enum CONTEXT_FLOATING_POINT  = (CONTEXT_AMD64 | 0x8L);
2144 enum CONTEXT_DEBUG_REGISTERS = (CONTEXT_AMD64 | 0x10L);
2145 
2146 enum CONTEXT_FULL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT);
2147 enum CONTEXT_ALL  = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS);
2148 
2149 enum CONTEXT_EXCEPTION_ACTIVE    = 0x8000000;
2150 enum CONTEXT_SERVICE_ACTIVE      = 0x10000000;
2151 enum CONTEXT_EXCEPTION_REQUEST   = 0x40000000;
2152 enum CONTEXT_EXCEPTION_REPORTING = 0x80000000;
2153 
2154 enum INITIAL_MXCSR = 0x1f80;
2155 enum INITIAL_FPCSR = 0x027f;
2156 
2157     align(16) struct M128A
2158     {
2159         ULONGLONG Low;
2160         LONGLONG High;
2161     }
2162     alias M128A* PM128A;
2163 
2164     struct XMM_SAVE_AREA32
2165     {
2166         WORD ControlWord;
2167         WORD StatusWord;
2168         BYTE TagWord;
2169         BYTE Reserved1;
2170         WORD ErrorOpcode;
2171         DWORD ErrorOffset;
2172         WORD ErrorSelector;
2173         WORD Reserved2;
2174         DWORD DataOffset;
2175         WORD DataSelector;
2176         WORD Reserved3;
2177         DWORD MxCsr;
2178         DWORD MxCsr_Mask;
2179         M128A[8] FloatRegisters;
2180         M128A[16] XmmRegisters;
2181         BYTE[96] Reserved4;
2182     }
2183     alias XMM_SAVE_AREA32 PXMM_SAVE_AREA32;
2184 enum LEGACY_SAVE_AREA_LENGTH = XMM_SAVE_AREA32.sizeof;
2185 
2186     align(16) struct CONTEXT
2187     {
2188         DWORD64 P1Home;
2189         DWORD64 P2Home;
2190         DWORD64 P3Home;
2191         DWORD64 P4Home;
2192         DWORD64 P5Home;
2193         DWORD64 P6Home;
2194         DWORD ContextFlags;
2195         DWORD MxCsr;
2196         WORD SegCs;
2197         WORD SegDs;
2198         WORD SegEs;
2199         WORD SegFs;
2200         WORD SegGs;
2201         WORD SegSs;
2202         DWORD EFlags;
2203         DWORD64 Dr0;
2204         DWORD64 Dr1;
2205         DWORD64 Dr2;
2206         DWORD64 Dr3;
2207         DWORD64 Dr6;
2208         DWORD64 Dr7;
2209         DWORD64 Rax;
2210         DWORD64 Rcx;
2211         DWORD64 Rdx;
2212         DWORD64 Rbx;
2213         DWORD64 Rsp;
2214         DWORD64 Rbp;
2215         DWORD64 Rsi;
2216         DWORD64 Rdi;
2217         DWORD64 R8;
2218         DWORD64 R9;
2219         DWORD64 R10;
2220         DWORD64 R11;
2221         DWORD64 R12;
2222         DWORD64 R13;
2223         DWORD64 R14;
2224         DWORD64 R15;
2225         DWORD64 Rip;
2226         union
2227         {
2228             XMM_SAVE_AREA32 FltSave;
2229             XMM_SAVE_AREA32 FloatSave;
2230             struct
2231             {
2232                 M128A[2] Header;
2233                 M128A[8] Legacy;
2234                 M128A Xmm0;
2235                 M128A Xmm1;
2236                 M128A Xmm2;
2237                 M128A Xmm3;
2238                 M128A Xmm4;
2239                 M128A Xmm5;
2240                 M128A Xmm6;
2241                 M128A Xmm7;
2242                 M128A Xmm8;
2243                 M128A Xmm9;
2244                 M128A Xmm10;
2245                 M128A Xmm11;
2246                 M128A Xmm12;
2247                 M128A Xmm13;
2248                 M128A Xmm14;
2249                 M128A Xmm15;
2250             }
2251         }
2252         M128A[26] VectorRegister;
2253         DWORD64 VectorControl;
2254         DWORD64 DebugControl;
2255         DWORD64 LastBranchToRip;
2256         DWORD64 LastBranchFromRip;
2257         DWORD64 LastExceptionToRip;
2258         DWORD64 LastExceptionFromRip;
2259     }
2260 
2261 } else {
2262     static assert(false, "Unsupported CPU");
2263     // Versions for PowerPC, Alpha, SHX, and MIPS removed.
2264 }
2265 
2266 alias CONTEXT* PCONTEXT, LPCONTEXT;
2267 
2268 struct EXCEPTION_RECORD {
2269     DWORD ExceptionCode;
2270     DWORD ExceptionFlags;
2271     EXCEPTION_RECORD* ExceptionRecord;
2272     PVOID ExceptionAddress;
2273     DWORD NumberParameters;
2274     ULONG_PTR[EXCEPTION_MAXIMUM_PARAMETERS] ExceptionInformation;
2275 }
2276 alias EXCEPTION_RECORD* PEXCEPTION_RECORD, LPEXCEPTION_RECORD;
2277 
2278 struct EXCEPTION_POINTERS {
2279     PEXCEPTION_RECORD ExceptionRecord;
2280     PCONTEXT          ContextRecord;
2281 }
2282 alias EXCEPTION_POINTERS* PEXCEPTION_POINTERS, LPEXCEPTION_POINTERS;
2283 
2284 union LARGE_INTEGER {
2285     struct {
2286         uint LowPart;
2287         int  HighPart;
2288     }
2289     long QuadPart;
2290 }
2291 alias LARGE_INTEGER* PLARGE_INTEGER;
2292 
2293 union ULARGE_INTEGER {
2294     struct {
2295         uint LowPart;
2296         uint HighPart;
2297     }
2298     ulong QuadPart;
2299 }
2300 alias ULARGE_INTEGER* PULARGE_INTEGER;
2301 
2302 alias LARGE_INTEGER LUID;
2303 alias LUID* PLUID;
2304 
2305 enum LUID SYSTEM_LUID = { QuadPart:999 };
2306 
2307 align(4) struct LUID_AND_ATTRIBUTES {
2308     LUID  Luid;
2309     DWORD Attributes;
2310 }
2311 alias LUID_AND_ATTRIBUTES* PLUID_AND_ATTRIBUTES;
2312 
2313 align(4) struct PRIVILEGE_SET {
2314     DWORD PrivilegeCount;
2315     DWORD Control;
2316     LUID_AND_ATTRIBUTES _Privilege;
2317 
2318     LUID_AND_ATTRIBUTES* Privilege() return { return &_Privilege; }
2319 }
2320 alias PRIVILEGE_SET* PPRIVILEGE_SET;
2321 
2322 struct SECURITY_ATTRIBUTES {
2323     DWORD  nLength;
2324     LPVOID lpSecurityDescriptor;
2325     BOOL   bInheritHandle;
2326 }
2327 alias SECURITY_ATTRIBUTES* PSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES;
2328 
2329 struct SECURITY_QUALITY_OF_SERVICE {
2330     DWORD   Length;
2331     SECURITY_IMPERSONATION_LEVEL   ImpersonationLevel;
2332     SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
2333     BOOLEAN EffectiveOnly;
2334 }
2335 alias SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE;
2336 
2337 alias PVOID PACCESS_TOKEN;
2338 
2339 struct SE_IMPERSONATION_STATE {
2340     PACCESS_TOKEN Token;
2341     BOOLEAN       CopyOnOpen;
2342     BOOLEAN       EffectiveOnly;
2343     SECURITY_IMPERSONATION_LEVEL Level;
2344 }
2345 alias SE_IMPERSONATION_STATE* PSE_IMPERSONATION_STATE;
2346 
2347 struct SID_IDENTIFIER_AUTHORITY {
2348     BYTE[6] Value;
2349 }
2350 alias SID_IDENTIFIER_AUTHORITY* PSID_IDENTIFIER_AUTHORITY, LPSID_IDENTIFIER_AUTHORITY;
2351 
2352 alias PVOID PSID;
2353 
2354 struct SID {
2355     BYTE  Revision;
2356     BYTE  SubAuthorityCount;
2357     SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
2358     DWORD _SubAuthority;
2359 
2360     DWORD* SubAuthority() return { return &_SubAuthority; }
2361 }
2362 alias SID* PISID;
2363 
2364 struct SID_AND_ATTRIBUTES {
2365     PSID  Sid;
2366     DWORD Attributes;
2367 }
2368 alias SID_AND_ATTRIBUTES* PSID_AND_ATTRIBUTES;
2369 
2370 struct TOKEN_SOURCE {
2371     CHAR[TOKEN_SOURCE_LENGTH] SourceName = 0;
2372     LUID SourceIdentifier;
2373 }
2374 alias TOKEN_SOURCE* PTOKEN_SOURCE;
2375 
2376 struct TOKEN_CONTROL {
2377     LUID         TokenId;
2378     LUID         AuthenticationId;
2379     LUID         ModifiedId;
2380     TOKEN_SOURCE TokenSource;
2381 }
2382 alias TOKEN_CONTROL* PTOKEN_CONTROL;
2383 
2384 struct TOKEN_DEFAULT_DACL {
2385     PACL DefaultDacl;
2386 }
2387 alias TOKEN_DEFAULT_DACL* PTOKEN_DEFAULT_DACL;
2388 
2389 struct TOKEN_GROUPS {
2390     DWORD GroupCount;
2391     SID_AND_ATTRIBUTES _Groups;
2392 
2393     SID_AND_ATTRIBUTES* Groups() return { return &_Groups; }
2394 }
2395 alias TOKEN_GROUPS* PTOKEN_GROUPS, LPTOKEN_GROUPS;
2396 
2397 struct TOKEN_OWNER {
2398     PSID Owner;
2399 }
2400 alias TOKEN_OWNER* PTOKEN_OWNER;
2401 enum SECURITY_MAX_SID_SIZE = 68;
2402 
2403 struct TOKEN_PRIMARY_GROUP {
2404     PSID PrimaryGroup;
2405 }
2406 alias TOKEN_PRIMARY_GROUP* PTOKEN_PRIMARY_GROUP;
2407 
2408 struct TOKEN_PRIVILEGES {
2409     DWORD PrivilegeCount;
2410     LUID_AND_ATTRIBUTES _Privileges;
2411 
2412     LUID_AND_ATTRIBUTES* Privileges() return { return &_Privileges; }
2413 }
2414 alias TOKEN_PRIVILEGES* PTOKEN_PRIVILEGES, LPTOKEN_PRIVILEGES;
2415 
2416 enum TOKEN_TYPE {
2417     TokenPrimary = 1,
2418     TokenImpersonation
2419 }
2420 alias TOKEN_TYPE* PTOKEN_TYPE;
2421 
2422 struct TOKEN_STATISTICS {
2423     LUID          TokenId;
2424     LUID          AuthenticationId;
2425     LARGE_INTEGER ExpirationTime;
2426     TOKEN_TYPE    TokenType;
2427     SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2428     DWORD         DynamicCharged;
2429     DWORD         DynamicAvailable;
2430     DWORD         GroupCount;
2431     DWORD         PrivilegeCount;
2432     LUID          ModifiedId;
2433 }
2434 alias TOKEN_STATISTICS* PTOKEN_STATISTICS;
2435 
2436 struct TOKEN_USER {
2437     SID_AND_ATTRIBUTES User;
2438 }
2439 alias TOKEN_USER* PTOKEN_USER;
2440 
2441 struct TOKEN_MANDATORY_LABEL {
2442     SID_AND_ATTRIBUTES Label;
2443 }
2444 alias PTOKEN_MANDATORY_LABEL = TOKEN_MANDATORY_LABEL*;
2445 alias DWORD SECURITY_INFORMATION;
2446 alias SECURITY_INFORMATION* PSECURITY_INFORMATION;
2447 alias WORD SECURITY_DESCRIPTOR_CONTROL;
2448 alias SECURITY_DESCRIPTOR_CONTROL* PSECURITY_DESCRIPTOR_CONTROL;
2449 
2450 struct SECURITY_DESCRIPTOR {
2451     BYTE Revision;
2452     BYTE Sbz1;
2453     SECURITY_DESCRIPTOR_CONTROL Control;
2454     PSID Owner;
2455     PSID Group;
2456     PACL Sacl;
2457     PACL Dacl;
2458 }
2459 alias SECURITY_DESCRIPTOR* PSECURITY_DESCRIPTOR, PISECURITY_DESCRIPTOR;
2460 enum TOKEN_ELEVATION_TYPE {
2461     TokenElevationTypeDefault = 1,
2462     TokenElevationTypeFull,
2463     TokenElevationTypeLimited
2464 }
2465 
2466 alias PTOKEN_ELEVATION_TYPE = TOKEN_ELEVATION_TYPE*;
2467 
2468 struct TOKEN_ELEVATION {
2469     DWORD TokenIsElevated;
2470 }
2471 alias PTOKEN_ELEVATION = TOKEN_ELEVATION*;
2472 
2473 enum TOKEN_INFORMATION_CLASS {
2474     TokenUser = 1,
2475     TokenGroups,
2476     TokenPrivileges,
2477     TokenOwner,
2478     TokenPrimaryGroup,
2479     TokenDefaultDacl,
2480     TokenSource,
2481     TokenType,
2482     TokenImpersonationLevel,
2483     TokenStatistics,
2484     TokenRestrictedSids,
2485     TokenSessionId,
2486     TokenGroupsAndPrivileges,
2487     TokenSessionReference,
2488     TokenSandBoxInert,
2489     TokenAuditPolicy,
2490     TokenOrigin,
2491     TokenElevationType,
2492     TokenLinkedToken,
2493     TokenElevation,
2494     TokenHasRestrictions,
2495     TokenAccessInformation,
2496     TokenVirtualizationAllowed,
2497     TokenVirtualizationEnabled,
2498     TokenIntegrityLevel,
2499     TokenUIAccess,
2500     TokenMandatoryPolicy,
2501     TokenLogonSid,
2502     TokenIsAppContainer,
2503     TokenCapabilities,
2504     TokenAppContainerSid,
2505     TokenAppContainerNumber,
2506     TokenUserClaimAttributes,
2507     TokenDeviceClaimAttributes,
2508     TokenRestrictedUserClaimAttributes,
2509     TokenRestrictedDeviceClaimAttributes,
2510     TokenDeviceGroups,
2511     TokenRestrictedDeviceGroups,
2512     TokenSecurityAttributes,
2513     TokenIsRestricted,
2514     TokenProcessTrustLevel,
2515     MaxTokenInfoClass  // MaxTokenInfoClass should always be the last enum
2516 }
2517 
2518 enum SID_NAME_USE {
2519     SidTypeUser = 1,
2520     SidTypeGroup,
2521     SidTypeDomain,
2522     SidTypeAlias,
2523     SidTypeWellKnownGroup,
2524     SidTypeDeletedAccount,
2525     SidTypeInvalid,
2526     SidTypeUnknown,
2527     SidTypeComputer
2528 }
2529 alias SID_NAME_USE* PSID_NAME_USE;
2530 
2531 enum WELL_KNOWN_SID_TYPE {
2532     WinNullSid                                   = 0,
2533     WinWorldSid                                  = 1,
2534     WinLocalSid                                  = 2,
2535     WinCreatorOwnerSid                           = 3,
2536     WinCreatorGroupSid                           = 4,
2537     WinCreatorOwnerServerSid                     = 5,
2538     WinCreatorGroupServerSid                     = 6,
2539     WinNtAuthoritySid                            = 7,
2540     WinDialupSid                                 = 8,
2541     WinNetworkSid                                = 9,
2542     WinBatchSid                                  = 10,
2543     WinInteractiveSid                            = 11,
2544     WinServiceSid                                = 12,
2545     WinAnonymousSid                              = 13,
2546     WinProxySid                                  = 14,
2547     WinEnterpriseControllersSid                  = 15,
2548     WinSelfSid                                   = 16,
2549     WinAuthenticatedUserSid                      = 17,
2550     WinRestrictedCodeSid                         = 18,
2551     WinTerminalServerSid                         = 19,
2552     WinRemoteLogonIdSid                          = 20,
2553     WinLogonIdsSid                               = 21,
2554     WinLocalSystemSid                            = 22,
2555     WinLocalServiceSid                           = 23,
2556     WinNetworkServiceSid                         = 24,
2557     WinBuiltinDomainSid                          = 25,
2558     WinBuiltinAdministratorsSid                  = 26,
2559     WinBuiltinUsersSid                           = 27,
2560     WinBuiltinGuestsSid                          = 28,
2561     WinBuiltinPowerUsersSid                      = 29,
2562     WinBuiltinAccountOperatorsSid                = 30,
2563     WinBuiltinSystemOperatorsSid                 = 31,
2564     WinBuiltinPrintOperatorsSid                  = 32,
2565     WinBuiltinBackupOperatorsSid                 = 33,
2566     WinBuiltinReplicatorSid                      = 34,
2567     WinBuiltinPreWindows2000CompatibleAccessSid  = 35,
2568     WinBuiltinRemoteDesktopUsersSid              = 36,
2569     WinBuiltinNetworkConfigurationOperatorsSid   = 37,
2570     WinAccountAdministratorSid                   = 38,
2571     WinAccountGuestSid                           = 39,
2572     WinAccountKrbtgtSid                          = 40,
2573     WinAccountDomainAdminsSid                    = 41,
2574     WinAccountDomainUsersSid                     = 42,
2575     WinAccountDomainGuestsSid                    = 43,
2576     WinAccountComputersSid                       = 44,
2577     WinAccountControllersSid                     = 45,
2578     WinAccountCertAdminsSid                      = 46,
2579     WinAccountSchemaAdminsSid                    = 47,
2580     WinAccountEnterpriseAdminsSid                = 48,
2581     WinAccountPolicyAdminsSid                    = 49,
2582     WinAccountRasAndIasServersSid                = 50,
2583     WinNTLMAuthenticationSid                     = 51,
2584     WinDigestAuthenticationSid                   = 52,
2585     WinSChannelAuthenticationSid                 = 53,
2586     WinThisOrganizationSid                       = 54,
2587     WinOtherOrganizationSid                      = 55,
2588     WinBuiltinIncomingForestTrustBuildersSid     = 56,
2589     WinBuiltinPerfMonitoringUsersSid             = 57,
2590     WinBuiltinPerfLoggingUsersSid                = 58,
2591     WinBuiltinAuthorizationAccessSid             = 59,
2592     WinBuiltinTerminalServerLicenseServersSid    = 60,
2593     WinBuiltinDCOMUsersSid                       = 61,
2594     WinBuiltinIUsersSid                          = 62,
2595     WinIUserSid                                  = 63,
2596     WinBuiltinCryptoOperatorsSid                 = 64,
2597     WinUntrustedLabelSid                         = 65,
2598     WinLowLabelSid                               = 66,
2599     WinMediumLabelSid                            = 67,
2600     WinHighLabelSid                              = 68,
2601     WinSystemLabelSid                            = 69,
2602     WinWriteRestrictedCodeSid                    = 70,
2603     WinCreatorOwnerRightsSid                     = 71,
2604     WinCacheablePrincipalsGroupSid               = 72,
2605     WinNonCacheablePrincipalsGroupSid            = 73,
2606     WinEnterpriseReadonlyControllersSid          = 74,
2607     WinAccountReadonlyControllersSid             = 75,
2608     WinBuiltinEventLogReadersGroup               = 76,
2609     WinNewEnterpriseReadonlyControllersSid       = 77,
2610     WinBuiltinCertSvcDComAccessGroup             = 78,
2611     WinMediumPlusLabelSid                        = 79,
2612     WinLocalLogonSid                             = 80,
2613     WinConsoleLogonSid                           = 81,
2614     WinThisOrganizationCertificateSid            = 82,
2615     WinApplicationPackageAuthoritySid            = 83,
2616     WinBuiltinAnyPackageSid                      = 84,
2617     WinCapabilityInternetClientSid               = 85,
2618     WinCapabilityInternetClientServerSid         = 86,
2619     WinCapabilityPrivateNetworkClientServerSid   = 87,
2620     WinCapabilityPicturesLibrarySid              = 88,
2621     WinCapabilityVideosLibrarySid                = 89,
2622     WinCapabilityMusicLibrarySid                 = 90,
2623     WinCapabilityDocumentsLibrarySid             = 91,
2624     WinCapabilitySharedUserCertificatesSid       = 92,
2625     WinCapabilityEnterpriseAuthenticationSid     = 93,
2626     WinCapabilityRemovableStorageSid             = 94
2627 }
2628 struct QUOTA_LIMITS {
2629     SIZE_T PagedPoolLimit;
2630     SIZE_T NonPagedPoolLimit;
2631     SIZE_T MinimumWorkingSetSize;
2632     SIZE_T MaximumWorkingSetSize;
2633     SIZE_T PagefileLimit;
2634     LARGE_INTEGER TimeLimit;
2635 }
2636 alias QUOTA_LIMITS* PQUOTA_LIMITS;
2637 
2638 struct IO_COUNTERS {
2639     ULONGLONG ReadOperationCount;
2640     ULONGLONG WriteOperationCount;
2641     ULONGLONG OtherOperationCount;
2642     ULONGLONG ReadTransferCount;
2643     ULONGLONG WriteTransferCount;
2644     ULONGLONG OtherTransferCount;
2645 }
2646 alias IO_COUNTERS* PIO_COUNTERS;
2647 
2648 struct FILE_NOTIFY_INFORMATION {
2649     DWORD NextEntryOffset;
2650     DWORD Action;
2651     DWORD FileNameLength = 0;
2652     WCHAR _FileName = 0;
2653 
2654     WCHAR* FileName() return { return &_FileName; }
2655 }
2656 alias FILE_NOTIFY_INFORMATION* PFILE_NOTIFY_INFORMATION;
2657 
2658 struct TAPE_ERASE {
2659     DWORD   Type;
2660     BOOLEAN Immediate;
2661 }
2662 alias TAPE_ERASE* PTAPE_ERASE;
2663 
2664 struct TAPE_GET_DRIVE_PARAMETERS {
2665     BOOLEAN ECC;
2666     BOOLEAN Compression;
2667     BOOLEAN DataPadding;
2668     BOOLEAN ReportSetmarks;
2669     DWORD   DefaultBlockSize;
2670     DWORD   MaximumBlockSize;
2671     DWORD   MinimumBlockSize;
2672     DWORD   MaximumPartitionCount;
2673     DWORD   FeaturesLow;
2674     DWORD   FeaturesHigh;
2675     DWORD   EOTWarningZoneSize;
2676 }
2677 alias TAPE_GET_DRIVE_PARAMETERS* PTAPE_GET_DRIVE_PARAMETERS;
2678 
2679 struct TAPE_GET_MEDIA_PARAMETERS {
2680     LARGE_INTEGER Capacity;
2681     LARGE_INTEGER Remaining;
2682     DWORD         BlockSize;
2683     DWORD         PartitionCount;
2684     BOOLEAN       WriteProtected;
2685 }
2686 alias TAPE_GET_MEDIA_PARAMETERS* PTAPE_GET_MEDIA_PARAMETERS;
2687 
2688 struct TAPE_GET_POSITION {
2689     ULONG Type;
2690     ULONG Partition;
2691     ULONG OffsetLow;
2692     ULONG OffsetHigh;
2693 }
2694 alias TAPE_GET_POSITION* PTAPE_GET_POSITION;
2695 
2696 struct TAPE_PREPARE {
2697     DWORD   Operation;
2698     BOOLEAN Immediate;
2699 }
2700 alias TAPE_PREPARE* PTAPE_PREPARE;
2701 
2702 struct TAPE_SET_DRIVE_PARAMETERS {
2703     BOOLEAN ECC;
2704     BOOLEAN Compression;
2705     BOOLEAN DataPadding;
2706     BOOLEAN ReportSetmarks;
2707     ULONG   EOTWarningZoneSize;
2708 }
2709 alias TAPE_SET_DRIVE_PARAMETERS* PTAPE_SET_DRIVE_PARAMETERS;
2710 
2711 struct TAPE_SET_MEDIA_PARAMETERS {
2712     ULONG BlockSize;
2713 }
2714 alias TAPE_SET_MEDIA_PARAMETERS* PTAPE_SET_MEDIA_PARAMETERS;
2715 
2716 struct TAPE_SET_POSITION {
2717     DWORD         Method;
2718     DWORD         Partition;
2719     LARGE_INTEGER Offset;
2720     BOOLEAN       Immediate;
2721 }
2722 alias TAPE_SET_POSITION* PTAPE_SET_POSITION;
2723 
2724 struct TAPE_WRITE_MARKS {
2725     DWORD   Type;
2726     DWORD   Count;
2727     BOOLEAN Immediate;
2728 }
2729 alias TAPE_WRITE_MARKS* PTAPE_WRITE_MARKS;
2730 
2731 struct TAPE_CREATE_PARTITION {
2732     DWORD Method;
2733     DWORD Count;
2734     DWORD Size;
2735 }
2736 alias TAPE_CREATE_PARTITION* PTAPE_CREATE_PARTITION;
2737 
2738 struct MEMORY_BASIC_INFORMATION {
2739     PVOID BaseAddress;
2740     PVOID AllocationBase;
2741     DWORD AllocationProtect;
2742     SIZE_T RegionSize;
2743     DWORD State;
2744     DWORD Protect;
2745     DWORD Type;
2746 }
2747 alias MEMORY_BASIC_INFORMATION* PMEMORY_BASIC_INFORMATION;
2748 
2749 struct MESSAGE_RESOURCE_ENTRY {
2750     WORD Length;
2751     WORD Flags;
2752     BYTE _Text;
2753 
2754     BYTE* Text() return { return &_Text; }
2755 }
2756 alias MESSAGE_RESOURCE_ENTRY* PMESSAGE_RESOURCE_ENTRY;
2757 
2758 struct MESSAGE_RESOURCE_BLOCK {
2759     DWORD LowId;
2760     DWORD HighId;
2761     DWORD OffsetToEntries;
2762 }
2763 alias MESSAGE_RESOURCE_BLOCK* PMESSAGE_RESOURCE_BLOCK;
2764 
2765 struct MESSAGE_RESOURCE_DATA {
2766     DWORD NumberOfBlocks;
2767     MESSAGE_RESOURCE_BLOCK _Blocks;
2768 
2769     MESSAGE_RESOURCE_BLOCK* Blocks() return { return &_Blocks; }
2770 }
2771 alias MESSAGE_RESOURCE_DATA* PMESSAGE_RESOURCE_DATA;
2772 
2773 struct LIST_ENTRY {
2774     LIST_ENTRY* Flink;
2775     LIST_ENTRY* Blink;
2776 }
2777 alias LIST_ENTRY* PLIST_ENTRY;
2778 alias LIST_ENTRY _LIST_ENTRY;
2779 
2780 struct SINGLE_LIST_ENTRY {
2781     SINGLE_LIST_ENTRY* Next;
2782 }
2783 
2784 version (Win64) {
2785     align (16)
2786     struct SLIST_ENTRY {
2787         SLIST_ENTRY* Next;
2788     }
2789 } else {
2790     alias SINGLE_LIST_ENTRY SLIST_ENTRY;
2791 }
2792 alias SINGLE_LIST_ENTRY* PSINGLE_LIST_ENTRY, PSLIST_ENTRY;
2793 
2794 union SLIST_HEADER {
2795     ULONGLONG       Alignment;
2796     struct {
2797         SLIST_ENTRY Next;
2798         WORD        Depth;
2799         WORD        Sequence;
2800     }
2801 }
2802 alias SLIST_HEADER* PSLIST_HEADER;
2803 
2804 struct RTL_CRITICAL_SECTION_DEBUG {
2805     WORD       Type;
2806     WORD       CreatorBackTraceIndex;
2807     RTL_CRITICAL_SECTION* CriticalSection;
2808     LIST_ENTRY ProcessLocksList;
2809     DWORD      EntryCount;
2810     DWORD      ContentionCount;
2811     DWORD[2]   Spare;
2812 }
2813 alias RTL_CRITICAL_SECTION_DEBUG* PRTL_CRITICAL_SECTION_DEBUG;
2814 alias RTL_CRITICAL_SECTION_DEBUG _RTL_CRITICAL_SECTION_DEBUG;
2815 
2816 struct RTL_CRITICAL_SECTION {
2817     PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
2818     LONG   LockCount;
2819     LONG   RecursionCount;
2820     HANDLE OwningThread;
2821     HANDLE LockSemaphore;
2822     ULONG_PTR SpinCount;
2823     alias Reserved = SpinCount;
2824 }
2825 alias RTL_CRITICAL_SECTION* PRTL_CRITICAL_SECTION;
2826 alias RTL_CRITICAL_SECTION _RTL_CRITICAL_SECTION;
2827 
2828 struct EVENTLOGRECORD {
2829     DWORD Length;
2830     DWORD Reserved;
2831     DWORD RecordNumber;
2832     DWORD TimeGenerated;
2833     DWORD TimeWritten;
2834     DWORD EventID;
2835     WORD  EventType;
2836     WORD  NumStrings;
2837     WORD  EventCategory;
2838     WORD  ReservedFlags;
2839     DWORD ClosingRecordNumber;
2840     DWORD StringOffset;
2841     DWORD UserSidLength;
2842     DWORD UserSidOffset;
2843     DWORD DataLength;
2844     DWORD DataOffset;
2845 }
2846 alias EVENTLOGRECORD* PEVENTLOGRECORD;
2847 
2848 struct OSVERSIONINFOA {
2849     DWORD     dwOSVersionInfoSize = OSVERSIONINFOA.sizeof;
2850     DWORD     dwMajorVersion;
2851     DWORD     dwMinorVersion;
2852     DWORD     dwBuildNumber;
2853     DWORD     dwPlatformId;
2854     CHAR[128] szCSDVersion = 0;
2855 }
2856 alias OSVERSIONINFOA* POSVERSIONINFOA, LPOSVERSIONINFOA;
2857 
2858 struct OSVERSIONINFOW {
2859     DWORD      dwOSVersionInfoSize = OSVERSIONINFOW.sizeof;
2860     DWORD      dwMajorVersion;
2861     DWORD      dwMinorVersion;
2862     DWORD      dwBuildNumber;
2863     DWORD      dwPlatformId;
2864     WCHAR[128] szCSDVersion = 0;
2865 }
2866 alias OSVERSIONINFOW* POSVERSIONINFOW, LPOSVERSIONINFOW;
2867 
2868 struct OSVERSIONINFOEXA {
2869     DWORD     dwOSVersionInfoSize;
2870     DWORD     dwMajorVersion;
2871     DWORD     dwMinorVersion;
2872     DWORD     dwBuildNumber;
2873     DWORD     dwPlatformId;
2874     CHAR[128] szCSDVersion = 0;
2875     WORD      wServicePackMajor;
2876     WORD      wServicePackMinor;
2877     WORD      wSuiteMask;
2878     BYTE      wProductType;
2879     BYTE      wReserved;
2880 }
2881 alias OSVERSIONINFOEXA* POSVERSIONINFOEXA, LPOSVERSIONINFOEXA;
2882 
2883 struct OSVERSIONINFOEXW {
2884     DWORD      dwOSVersionInfoSize;
2885     DWORD      dwMajorVersion;
2886     DWORD      dwMinorVersion;
2887     DWORD      dwBuildNumber;
2888     DWORD      dwPlatformId;
2889     WCHAR[128] szCSDVersion = 0;
2890     WORD       wServicePackMajor;
2891     WORD       wServicePackMinor;
2892     WORD       wSuiteMask;
2893     BYTE       wProductType;
2894     BYTE       wReserved;
2895 }
2896 alias OSVERSIONINFOEXW* POSVERSIONINFOEXW, LPOSVERSIONINFOEXW;
2897 
2898 align(2) struct IMAGE_VXD_HEADER {
2899     WORD     e32_magic;
2900     BYTE     e32_border;
2901     BYTE     e32_worder;
2902     DWORD    e32_level;
2903     WORD     e32_cpu;
2904     WORD     e32_os;
2905     DWORD    e32_ver;
2906     DWORD    e32_mflags;
2907     DWORD    e32_mpages;
2908     DWORD    e32_startobj;
2909     DWORD    e32_eip;
2910     DWORD    e32_stackobj;
2911     DWORD    e32_esp;
2912     DWORD    e32_pagesize;
2913     DWORD    e32_lastpagesize;
2914     DWORD    e32_fixupsize;
2915     DWORD    e32_fixupsum;
2916     DWORD    e32_ldrsize;
2917     DWORD    e32_ldrsum;
2918     DWORD    e32_objtab;
2919     DWORD    e32_objcnt;
2920     DWORD    e32_objmap;
2921     DWORD    e32_itermap;
2922     DWORD    e32_rsrctab;
2923     DWORD    e32_rsrccnt;
2924     DWORD    e32_restab;
2925     DWORD    e32_enttab;
2926     DWORD    e32_dirtab;
2927     DWORD    e32_dircnt;
2928     DWORD    e32_fpagetab;
2929     DWORD    e32_frectab;
2930     DWORD    e32_impmod;
2931     DWORD    e32_impmodcnt;
2932     DWORD    e32_impproc;
2933     DWORD    e32_pagesum;
2934     DWORD    e32_datapage;
2935     DWORD    e32_preload;
2936     DWORD    e32_nrestab;
2937     DWORD    e32_cbnrestab;
2938     DWORD    e32_nressum;
2939     DWORD    e32_autodata;
2940     DWORD    e32_debuginfo;
2941     DWORD    e32_debuglen;
2942     DWORD    e32_instpreload;
2943     DWORD    e32_instdemand;
2944     DWORD    e32_heapsize;
2945     BYTE[12] e32_res3;
2946     DWORD    e32_winresoff;
2947     DWORD    e32_winreslen;
2948     WORD     e32_devid;
2949     WORD     e32_ddkver;
2950 }
2951 alias IMAGE_VXD_HEADER* PIMAGE_VXD_HEADER;
2952 
2953 align(4):
2954 struct IMAGE_FILE_HEADER {
2955     WORD  Machine;
2956     WORD  NumberOfSections;
2957     DWORD TimeDateStamp;
2958     DWORD PointerToSymbolTable;
2959     DWORD NumberOfSymbols;
2960     WORD  SizeOfOptionalHeader;
2961     WORD  Characteristics;
2962 }
2963 alias IMAGE_FILE_HEADER* PIMAGE_FILE_HEADER;
2964 // const IMAGE_SIZEOF_FILE_HEADER = IMAGE_FILE_HEADER.sizeof;
2965 
2966 struct IMAGE_DATA_DIRECTORY {
2967     DWORD VirtualAddress;
2968     DWORD Size;
2969 }
2970 alias IMAGE_DATA_DIRECTORY* PIMAGE_DATA_DIRECTORY;
2971 
2972 struct IMAGE_OPTIONAL_HEADER32 {
2973     WORD  Magic;
2974     BYTE  MajorLinkerVersion;
2975     BYTE  MinorLinkerVersion;
2976     DWORD SizeOfCode;
2977     DWORD SizeOfInitializedData;
2978     DWORD SizeOfUninitializedData;
2979     DWORD AddressOfEntryPoint;
2980     DWORD BaseOfCode;
2981     DWORD BaseOfData;
2982     DWORD ImageBase;
2983     DWORD SectionAlignment;
2984     DWORD FileAlignment;
2985     WORD  MajorOperatingSystemVersion;
2986     WORD  MinorOperatingSystemVersion;
2987     WORD  MajorImageVersion;
2988     WORD  MinorImageVersion;
2989     WORD  MajorSubsystemVersion;
2990     WORD  MinorSubsystemVersion;
2991     DWORD Win32VersionValue;
2992     DWORD SizeOfImage;
2993     DWORD SizeOfHeaders;
2994     DWORD CheckSum;
2995     WORD  Subsystem;
2996     WORD  DllCharacteristics;
2997     DWORD SizeOfStackReserve;
2998     DWORD SizeOfStackCommit;
2999     DWORD SizeOfHeapReserve;
3000     DWORD SizeOfHeapCommit;
3001     DWORD LoaderFlags;
3002     DWORD NumberOfRvaAndSizes;
3003     IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] DataDirectory;
3004 }
3005 alias IMAGE_OPTIONAL_HEADER32* PIMAGE_OPTIONAL_HEADER32;
3006 
3007 struct IMAGE_OPTIONAL_HEADER64 {
3008     WORD      Magic;
3009     BYTE      MajorLinkerVersion;
3010     BYTE      MinorLinkerVersion;
3011     DWORD     SizeOfCode;
3012     DWORD     SizeOfInitializedData;
3013     DWORD     SizeOfUninitializedData;
3014     DWORD     AddressOfEntryPoint;
3015     DWORD     BaseOfCode;
3016     ULONGLONG ImageBase;
3017     DWORD     SectionAlignment;
3018     DWORD     FileAlignment;
3019     WORD      MajorOperatingSystemVersion;
3020     WORD      MinorOperatingSystemVersion;
3021     WORD      MajorImageVersion;
3022     WORD      MinorImageVersion;
3023     WORD      MajorSubsystemVersion;
3024     WORD      MinorSubsystemVersion;
3025     DWORD     Win32VersionValue;
3026     DWORD     SizeOfImage;
3027     DWORD     SizeOfHeaders;
3028     DWORD     CheckSum;
3029     WORD      Subsystem;
3030     WORD      DllCharacteristics;
3031     ULONGLONG SizeOfStackReserve;
3032     ULONGLONG SizeOfStackCommit;
3033     ULONGLONG SizeOfHeapReserve;
3034     ULONGLONG SizeOfHeapCommit;
3035     DWORD     LoaderFlags;
3036     DWORD     NumberOfRvaAndSizes;
3037     IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] DataDirectory;
3038 }
3039 alias IMAGE_OPTIONAL_HEADER64* PIMAGE_OPTIONAL_HEADER64;
3040 
3041 struct IMAGE_ROM_OPTIONAL_HEADER {
3042     WORD     Magic;
3043     BYTE     MajorLinkerVersion;
3044     BYTE     MinorLinkerVersion;
3045     DWORD    SizeOfCode;
3046     DWORD    SizeOfInitializedData;
3047     DWORD    SizeOfUninitializedData;
3048     DWORD    AddressOfEntryPoint;
3049     DWORD    BaseOfCode;
3050     DWORD    BaseOfData;
3051     DWORD    BaseOfBss;
3052     DWORD    GprMask;
3053     DWORD[4] CprMask;
3054     DWORD    GpValue;
3055 }
3056 alias IMAGE_ROM_OPTIONAL_HEADER* PIMAGE_ROM_OPTIONAL_HEADER;
3057 
3058 align(2):
3059 struct IMAGE_DOS_HEADER {
3060     WORD     e_magic;
3061     WORD     e_cblp;
3062     WORD     e_cp;
3063     WORD     e_crlc;
3064     WORD     e_cparhdr;
3065     WORD     e_minalloc;
3066     WORD     e_maxalloc;
3067     WORD     e_ss;
3068     WORD     e_sp;
3069     WORD     e_csum;
3070     WORD     e_ip;
3071     WORD     e_cs;
3072     WORD     e_lfarlc;
3073     WORD     e_ovno;
3074     WORD[4] e_res;
3075     WORD     e_oemid;
3076     WORD     e_oeminfo;
3077     WORD[10] e_res2;
3078     LONG     e_lfanew;
3079 }
3080 alias IMAGE_DOS_HEADER* PIMAGE_DOS_HEADER;
3081 
3082 struct IMAGE_OS2_HEADER {
3083     WORD ne_magic;
3084     CHAR ne_ver = 0;
3085     CHAR ne_rev = 0;
3086     WORD ne_enttab;
3087     WORD ne_cbenttab;
3088     LONG ne_crc;
3089     WORD ne_flags;
3090     WORD ne_autodata;
3091     WORD ne_heap;
3092     WORD ne_stack;
3093     LONG ne_csip;
3094     LONG ne_sssp;
3095     WORD ne_cseg;
3096     WORD ne_cmod;
3097     WORD ne_cbnrestab;
3098     WORD ne_segtab;
3099     WORD ne_rsrctab;
3100     WORD ne_restab;
3101     WORD ne_modtab;
3102     WORD ne_imptab;
3103     LONG ne_nrestab;
3104     WORD ne_cmovent;
3105     WORD ne_align;
3106     WORD ne_cres;
3107     BYTE ne_exetyp;
3108     BYTE ne_flagsothers;
3109     WORD ne_pretthunks;
3110     WORD ne_psegrefbytes;
3111     WORD ne_swaparea;
3112     WORD ne_expver;
3113 }
3114 alias IMAGE_OS2_HEADER* PIMAGE_OS2_HEADER;
3115 
3116 align(4) struct IMAGE_NT_HEADERS32 {
3117     DWORD                 Signature;
3118     IMAGE_FILE_HEADER     FileHeader;
3119     IMAGE_OPTIONAL_HEADER32 OptionalHeader;
3120 }
3121 alias IMAGE_NT_HEADERS32* PIMAGE_NT_HEADERS32;
3122 
3123 align(4) struct IMAGE_NT_HEADERS64 {
3124     DWORD                 Signature;
3125     IMAGE_FILE_HEADER     FileHeader;
3126     IMAGE_OPTIONAL_HEADER64 OptionalHeader;
3127 }
3128 alias IMAGE_NT_HEADERS64* PIMAGE_NT_HEADERS64;
3129 
3130 struct IMAGE_ROM_HEADERS {
3131     IMAGE_FILE_HEADER         FileHeader;
3132     IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
3133 }
3134 alias IMAGE_ROM_HEADERS* PIMAGE_ROM_HEADERS;
3135 
3136 struct IMAGE_SECTION_HEADER {
3137     BYTE[IMAGE_SIZEOF_SHORT_NAME] Name;
3138     union _Misc {
3139         DWORD PhysicalAddress;
3140         DWORD VirtualSize;
3141     }
3142     _Misc Misc;
3143     DWORD VirtualAddress;
3144     DWORD SizeOfRawData;
3145     DWORD PointerToRawData;
3146     DWORD PointerToRelocations;
3147     DWORD PointerToLinenumbers;
3148     WORD  NumberOfRelocations;
3149     WORD  NumberOfLinenumbers;
3150     DWORD Characteristics;
3151 }
3152 alias IMAGE_SECTION_HEADER* PIMAGE_SECTION_HEADER;
3153 
3154 struct IMAGE_SYMBOL {
3155     union _N {
3156         BYTE[8]   ShortName;
3157         struct _Name {
3158             DWORD Short;
3159             DWORD Long;
3160         }
3161         _Name Name;
3162         DWORD[2]  LongName; // PBYTE[2]
3163     }
3164     _N    N;
3165     DWORD Value;
3166     SHORT SectionNumber;
3167     WORD  Type;
3168     BYTE  StorageClass;
3169     BYTE  NumberOfAuxSymbols;
3170 }
3171 alias IMAGE_SYMBOL* PIMAGE_SYMBOL;
3172 
3173 union IMAGE_AUX_SYMBOL {
3174     struct _Sym {
3175         DWORD           TagIndex;
3176         union _Misc {
3177             struct _LnSz {
3178                 WORD    Linenumber;
3179                 WORD    Size;
3180             }
3181             _LnSz       LnSz;
3182             DWORD       TotalSize;
3183         }
3184         _Misc Misc;
3185         union _FcnAry {
3186             struct _Function {
3187                 DWORD   PointerToLinenumber;
3188                 DWORD   PointerToNextFunction;
3189             }
3190             _Function   Function;
3191             struct _Array {
3192                 WORD[4] Dimension;
3193             }
3194             _Array      Array;
3195         }
3196         _FcnAry         FcnAry;
3197         WORD            TvIndex;
3198     }
3199     _Sym                Sym;
3200     struct _File {
3201         BYTE[IMAGE_SIZEOF_SYMBOL] Name;
3202     }
3203     _File               File;
3204     struct _Section {
3205         DWORD           Length;
3206         WORD            NumberOfRelocations;
3207         WORD            NumberOfLinenumbers;
3208         DWORD           CheckSum;
3209         SHORT           Number;
3210         BYTE            Selection;
3211     }
3212     _Section            Section;
3213 }
3214 alias IMAGE_AUX_SYMBOL* PIMAGE_AUX_SYMBOL;
3215 
3216 struct IMAGE_COFF_SYMBOLS_HEADER {
3217     DWORD NumberOfSymbols;
3218     DWORD LvaToFirstSymbol;
3219     DWORD NumberOfLinenumbers;
3220     DWORD LvaToFirstLinenumber;
3221     DWORD RvaToFirstByteOfCode;
3222     DWORD RvaToLastByteOfCode;
3223     DWORD RvaToFirstByteOfData;
3224     DWORD RvaToLastByteOfData;
3225 }
3226 alias IMAGE_COFF_SYMBOLS_HEADER* PIMAGE_COFF_SYMBOLS_HEADER;
3227 
3228 struct IMAGE_RELOCATION {
3229     union {
3230         DWORD VirtualAddress;
3231         DWORD RelocCount;
3232     }
3233     DWORD     SymbolTableIndex;
3234     WORD      Type;
3235 }
3236 alias IMAGE_RELOCATION* PIMAGE_RELOCATION;
3237 
3238 align(4) struct IMAGE_BASE_RELOCATION {
3239     DWORD VirtualAddress;
3240     DWORD SizeOfBlock;
3241 }
3242 alias IMAGE_BASE_RELOCATION* PIMAGE_BASE_RELOCATION;
3243 
3244 align(2) struct IMAGE_LINENUMBER {
3245     union _Type {
3246         DWORD SymbolTableIndex;
3247         DWORD VirtualAddress;
3248     }
3249     _Type Type;
3250     WORD  Linenumber;
3251 }
3252 alias IMAGE_LINENUMBER* PIMAGE_LINENUMBER;
3253 
3254 align(4):
3255 struct IMAGE_ARCHIVE_MEMBER_HEADER {
3256     BYTE[16] Name;
3257     BYTE[12] Date;
3258     BYTE[6]  UserID;
3259     BYTE[6]  GroupID;
3260     BYTE[8]  Mode;
3261     BYTE[10] Size;
3262     BYTE[2]  EndHeader;
3263 }
3264 alias IMAGE_ARCHIVE_MEMBER_HEADER* PIMAGE_ARCHIVE_MEMBER_HEADER;
3265 
3266 struct IMAGE_EXPORT_DIRECTORY {
3267     DWORD Characteristics;
3268     DWORD TimeDateStamp;
3269     WORD  MajorVersion;
3270     WORD  MinorVersion;
3271     DWORD Name;
3272     DWORD Base;
3273     DWORD NumberOfFunctions;
3274     DWORD NumberOfNames;
3275     DWORD AddressOfFunctions;
3276     DWORD AddressOfNames;
3277     DWORD AddressOfNameOrdinals;
3278 }
3279 alias IMAGE_EXPORT_DIRECTORY* PIMAGE_EXPORT_DIRECTORY;
3280 
3281 struct IMAGE_IMPORT_BY_NAME {
3282     WORD Hint;
3283     BYTE _Name;
3284 
3285     BYTE* Name() return { return &_Name; }
3286 }
3287 alias IMAGE_IMPORT_BY_NAME* PIMAGE_IMPORT_BY_NAME;
3288 
3289 struct IMAGE_THUNK_DATA32 {
3290     union _u1 {
3291         DWORD ForwarderString;
3292         DWORD Function;
3293         DWORD Ordinal;
3294         DWORD AddressOfData;
3295     }
3296     _u1 u1;
3297 }
3298 alias IMAGE_THUNK_DATA32* PIMAGE_THUNK_DATA32;
3299 
3300 struct IMAGE_THUNK_DATA64 {
3301     union _u1 {
3302         ULONGLONG ForwarderString;
3303         ULONGLONG Function;
3304         ULONGLONG Ordinal;
3305         ULONGLONG AddressOfData;
3306     }
3307     _u1 u1;
3308 }
3309 alias IMAGE_THUNK_DATA64* PIMAGE_THUNK_DATA64;
3310 
3311 struct IMAGE_IMPORT_DESCRIPTOR {
3312     union {
3313         DWORD Characteristics;
3314         DWORD OriginalFirstThunk;
3315     }
3316     DWORD TimeDateStamp;
3317     DWORD ForwarderChain;
3318     DWORD Name;
3319     DWORD FirstThunk;
3320 }
3321 alias IMAGE_IMPORT_DESCRIPTOR* PIMAGE_IMPORT_DESCRIPTOR;
3322 
3323 struct IMAGE_BOUND_IMPORT_DESCRIPTOR {
3324     DWORD TimeDateStamp;
3325     WORD  OffsetModuleName;
3326     WORD  NumberOfModuleForwarderRefs;
3327 }
3328 alias IMAGE_BOUND_IMPORT_DESCRIPTOR* PIMAGE_BOUND_IMPORT_DESCRIPTOR;
3329 
3330 struct IMAGE_BOUND_FORWARDER_REF {
3331     DWORD TimeDateStamp;
3332     WORD  OffsetModuleName;
3333     WORD  Reserved;
3334 }
3335 alias IMAGE_BOUND_FORWARDER_REF* PIMAGE_BOUND_FORWARDER_REF;
3336 
3337 struct IMAGE_TLS_DIRECTORY32 {
3338     DWORD StartAddressOfRawData;
3339     DWORD EndAddressOfRawData;
3340     DWORD AddressOfIndex;
3341     DWORD AddressOfCallBacks;
3342     DWORD SizeOfZeroFill;
3343     DWORD Characteristics;
3344 }
3345 alias IMAGE_TLS_DIRECTORY32* PIMAGE_TLS_DIRECTORY32;
3346 
3347 struct IMAGE_TLS_DIRECTORY64 {
3348     ULONGLONG StartAddressOfRawData;
3349     ULONGLONG EndAddressOfRawData;
3350     ULONGLONG AddressOfIndex;
3351     ULONGLONG AddressOfCallBacks;
3352     DWORD     SizeOfZeroFill;
3353     DWORD     Characteristics;
3354 }
3355 alias IMAGE_TLS_DIRECTORY64* PIMAGE_TLS_DIRECTORY64;
3356 
3357 struct IMAGE_RESOURCE_DIRECTORY {
3358     DWORD Characteristics;
3359     DWORD TimeDateStamp;
3360     WORD  MajorVersion;
3361     WORD  MinorVersion;
3362     WORD  NumberOfNamedEntries;
3363     WORD  NumberOfIdEntries;
3364 }
3365 alias IMAGE_RESOURCE_DIRECTORY* PIMAGE_RESOURCE_DIRECTORY;
3366 
3367 struct IMAGE_RESOURCE_DIRECTORY_ENTRY {
3368     union {
3369         /+struct {
3370             DWORD NameOffset:31;
3371             DWORD NameIsString:1;
3372         }+/
3373         DWORD Name;
3374         WORD Id;
3375     }
3376     DWORD OffsetToData;
3377         /+struct {
3378             DWORD OffsetToDirectory:31;
3379             DWORD DataIsDirectory:1;
3380         }+/
3381 
3382     uint NameOffset()        { return Name & 0x7FFFFFFF; }
3383     bool NameIsString()      { return cast(bool)(Name & 0x80000000); }
3384     uint OffsetToDirectory() { return OffsetToData & 0x7FFFFFFF; }
3385     bool DataIsDirectory()   { return cast(bool)(OffsetToData & 0x80000000); }
3386 
3387     uint NameOffset(uint n) {
3388         Name = (Name & 0x80000000) | (n & 0x7FFFFFFF);
3389         return n & 0x7FFFFFFF;
3390     }
3391 
3392     bool NameIsString(bool n) {
3393         Name = (Name & 0x7FFFFFFF) | (n << 31); return n;
3394     }
3395 
3396     uint OffsetToDirectory(uint o) {
3397         OffsetToData = (OffsetToData & 0x80000000) | (o & 0x7FFFFFFF);
3398         return o & 0x7FFFFFFF;
3399     }
3400 
3401     bool DataIsDirectory(bool d) {
3402         OffsetToData = (OffsetToData & 0x7FFFFFFF) | (d << 31); return d;
3403     }
3404 }
3405 alias IMAGE_RESOURCE_DIRECTORY_ENTRY* PIMAGE_RESOURCE_DIRECTORY_ENTRY;
3406 
3407 struct IMAGE_RESOURCE_DIRECTORY_STRING {
3408     WORD Length;
3409     CHAR _NameString = 0;
3410 
3411     CHAR* NameString() return { return &_NameString; }
3412 }
3413 alias IMAGE_RESOURCE_DIRECTORY_STRING* PIMAGE_RESOURCE_DIRECTORY_STRING;
3414 
3415 struct IMAGE_RESOURCE_DIR_STRING_U {
3416     WORD  Length;
3417     WCHAR _NameString = 0;
3418 
3419     WCHAR* NameString() return { return &_NameString; }
3420 }
3421 alias IMAGE_RESOURCE_DIR_STRING_U* PIMAGE_RESOURCE_DIR_STRING_U;
3422 
3423 struct IMAGE_RESOURCE_DATA_ENTRY {
3424     DWORD OffsetToData;
3425     DWORD Size;
3426     DWORD CodePage;
3427     DWORD Reserved;
3428 }
3429 alias IMAGE_RESOURCE_DATA_ENTRY* PIMAGE_RESOURCE_DATA_ENTRY;
3430 
3431 struct IMAGE_LOAD_CONFIG_DIRECTORY32 {
3432     DWORD    Characteristics;
3433     DWORD    TimeDateStamp;
3434     WORD     MajorVersion;
3435     WORD     MinorVersion;
3436     DWORD    GlobalFlagsClear;
3437     DWORD    GlobalFlagsSet;
3438     DWORD    CriticalSectionDefaultTimeout;
3439     DWORD    DeCommitFreeBlockThreshold;
3440     DWORD    DeCommitTotalFreeThreshold;
3441     PVOID    LockPrefixTable;
3442     DWORD    MaximumAllocationSize;
3443     DWORD    VirtualMemoryThreshold;
3444     DWORD    ProcessHeapFlags;
3445     DWORD[4] Reserved;
3446 }
3447 alias IMAGE_LOAD_CONFIG_DIRECTORY32* PIMAGE_LOAD_CONFIG_DIRECTORY32;
3448 
3449 struct IMAGE_LOAD_CONFIG_DIRECTORY64 {
3450     DWORD     Characteristics;
3451     DWORD     TimeDateStamp;
3452     WORD      MajorVersion;
3453     WORD      MinorVersion;
3454     DWORD     GlobalFlagsClear;
3455     DWORD     GlobalFlagsSet;
3456     DWORD     CriticalSectionDefaultTimeout;
3457     ULONGLONG DeCommitFreeBlockThreshold;
3458     ULONGLONG DeCommitTotalFreeThreshold;
3459     ULONGLONG LockPrefixTable;
3460     ULONGLONG MaximumAllocationSize;
3461     ULONGLONG VirtualMemoryThreshold;
3462     ULONGLONG ProcessAffinityMask;
3463     DWORD     ProcessHeapFlags;
3464     WORD      CSDFlags;
3465     WORD      Reserved1;
3466     ULONGLONG EditList;
3467     DWORD[2]  Reserved;
3468 }
3469 alias IMAGE_LOAD_CONFIG_DIRECTORY64* PIMAGE_LOAD_CONFIG_DIRECTORY64;
3470 
3471 version (Win64) {
3472     alias IMAGE_LOAD_CONFIG_DIRECTORY64 IMAGE_LOAD_CONFIG_DIRECTORY;
3473 } else {
3474     alias IMAGE_LOAD_CONFIG_DIRECTORY32 IMAGE_LOAD_CONFIG_DIRECTORY;
3475 }
3476 alias IMAGE_LOAD_CONFIG_DIRECTORY* PIMAGE_LOAD_CONFIG_DIRECTORY;
3477 
3478 // Note versions for Alpha, Alpha64, ARM removed.
3479 struct IMAGE_RUNTIME_FUNCTION_ENTRY {
3480     DWORD BeginAddress;
3481     DWORD EndAddress;
3482     union {
3483         DWORD UnwindInfoAddress;
3484         DWORD UnwindData;
3485     }
3486 }
3487 alias IMAGE_RUNTIME_FUNCTION_ENTRY* PIMAGE_RUNTIME_FUNCTION_ENTRY;
3488 
3489 struct IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
3490     uint      FuncStart;
3491     union {
3492         ubyte PrologLen;
3493         uint  _bf;
3494     }
3495 /+
3496     unsigned int FuncLen:22;
3497     unsigned int ThirtyTwoBit:1;
3498     unsigned int ExceptionFlag:1;
3499 +/
3500     uint FuncLen()       { return (_bf >> 8) & 0x3FFFFF; }
3501     bool ThirtyTwoBit()  { return cast(bool)(_bf & 0x40000000); }
3502     bool ExceptionFlag() { return cast(bool)(_bf & 0x80000000); }
3503 
3504     uint FuncLen(uint f) {
3505         _bf = (_bf & ~0x3FFFFF00) | ((f & 0x3FFFFF) << 8); return f & 0x3FFFFF;
3506     }
3507 
3508     bool ThirtyTwoBit(bool t) {
3509         _bf = (_bf & ~0x40000000) | (t << 30); return t;
3510     }
3511 
3512     bool ExceptionFlag(bool e) {
3513         _bf = (_bf & ~0x80000000) | (e << 31); return e;
3514     }
3515 }
3516 alias IMAGE_CE_RUNTIME_FUNCTION_ENTRY* PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;
3517 
3518 struct IMAGE_DEBUG_DIRECTORY {
3519     DWORD Characteristics;
3520     DWORD TimeDateStamp;
3521     WORD  MajorVersion;
3522     WORD  MinorVersion;
3523     DWORD Type;
3524     DWORD SizeOfData;
3525     DWORD AddressOfRawData;
3526     DWORD PointerToRawData;
3527 }
3528 alias IMAGE_DEBUG_DIRECTORY* PIMAGE_DEBUG_DIRECTORY;
3529 
3530 struct FPO_DATA {
3531     DWORD  ulOffStart;
3532     DWORD  cbProcSize;
3533     DWORD  cdwLocals;
3534     WORD   cdwParams;
3535     ubyte  cbProlog;
3536     ubyte  _bf;
3537 /+
3538     WORD cbRegs:3;
3539     WORD fHasSEH:1;
3540     WORD fUseBP:1;
3541     WORD reserved:1;
3542     WORD cbFrame:2;
3543 +/
3544     ubyte cbRegs()  { return cast(ubyte)(_bf & 0x07); }
3545     bool fHasSEH()  { return cast(bool)(_bf & 0x08); }
3546     bool fUseBP()   { return cast(bool)(_bf & 0x10); }
3547     bool reserved() { return cast(bool)(_bf & 0x20); }
3548     ubyte cbFrame() { return cast(ubyte)(_bf >> 6); }
3549 
3550     ubyte cbRegs(ubyte c) {
3551         _bf = cast(ubyte) ((_bf & ~0x07) | (c & 0x07));
3552         return cast(ubyte)(c & 0x07);
3553     }
3554 
3555     bool fHasSEH(bool f)  { _bf = cast(ubyte)((_bf & ~0x08) | (f << 3)); return f; }
3556     bool fUseBP(bool f)   { _bf = cast(ubyte)((_bf & ~0x10) | (f << 4)); return f; }
3557     bool reserved(bool r) { _bf = cast(ubyte)((_bf & ~0x20) | (r << 5)); return r; }
3558 
3559     ubyte cbFrame(ubyte c) {
3560         _bf = cast(ubyte) ((_bf & ~0xC0) | ((c & 0x03) << 6));
3561         return cast(ubyte)(c & 0x03);
3562     }
3563 }
3564 alias FPO_DATA* PFPO_DATA;
3565 
3566 struct IMAGE_DEBUG_MISC {
3567     DWORD   DataType;
3568     DWORD   Length;
3569     BOOLEAN Unicode;
3570     BYTE[3] Reserved;
3571     BYTE    _Data;
3572 
3573     BYTE*   Data() return { return &_Data; }
3574 }
3575 alias IMAGE_DEBUG_MISC* PIMAGE_DEBUG_MISC;
3576 
3577 struct IMAGE_FUNCTION_ENTRY {
3578     DWORD StartingAddress;
3579     DWORD EndingAddress;
3580     DWORD EndOfPrologue;
3581 }
3582 alias IMAGE_FUNCTION_ENTRY* PIMAGE_FUNCTION_ENTRY;
3583 
3584 struct IMAGE_FUNCTION_ENTRY64 {
3585     ULONGLONG     StartingAddress;
3586     ULONGLONG     EndingAddress;
3587     union {
3588         ULONGLONG EndOfPrologue;
3589         ULONGLONG UnwindInfoAddress;
3590     }
3591 }
3592 alias IMAGE_FUNCTION_ENTRY64* PIMAGE_FUNCTION_ENTRY64;
3593 
3594 struct IMAGE_SEPARATE_DEBUG_HEADER {
3595     WORD     Signature;
3596     WORD     Flags;
3597     WORD     Machine;
3598     WORD     Characteristics;
3599     DWORD    TimeDateStamp;
3600     DWORD    CheckSum;
3601     DWORD    ImageBase;
3602     DWORD    SizeOfImage;
3603     DWORD    NumberOfSections;
3604     DWORD    ExportedNamesSize;
3605     DWORD    DebugDirectorySize;
3606     DWORD    SectionAlignment;
3607     DWORD[2] Reserved;
3608 }
3609 alias IMAGE_SEPARATE_DEBUG_HEADER* PIMAGE_SEPARATE_DEBUG_HEADER;
3610 
3611 enum SERVICE_NODE_TYPE {
3612     DriverType               = SERVICE_KERNEL_DRIVER,
3613     FileSystemType           = SERVICE_FILE_SYSTEM_DRIVER,
3614     Win32ServiceOwnProcess   = SERVICE_WIN32_OWN_PROCESS,
3615     Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
3616     AdapterType              = SERVICE_ADAPTER,
3617     RecognizerType           = SERVICE_RECOGNIZER_DRIVER
3618 }
3619 
3620 enum SERVICE_LOAD_TYPE {
3621     BootLoad    = SERVICE_BOOT_START,
3622     SystemLoad  = SERVICE_SYSTEM_START,
3623     AutoLoad    = SERVICE_AUTO_START,
3624     DemandLoad  = SERVICE_DEMAND_START,
3625     DisableLoad = SERVICE_DISABLED
3626 }
3627 
3628 enum SERVICE_ERROR_TYPE {
3629     IgnoreError   = SERVICE_ERROR_IGNORE,
3630     NormalError   = SERVICE_ERROR_NORMAL,
3631     SevereError   = SERVICE_ERROR_SEVERE,
3632     CriticalError = SERVICE_ERROR_CRITICAL
3633 }
3634 alias SERVICE_ERROR_TYPE _CM_ERROR_CONTROL_TYPE;
3635 
3636 //DAC: According to MSJ, 'UnderTheHood', May 1996, this
3637 // structure is not documented in any official Microsoft header file.
3638 alias void EXCEPTION_REGISTRATION_RECORD;
3639 
3640 align:
3641 struct NT_TIB {
3642     EXCEPTION_REGISTRATION_RECORD *ExceptionList;
3643     PVOID StackBase;
3644     PVOID StackLimit;
3645     PVOID SubSystemTib;
3646     union {
3647         PVOID FiberData;
3648         DWORD Version;
3649     }
3650     PVOID ArbitraryUserPointer;
3651     NT_TIB *Self;
3652 }
3653 alias NT_TIB* PNT_TIB;
3654 
3655 struct REPARSE_DATA_BUFFER {
3656     DWORD  ReparseTag;
3657     WORD   ReparseDataLength;
3658     WORD   Reserved;
3659     union {
3660         struct _GenericReparseBuffer {
3661             BYTE  _DataBuffer;
3662 
3663             BYTE* DataBuffer() return { return &_DataBuffer; }
3664         }
3665         _GenericReparseBuffer GenericReparseBuffer;
3666         struct _SymbolicLinkReparseBuffer {
3667             WORD  SubstituteNameOffset;
3668             WORD  SubstituteNameLength;
3669             WORD  PrintNameOffset;
3670             WORD  PrintNameLength;
3671             // ??? This is in MinGW, but absent in MSDN docs
3672             ULONG Flags;
3673             WCHAR _PathBuffer = 0;
3674 
3675             WCHAR* PathBuffer() return { return &_PathBuffer; }
3676         }
3677         _SymbolicLinkReparseBuffer SymbolicLinkReparseBuffer;
3678         struct _MountPointReparseBuffer {
3679             WORD  SubstituteNameOffset;
3680             WORD  SubstituteNameLength;
3681             WORD  PrintNameOffset;
3682             WORD  PrintNameLength;
3683             WCHAR _PathBuffer = 0;
3684 
3685             WCHAR* PathBuffer() return { return &_PathBuffer; }
3686         }
3687         _MountPointReparseBuffer MountPointReparseBuffer;
3688     }
3689 }
3690 alias REPARSE_DATA_BUFFER *PREPARSE_DATA_BUFFER;
3691 
3692 struct REPARSE_GUID_DATA_BUFFER {
3693     DWORD    ReparseTag;
3694     WORD     ReparseDataLength;
3695     WORD     Reserved;
3696     GUID     ReparseGuid;
3697     struct _GenericReparseBuffer {
3698         BYTE _DataBuffer;
3699 
3700         BYTE* DataBuffer() return { return &_DataBuffer; }
3701     }
3702     _GenericReparseBuffer GenericReparseBuffer;
3703 }
3704 alias REPARSE_GUID_DATA_BUFFER* PREPARSE_GUID_DATA_BUFFER;
3705 
3706 enum size_t
3707     REPARSE_DATA_BUFFER_HEADER_SIZE = REPARSE_DATA_BUFFER.GenericReparseBuffer.offsetof,
3708     REPARSE_GUID_DATA_BUFFER_HEADER_SIZE = REPARSE_GUID_DATA_BUFFER.GenericReparseBuffer.offsetof,
3709     MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384;
3710 
3711 
3712 struct REPARSE_POINT_INFORMATION {
3713     WORD ReparseDataLength;
3714     WORD UnparsedNameLength;
3715 }
3716 alias REPARSE_POINT_INFORMATION* PREPARSE_POINT_INFORMATION;
3717 
3718 union FILE_SEGMENT_ELEMENT {
3719     PVOID64   Buffer;
3720     ULONGLONG Alignment;
3721 }
3722 alias FILE_SEGMENT_ELEMENT* PFILE_SEGMENT_ELEMENT;
3723 
3724 // JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags constants
3725 enum DWORD
3726     JOB_OBJECT_LIMIT_WORKINGSET                 = 0x0001,
3727     JOB_OBJECT_LIMIT_PROCESS_TIME               = 0x0002,
3728     JOB_OBJECT_LIMIT_JOB_TIME                   = 0x0004,
3729     JOB_OBJECT_LIMIT_ACTIVE_PROCESS             = 0x0008,
3730     JOB_OBJECT_LIMIT_AFFINITY                   = 0x0010,
3731     JOB_OBJECT_LIMIT_PRIORITY_CLASS             = 0x0020,
3732     JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME          = 0x0040,
3733     JOB_OBJECT_LIMIT_SCHEDULING_CLASS           = 0x0080,
3734     JOB_OBJECT_LIMIT_PROCESS_MEMORY             = 0x0100,
3735     JOB_OBJECT_LIMIT_JOB_MEMORY                 = 0x0200,
3736     JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x0400,
3737     JOB_OBJECT_BREAKAWAY_OK                     = 0x0800,
3738     JOB_OBJECT_SILENT_BREAKAWAY                 = 0x1000;
3739 
3740 // JOBOBJECT_BASIC_UI_RESTRICTIONS.UIRestrictionsClass constants
3741 enum DWORD
3742     JOB_OBJECT_UILIMIT_HANDLES          = 0x0001,
3743     JOB_OBJECT_UILIMIT_READCLIPBOARD    = 0x0002,
3744     JOB_OBJECT_UILIMIT_WRITECLIPBOARD   = 0x0004,
3745     JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x0008,
3746     JOB_OBJECT_UILIMIT_DISPLAYSETTINGS  = 0x0010,
3747     JOB_OBJECT_UILIMIT_GLOBALATOMS      = 0x0020,
3748     JOB_OBJECT_UILIMIT_DESKTOP          = 0x0040,
3749     JOB_OBJECT_UILIMIT_EXITWINDOWS      = 0x0080;
3750 
3751 // JOBOBJECT_SECURITY_LIMIT_INFORMATION.SecurityLimitFlags constants
3752 enum DWORD
3753     JOB_OBJECT_SECURITY_NO_ADMIN         = 0x0001,
3754     JOB_OBJECT_SECURITY_RESTRICTED_TOKEN = 0x0002,
3755     JOB_OBJECT_SECURITY_ONLY_TOKEN       = 0x0004,
3756     JOB_OBJECT_SECURITY_FILTER_TOKENS    = 0x0008;
3757 
3758 // JOBOBJECT_END_OF_JOB_TIME_INFORMATION.EndOfJobTimeAction constants
3759 enum : DWORD {
3760     JOB_OBJECT_TERMINATE_AT_END_OF_JOB,
3761     JOB_OBJECT_POST_AT_END_OF_JOB
3762 }
3763 
3764 enum : DWORD {
3765     JOB_OBJECT_MSG_END_OF_JOB_TIME = 1,
3766     JOB_OBJECT_MSG_END_OF_PROCESS_TIME,
3767     JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT,
3768     JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO,
3769     JOB_OBJECT_MSG_NEW_PROCESS,
3770     JOB_OBJECT_MSG_EXIT_PROCESS,
3771     JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS,
3772     JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT,
3773     JOB_OBJECT_MSG_JOB_MEMORY_LIMIT
3774 }
3775 
3776 enum JOBOBJECTINFOCLASS {
3777     JobObjectBasicAccountingInformation = 1,
3778     JobObjectBasicLimitInformation,
3779     JobObjectBasicProcessIdList,
3780     JobObjectBasicUIRestrictions,
3781     JobObjectSecurityLimitInformation,
3782     JobObjectEndOfJobTimeInformation,
3783     JobObjectAssociateCompletionPortInformation,
3784     JobObjectBasicAndIoAccountingInformation,
3785     JobObjectExtendedLimitInformation,
3786     JobObjectJobSetInformation,
3787     MaxJobObjectInfoClass
3788 }
3789 
3790 struct JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
3791     LARGE_INTEGER TotalUserTime;
3792     LARGE_INTEGER TotalKernelTime;
3793     LARGE_INTEGER ThisPeriodTotalUserTime;
3794     LARGE_INTEGER ThisPeriodTotalKernelTime;
3795     DWORD         TotalPageFaultCount;
3796     DWORD         TotalProcesses;
3797     DWORD         ActiveProcesses;
3798     DWORD         TotalTerminatedProcesses;
3799 }
3800 alias JOBOBJECT_BASIC_ACCOUNTING_INFORMATION* PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
3801 
3802 struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
3803     LARGE_INTEGER PerProcessUserTimeLimit;
3804     LARGE_INTEGER PerJobUserTimeLimit;
3805     DWORD         LimitFlags;
3806     SIZE_T        MinimumWorkingSetSize;
3807     SIZE_T        MaximumWorkingSetSize;
3808     DWORD         ActiveProcessLimit;
3809     ULONG_PTR     Affinity;
3810     DWORD         PriorityClass;
3811     DWORD         SchedulingClass;
3812 }
3813 alias JOBOBJECT_BASIC_LIMIT_INFORMATION* PJOBOBJECT_BASIC_LIMIT_INFORMATION;
3814 
3815 struct JOBOBJECT_BASIC_PROCESS_ID_LIST {
3816     DWORD     NumberOfAssignedProcesses;
3817     DWORD     NumberOfProcessIdsInList;
3818     ULONG_PTR _ProcessIdList;
3819 
3820     ULONG_PTR* ProcessIdList() return { return &_ProcessIdList; }
3821 }
3822 alias JOBOBJECT_BASIC_PROCESS_ID_LIST* PJOBOBJECT_BASIC_PROCESS_ID_LIST;
3823 
3824 struct JOBOBJECT_BASIC_UI_RESTRICTIONS {
3825     DWORD UIRestrictionsClass;
3826 }
3827 alias JOBOBJECT_BASIC_UI_RESTRICTIONS* PJOBOBJECT_BASIC_UI_RESTRICTIONS;
3828 
3829 struct JOBOBJECT_SECURITY_LIMIT_INFORMATION {
3830     DWORD             SecurityLimitFlags;
3831     HANDLE            JobToken;
3832     PTOKEN_GROUPS     SidsToDisable;
3833     PTOKEN_PRIVILEGES PrivilegesToDelete;
3834     PTOKEN_GROUPS     RestrictedSids;
3835 }
3836 alias JOBOBJECT_SECURITY_LIMIT_INFORMATION* PJOBOBJECT_SECURITY_LIMIT_INFORMATION;
3837 
3838 struct JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
3839     DWORD EndOfJobTimeAction;
3840 }
3841 alias JOBOBJECT_END_OF_JOB_TIME_INFORMATION* PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
3842 
3843 struct JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
3844     PVOID  CompletionKey;
3845     HANDLE CompletionPort;
3846 }
3847 alias JOBOBJECT_ASSOCIATE_COMPLETION_PORT* PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
3848 
3849 struct JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
3850     JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
3851     IO_COUNTERS IoInfo;
3852 }
3853 alias JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
3854 
3855 struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
3856     JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
3857     IO_COUNTERS IoInfo;
3858     SIZE_T      ProcessMemoryLimit;
3859     SIZE_T      JobMemoryLimit;
3860     SIZE_T      PeakProcessMemoryUsed;
3861     SIZE_T      PeakJobMemoryUsed;
3862 }
3863 alias JOBOBJECT_EXTENDED_LIMIT_INFORMATION* PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
3864 
3865 struct JOBOBJECT_JOBSET_INFORMATION {
3866     DWORD MemberLevel;
3867 }
3868 alias JOBOBJECT_JOBSET_INFORMATION* PJOBOBJECT_JOBSET_INFORMATION;
3869 
3870 // MinGW: Making these defines conditional on _WIN32_WINNT will break ddk includes
3871 //static if (_WIN32_WINNT >= 0x500) {
3872 
3873 enum DWORD
3874     ES_SYSTEM_REQUIRED  = 0x00000001,
3875     ES_DISPLAY_REQUIRED = 0x00000002,
3876     ES_USER_PRESENT     = 0x00000004,
3877     ES_AWAYMODE_REQUIRED = 0x00000040,
3878     ES_CONTINUOUS       = 0x80000000;
3879 
3880 enum LATENCY_TIME {
3881     LT_DONT_CARE,
3882     LT_LOWEST_LATENCY
3883 }
3884 alias LATENCY_TIME* PLATENCY_TIME;
3885 
3886 enum SYSTEM_POWER_STATE {
3887     PowerSystemUnspecified,
3888     PowerSystemWorking,
3889     PowerSystemSleeping1,
3890     PowerSystemSleeping2,
3891     PowerSystemSleeping3,
3892     PowerSystemHibernate,
3893     PowerSystemShutdown,
3894     PowerSystemMaximum
3895 }
3896 alias SYSTEM_POWER_STATE* PSYSTEM_POWER_STATE;
3897 
3898 enum POWER_SYSTEM_MAXIMUM = SYSTEM_POWER_STATE.PowerSystemMaximum;
3899 
3900 enum POWER_ACTION {
3901     PowerActionNone,
3902     PowerActionReserved,
3903     PowerActionSleep,
3904     PowerActionHibernate,
3905     PowerActionShutdown,
3906     PowerActionShutdownReset,
3907     PowerActionShutdownOff,
3908     PowerActionWarmEject
3909 }
3910 alias POWER_ACTION* PPOWER_ACTION;
3911 
3912 static if (_WIN32_WINNT >= 0x600) {
3913     enum SYSTEM_POWER_CONDITION {
3914         PoAc,
3915         PoDc,
3916         PoHot,
3917         PoConditionMaximum
3918     }
3919     alias SYSTEM_POWER_CONDITION* PSYSTEM_POWER_CONDITION;
3920 }
3921 
3922 enum DEVICE_POWER_STATE {
3923     PowerDeviceUnspecified,
3924     PowerDeviceD0,
3925     PowerDeviceD1,
3926     PowerDeviceD2,
3927     PowerDeviceD3,
3928     PowerDeviceMaximum
3929 }
3930 alias DEVICE_POWER_STATE* PDEVICE_POWER_STATE;
3931 
3932 align(4):
3933 struct BATTERY_REPORTING_SCALE {
3934     DWORD Granularity;
3935     DWORD Capacity;
3936 }
3937 alias BATTERY_REPORTING_SCALE* PBATTERY_REPORTING_SCALE;
3938 
3939 struct POWER_ACTION_POLICY {
3940     POWER_ACTION Action;
3941     ULONG        Flags;
3942     ULONG        EventCode;
3943 }
3944 alias POWER_ACTION_POLICY* PPOWER_ACTION_POLICY;
3945 
3946 // POWER_ACTION_POLICY.Flags constants
3947 enum ULONG
3948     POWER_ACTION_QUERY_ALLOWED  = 0x00000001,
3949     POWER_ACTION_UI_ALLOWED     = 0x00000002,
3950     POWER_ACTION_OVERRIDE_APPS  = 0x00000004,
3951     POWER_ACTION_LIGHTEST_FIRST = 0x10000000,
3952     POWER_ACTION_LOCK_CONSOLE   = 0x20000000,
3953     POWER_ACTION_DISABLE_WAKES  = 0x40000000,
3954     POWER_ACTION_CRITICAL       = 0x80000000;
3955 
3956 // POWER_ACTION_POLICY.EventCode constants
3957 enum ULONG
3958     POWER_LEVEL_USER_NOTIFY_TEXT  = 0x00000001,
3959     POWER_LEVEL_USER_NOTIFY_SOUND = 0x00000002,
3960     POWER_LEVEL_USER_NOTIFY_EXEC  = 0x00000004,
3961     POWER_USER_NOTIFY_BUTTON      = 0x00000008,
3962     POWER_USER_NOTIFY_SHUTDOWN    = 0x00000010,
3963     POWER_FORCE_TRIGGER_RESET     = 0x80000000;
3964 
3965 enum size_t
3966     DISCHARGE_POLICY_CRITICAL = 0,
3967     DISCHARGE_POLICY_LOW      = 1,
3968     NUM_DISCHARGE_POLICIES    = 4;
3969 
3970 enum : BYTE {
3971     PO_THROTTLE_NONE,
3972     PO_THROTTLE_CONSTANT,
3973     PO_THROTTLE_DEGRADE,
3974     PO_THROTTLE_ADAPTIVE,
3975     PO_THROTTLE_MAXIMUM
3976 }
3977 
3978 struct SYSTEM_POWER_LEVEL {
3979     BOOLEAN             Enable;
3980     UCHAR[3]            Spare;
3981     ULONG               BatteryLevel;
3982     POWER_ACTION_POLICY PowerPolicy;
3983     SYSTEM_POWER_STATE  MinSystemState;
3984 }
3985 alias SYSTEM_POWER_LEVEL* PSYSTEM_POWER_LEVEL;
3986 
3987 struct SYSTEM_POWER_POLICY {
3988     ULONG               Revision;
3989     POWER_ACTION_POLICY PowerButton;
3990     POWER_ACTION_POLICY SleepButton;
3991     POWER_ACTION_POLICY LidClose;
3992     SYSTEM_POWER_STATE  LidOpenWake;
3993     ULONG               Reserved;
3994     POWER_ACTION_POLICY Idle;
3995     ULONG               IdleTimeout;
3996     UCHAR               IdleSensitivity;
3997     UCHAR               DynamicThrottle;
3998     UCHAR[2]            Spare2;
3999     SYSTEM_POWER_STATE  MinSleep;
4000     SYSTEM_POWER_STATE  MaxSleep;
4001     SYSTEM_POWER_STATE  ReducedLatencySleep;
4002     ULONG               WinLogonFlags;
4003     ULONG               Spare3;
4004     ULONG               DozeS4Timeout;
4005     ULONG               BroadcastCapacityResolution;
4006     SYSTEM_POWER_LEVEL[NUM_DISCHARGE_POLICIES] DischargePolicy;
4007     ULONG               VideoTimeout;
4008     BOOLEAN             VideoDimDisplay;
4009     ULONG[3]            VideoReserved;
4010     ULONG               SpindownTimeout;
4011     BOOLEAN             OptimizeForPower;
4012     UCHAR               FanThrottleTolerance;
4013     UCHAR               ForcedThrottle;
4014     UCHAR               MinThrottle;
4015     POWER_ACTION_POLICY OverThrottled;
4016 }
4017 alias SYSTEM_POWER_POLICY* PSYSTEM_POWER_POLICY;
4018 
4019 struct SYSTEM_POWER_CAPABILITIES {
4020     BOOLEAN                    PowerButtonPresent;
4021     BOOLEAN                    SleepButtonPresent;
4022     BOOLEAN                    LidPresent;
4023     BOOLEAN                    SystemS1;
4024     BOOLEAN                    SystemS2;
4025     BOOLEAN                    SystemS3;
4026     BOOLEAN                    SystemS4;
4027     BOOLEAN                    SystemS5;
4028     BOOLEAN                    HiberFilePresent;
4029     BOOLEAN                    FullWake;
4030     BOOLEAN                    VideoDimPresent;
4031     BOOLEAN                    ApmPresent;
4032     BOOLEAN                    UpsPresent;
4033     BOOLEAN                    ThermalControl;
4034     BOOLEAN                    ProcessorThrottle;
4035     UCHAR                      ProcessorMinThrottle;
4036     UCHAR                      ProcessorMaxThrottle;
4037     UCHAR[4]                   spare2;
4038     BOOLEAN                    DiskSpinDown;
4039     UCHAR[8]                   spare3;
4040     BOOLEAN                    SystemBatteriesPresent;
4041     BOOLEAN                    BatteriesAreShortTerm;
4042     BATTERY_REPORTING_SCALE[3] BatteryScale;
4043     SYSTEM_POWER_STATE         AcOnLineWake;
4044     SYSTEM_POWER_STATE         SoftLidWake;
4045     SYSTEM_POWER_STATE         RtcWake;
4046     SYSTEM_POWER_STATE         MinDeviceWakeState;
4047     SYSTEM_POWER_STATE         DefaultLowLatencyWake;
4048 }
4049 alias SYSTEM_POWER_CAPABILITIES* PSYSTEM_POWER_CAPABILITIES;
4050 
4051 struct SYSTEM_BATTERY_STATE {
4052     BOOLEAN    AcOnLine;
4053     BOOLEAN    BatteryPresent;
4054     BOOLEAN    Charging;
4055     BOOLEAN    Discharging;
4056     BOOLEAN[4] Spare1;
4057     ULONG      MaxCapacity;
4058     ULONG      RemainingCapacity;
4059     ULONG      Rate;
4060     ULONG      EstimatedTime;
4061     ULONG      DefaultAlert1;
4062     ULONG      DefaultAlert2;
4063 }
4064 alias SYSTEM_BATTERY_STATE* PSYSTEM_BATTERY_STATE;
4065 
4066 enum POWER_INFORMATION_LEVEL {
4067     SystemPowerPolicyAc,
4068     SystemPowerPolicyDc,
4069     VerifySystemPolicyAc,
4070     VerifySystemPolicyDc,
4071     SystemPowerCapabilities,
4072     SystemBatteryState,
4073     SystemPowerStateHandler,
4074     ProcessorStateHandler,
4075     SystemPowerPolicyCurrent,
4076     AdministratorPowerPolicy,
4077     SystemReserveHiberFile,
4078     ProcessorInformation,
4079     SystemPowerInformation,
4080     ProcessorStateHandler2,
4081     LastWakeTime,
4082     LastSleepTime,
4083     SystemExecutionState,
4084     SystemPowerStateNotifyHandler,
4085     ProcessorPowerPolicyAc,
4086     ProcessorPowerPolicyDc,
4087     VerifyProcessorPowerPolicyAc,
4088     VerifyProcessorPowerPolicyDc,
4089     ProcessorPowerPolicyCurrent
4090 }
4091 
4092 //#if 1 /* (WIN32_WINNT >= 0x0500) */
4093 struct SYSTEM_POWER_INFORMATION {
4094     ULONG MaxIdlenessAllowed;
4095     ULONG Idleness;
4096     ULONG TimeRemaining;
4097     UCHAR CoolingMode;
4098 }
4099 alias SYSTEM_POWER_INFORMATION* PSYSTEM_POWER_INFORMATION;
4100 //#endif
4101 
4102 struct PROCESSOR_POWER_POLICY_INFO {
4103     ULONG    TimeCheck;
4104     ULONG    DemoteLimit;
4105     ULONG    PromoteLimit;
4106     UCHAR    DemotePercent;
4107     UCHAR    PromotePercent;
4108     UCHAR[2] Spare;
4109     uint     _bf;
4110 
4111     bool AllowDemotion()  { return cast(bool)(_bf & 1); }
4112     bool AllowPromotion() { return cast(bool)(_bf & 2); }
4113 
4114     bool AllowDemotion(bool a)  { _bf = (_bf & ~1) | a; return a; }
4115     bool AllowPromotion(bool a) { _bf = (_bf & ~2) | (a << 1); return a; }
4116 /+
4117     ULONG  AllowDemotion : 1;
4118     ULONG  AllowPromotion : 1;
4119     ULONG  Reserved : 30;
4120 +/
4121 }
4122 alias PROCESSOR_POWER_POLICY_INFO* PPROCESSOR_POWER_POLICY_INFO;
4123 
4124 struct PROCESSOR_POWER_POLICY {
4125     ULONG    Revision;
4126     UCHAR    DynamicThrottle;
4127     UCHAR[3] Spare;
4128     ULONG    Reserved;
4129     ULONG    PolicyCount;
4130     PROCESSOR_POWER_POLICY_INFO[3] Policy;
4131 }
4132 alias PROCESSOR_POWER_POLICY* PPROCESSOR_POWER_POLICY;
4133 
4134 struct ADMINISTRATOR_POWER_POLICY {
4135     SYSTEM_POWER_STATE MinSleep;
4136     SYSTEM_POWER_STATE MaxSleep;
4137     ULONG              MinVideoTimeout;
4138     ULONG              MaxVideoTimeout;
4139     ULONG              MinSpindownTimeout;
4140     ULONG              MaxSpindownTimeout;
4141 }
4142 alias ADMINISTRATOR_POWER_POLICY* PADMINISTRATOR_POWER_POLICY;
4143 
4144 //}//#endif /* _WIN32_WINNT >= 0x500 */
4145 
4146 extern (Windows) {
4147     alias void function(PVOID, DWORD, PVOID) PIMAGE_TLS_CALLBACK;
4148 
4149     static if (_WIN32_WINNT >= 0x500) {
4150         alias LONG function(PEXCEPTION_POINTERS) PVECTORED_EXCEPTION_HANDLER;
4151         alias void function(PVOID, BOOLEAN) WAITORTIMERCALLBACKFUNC;
4152     }
4153 }
4154 
4155 static if (_WIN32_WINNT >= 0x501) {
4156     enum HEAP_INFORMATION_CLASS {
4157         HeapCompatibilityInformation
4158     }
4159 
4160     enum ACTIVATION_CONTEXT_INFO_CLASS {
4161         ActivationContextBasicInformation = 1,
4162         ActivationContextDetailedInformation,
4163         AssemblyDetailedInformationInActivationContext,
4164         FileInformationInAssemblyOfAssemblyInActivationContext
4165     }
4166 
4167     align struct ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
4168         DWORD         ulFlags;
4169         DWORD         ulEncodedAssemblyIdentityLength;
4170         DWORD         ulManifestPathType;
4171         DWORD         ulManifestPathLength;
4172         LARGE_INTEGER liManifestLastWriteTime;
4173         DWORD         ulPolicyPathType;
4174         DWORD         ulPolicyPathLength;
4175         LARGE_INTEGER liPolicyLastWriteTime;
4176         DWORD         ulMetadataSatelliteRosterIndex;
4177         DWORD         ulManifestVersionMajor;
4178         DWORD         ulManifestVersionMinor;
4179         DWORD         ulPolicyVersionMajor;
4180         DWORD         ulPolicyVersionMinor;
4181         DWORD         ulAssemblyDirectoryNameLength;
4182         PCWSTR        lpAssemblyEncodedAssemblyIdentity;
4183         PCWSTR        lpAssemblyManifestPath;
4184         PCWSTR        lpAssemblyPolicyPath;
4185         PCWSTR        lpAssemblyDirectoryName;
4186     }
4187     alias ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION*
4188       PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
4189     alias const(ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION)*
4190       PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
4191 
4192     struct ACTIVATION_CONTEXT_DETAILED_INFORMATION {
4193         DWORD  dwFlags;
4194         DWORD  ulFormatVersion;
4195         DWORD  ulAssemblyCount;
4196         DWORD  ulRootManifestPathType;
4197         DWORD  ulRootManifestPathChars;
4198         DWORD  ulRootConfigurationPathType;
4199         DWORD  ulRootConfigurationPathChars;
4200         DWORD  ulAppDirPathType;
4201         DWORD  ulAppDirPathChars;
4202         PCWSTR lpRootManifestPath;
4203         PCWSTR lpRootConfigurationPath;
4204         PCWSTR lpAppDirPath;
4205     }
4206     alias ACTIVATION_CONTEXT_DETAILED_INFORMATION*
4207       PACTIVATION_CONTEXT_DETAILED_INFORMATION;
4208     alias const(ACTIVATION_CONTEXT_DETAILED_INFORMATION)*
4209       PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
4210 
4211     struct ACTIVATION_CONTEXT_QUERY_INDEX {
4212         ULONG ulAssemblyIndex;
4213         ULONG ulFileIndexInAssembly;
4214     }
4215     alias ACTIVATION_CONTEXT_QUERY_INDEX*        PACTIVATION_CONTEXT_QUERY_INDEX;
4216     alias const(ACTIVATION_CONTEXT_QUERY_INDEX)* PCACTIVATION_CONTEXT_QUERY_INDEX;
4217 
4218     struct ASSEMBLY_FILE_DETAILED_INFORMATION {
4219         DWORD  ulFlags;
4220         DWORD  ulFilenameLength;
4221         DWORD  ulPathLength;
4222         PCWSTR lpFileName;
4223         PCWSTR lpFilePath;
4224     }
4225     alias ASSEMBLY_FILE_DETAILED_INFORMATION*
4226       PASSEMBLY_FILE_DETAILED_INFORMATION;
4227     alias const(ASSEMBLY_FILE_DETAILED_INFORMATION)*
4228       PCASSEMBLY_FILE_DETAILED_INFORMATION;
4229 }
4230 
4231 version (Unicode) {
4232     alias OSVERSIONINFOW OSVERSIONINFO;
4233     alias OSVERSIONINFOEXW OSVERSIONINFOEX;
4234 } else {
4235     alias OSVERSIONINFOA OSVERSIONINFO;
4236     alias OSVERSIONINFOEXA OSVERSIONINFOEX;
4237 }
4238 
4239 alias OSVERSIONINFO*   POSVERSIONINFO,   LPOSVERSIONINFO;
4240 alias OSVERSIONINFOEX* POSVERSIONINFOEX, LPOSVERSIONINFOEX;
4241 
4242 
4243 static if (_WIN32_WINNT >= 0x500) {
4244     extern (Windows) ULONGLONG VerSetConditionMask(ULONGLONG, DWORD, BYTE);
4245 }
4246 
4247 version (Win64) {
4248 enum WORD IMAGE_NT_OPTIONAL_HDR_MAGIC = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
4249 
4250     alias IMAGE_ORDINAL_FLAG64 IMAGE_ORDINAL_FLAG;
4251     alias IMAGE_SNAP_BY_ORDINAL64 IMAGE_SNAP_BY_ORDINAL;
4252     alias IMAGE_ORDINAL64 IMAGE_ORDINAL;
4253     alias IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
4254     alias IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
4255     alias IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA;
4256     alias IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY;
4257 } else {
4258 enum WORD IMAGE_NT_OPTIONAL_HDR_MAGIC = IMAGE_NT_OPTIONAL_HDR32_MAGIC;
4259 
4260     alias IMAGE_ORDINAL_FLAG32 IMAGE_ORDINAL_FLAG;
4261     alias IMAGE_ORDINAL32 IMAGE_ORDINAL;
4262     alias IMAGE_SNAP_BY_ORDINAL32 IMAGE_SNAP_BY_ORDINAL;
4263     alias IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
4264     alias IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
4265     alias IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;
4266     alias IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY;
4267 }
4268 
4269 alias IMAGE_OPTIONAL_HEADER* PIMAGE_OPTIONAL_HEADER;
4270 alias IMAGE_NT_HEADERS* PIMAGE_NT_HEADERS;
4271 alias IMAGE_THUNK_DATA* PIMAGE_THUNK_DATA;
4272 alias IMAGE_TLS_DIRECTORY* PIMAGE_TLS_DIRECTORY;
4273 
4274 // TODO: MinGW implements these in assembly.  How to translate?
4275 PVOID GetCurrentFiber();
4276 PVOID GetFiberData();
4277