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