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