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