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