/*
 * winnt.h
 *
 * Win32-API macros and definitions originating from the WinNT product line.
 *
 * $Id: winnt.h,v 1cfc31eadb8c 2019/06/07 20:53:34 keith $
 *
 * Written by Anders Norlander <anorland@hem2.passagen.se>
 * Copyright (C) 1998-2011, 2016, 2017, 2019, MinGW.org Project
 *
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 */
#ifndef _WINNT_H
#pragma GCC system_header

/* For effective self-containment, <winnt.h> requires <windef.h> to have
 * been included, BEFORE defining the _WINNT_H repeat inclusion guard...
 */
#include <windef.h>
/* ...but this has the unfortunate side effect that <windef.h> may then
 * recursively include <winnt.h>; retest the inclusion guard, to break
 * out of any ensuing recursive inclusion loop.
 */
#ifndef _WINNT_H
#define _WINNT_H

#include <winerror.h>

#ifndef RC_INVOKED
#include <string.h>

_BEGIN_C_DECLS

/* FIXME: add more architectures. Is there a way to specify this in GCC? */
#ifdef _X86_
#define UNALIGNED
#else
#define UNALIGNED
#endif

#ifndef DECLSPEC_ALIGN
#ifdef __GNUC__
#define DECLSPEC_ALIGN(x)   __attribute__((__aligned__(x)))
#else
#define DECLSPEC_ALIGN(x)
#endif
#endif

#ifndef DECLSPEC_SELECTANY
#if (__GNUC__ >= 4)
#define DECLSPEC_SELECTANY  __attribute__((__selectany__))
#else
#define DECLSPEC_SELECTANY
#endif
#endif

#ifndef FORCEINLINE
#if (__GNUC__ >= 3)
#define FORCEINLINE	    __inline__ __attribute__((__always_inline__))
#else
#define FORCEINLINE	    __inline__
#endif
#endif

#ifndef C_ASSERT
#define C_ASSERT(expr)  typedef char __C_ASSERT__[(expr)?1:-1]
#endif

#ifndef VOID
#define VOID		void
#endif
typedef char		CHAR;
typedef short		SHORT;
typedef long		LONG;
typedef char		CCHAR,  *PCCHAR;
typedef unsigned char   UCHAR,  *PUCHAR;
typedef unsigned short	USHORT, *PUSHORT;
typedef unsigned long	ULONG,  *PULONG;
typedef char		*PSZ;

typedef void		*PVOID, *LPVOID;

/* FIXME for __WIN64 */
#ifndef __ptr64
#define __ptr64
#endif
typedef void		*__ptr64 PVOID64;

#ifndef _WCHAR_T_DEFINED
#define _WCHAR_T_DEFINED
#ifndef _WCHAR_T_
#define _WCHAR_T_
#undef __need_wchar_t
#ifndef __cplusplus
typedef unsigned short wchar_t;
#endif
#endif
#endif

typedef wchar_t WCHAR;
typedef WCHAR *PWCHAR, *LPWCH, *PWCH, *NWPSTR, *LPWSTR, *PWSTR;
typedef CONST WCHAR *LPCWCH, *PCWCH, *LPCWSTR, *PCWSTR;
typedef CHAR *PCHAR, *LPCH, *PCH, *NPSTR, *LPSTR, *PSTR;
typedef CONST CHAR *LPCCH, *PCSTR, *LPCSTR;
#ifndef _TCHAR_DEFINED
#define _TCHAR_DEFINED
#ifdef UNICODE
/*
 * NOTE: This tests UNICODE, which is different from the _UNICODE define
 *       used to differentiate standard C runtime calls.
 */
typedef WCHAR TCHAR;
typedef WCHAR _TCHAR;
#else
typedef CHAR TCHAR;
typedef CHAR _TCHAR;
#endif
#endif
typedef TCHAR TBYTE, *PTCH, *PTBYTE;
typedef TCHAR *LPTCH, *PTSTR, *LPTSTR, *LP, *PTCHAR;
typedef const TCHAR *LPCTSTR;
#ifdef UNICODE
/*
 * __TEXT is a private macro whose specific use is to force the expansion of a
 * macro passed as an argument to the macro TEXT.  DO NOT use this
 * macro within your programs.  It's name and function could change without
 * notice.
 */
#define __TEXT(q) L##q
#else
#define __TEXT(q) q
#endif
/*
 * UNICODE a constant string when UNICODE is defined, else returns the string
 * unmodified.
 * The corresponding macros  _TEXT() and _T() for mapping _UNICODE strings
 * passed to C runtime functions are defined in mingw/tchar.h
 */
#define TEXT(q) 	 __TEXT(q)
typedef SHORT *PSHORT;
typedef LONG *PLONG;
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(n)  typedef struct n##__{int i;}*n
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(n)  typedef HANDLE n
#endif
typedef HANDLE *PHANDLE, *LPHANDLE;
typedef DWORD LCID;
typedef PDWORD PLCID;
typedef WORD LANGID;
#ifdef __GNUC__
#define _HAVE_INT64
#define _INTEGRAL_MAX_BITS  64
#undef __int64
#define __int64 long long
#elif defined(__WATCOMC__) && (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)
#define _HAVE_INT64
#endif /* __GNUC__/__WATCOMC */
#if defined(_HAVE_INT64) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)
typedef __int64 LONGLONG;
typedef unsigned __int64 DWORDLONG;
#else
typedef double LONGLONG, DWORDLONG;
#endif
typedef LONGLONG *PLONGLONG;
typedef DWORDLONG *PDWORDLONG;
typedef DWORDLONG ULONGLONG, *PULONGLONG;
typedef LONGLONG USN;
#ifdef _HAVE_INT64
#define Int32x32To64(a,b)		((LONGLONG)(a)*(LONGLONG)(b))
#define UInt32x32To64(a,b)		((DWORDLONG)(a)*(DWORDLONG)(b))
#define Int64ShllMod32(a,b)		((DWORDLONG)(a)<<(b))
#define Int64ShraMod32(a,b)		((LONGLONG)(a)>>(b))
#define Int64ShrlMod32(a,b)		((DWORDLONG)(a)>>(b))
#endif
#define ANSI_NULL				   '\0'
#define UNICODE_NULL				  L'\0'
typedef BYTE BOOLEAN, *PBOOLEAN;

_END_C_DECLS

#endif	/* ! RC_INVOKED */

typedef BYTE FCHAR;
typedef WORD FSHORT;
typedef DWORD FLONG;

#define NTAPI  __stdcall
#include <basetsd.h>
#define ACE_OBJECT_TYPE_PRESENT 		0x00000001
#define ACE_INHERITED_OBJECT_TYPE_PRESENT	0x00000002
#define APPLICATION_ERROR_MASK			0x20000000
#define ERROR_SEVERITY_SUCCESS			0x00000000
#define ERROR_SEVERITY_INFORMATIONAL		0x40000000
#define ERROR_SEVERITY_WARNING			0x80000000
#define ERROR_SEVERITY_ERROR			0xC0000000
/* also in ddk/ntifs.h */
#define COMPRESSION_FORMAT_NONE 		   (0x0000)
#define COMPRESSION_FORMAT_DEFAULT		   (0x0001)
#define COMPRESSION_FORMAT_LZNT1		   (0x0002)
#define COMPRESSION_ENGINE_STANDARD		   (0x0000)
#define COMPRESSION_ENGINE_MAXIMUM		   (0x0100)
#define COMPRESSION_ENGINE_HIBER		   (0x0200)
#define ACCESS_ALLOWED_ACE_TYPE 		      (0x0)
#define ACCESS_DENIED_ACE_TYPE			      (0x1)
#define SYSTEM_AUDIT_ACE_TYPE			      (0x2)
#define SYSTEM_ALARM_ACE_TYPE			      (0x3)
/*end ntifs.h */
#define ANYSIZE_ARRAY					 1
#define OBJECT_INHERIT_ACE				 1
#define CONTAINER_INHERIT_ACE				 2
#define NO_PROPAGATE_INHERIT_ACE			 4
#define INHERIT_ONLY_ACE				 8
#define INHERITED_ACE					16

#define VALID_INHERIT_FLAGS  \
    OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE | \
    INHERIT_ONLY_ACE   | INHERITED_ACE

#define SUCCESSFUL_ACCESS_ACE_FLAG			64
#define FAILED_ACCESS_ACE_FLAG			       128
#define DELETE					0x00010000L
#define READ_CONTROL				   0x20000L
#define WRITE_DAC				   0x40000L
#define WRITE_OWNER				   0x80000L
#define SYNCHRONIZE				  0x100000L
#define STANDARD_RIGHTS_REQUIRED		   0xF0000
#define STANDARD_RIGHTS_READ			   0x20000
#define STANDARD_RIGHTS_WRITE			   0x20000
#define STANDARD_RIGHTS_EXECUTE 		   0x20000
#define STANDARD_RIGHTS_ALL			  0x1F0000
#define SPECIFIC_RIGHTS_ALL			    0xFFFF
#define ACCESS_SYSTEM_SECURITY			 0x1000000

#define MAXIMUM_ALLOWED 			 0x2000000
#define GENERIC_READ				0x80000000
#define GENERIC_WRITE				0x40000000
#define GENERIC_EXECUTE 			0x20000000
#define GENERIC_ALL				0x10000000

#define INVALID_FILE_ATTRIBUTES 		((DWORD)-1)

/* Also in ddk/winddk.h */
#define FILE_LIST_DIRECTORY			0x00000001
#define FILE_READ_DATA				0x00000001
#define FILE_ADD_FILE				0x00000002
#define FILE_WRITE_DATA 			0x00000002
#define FILE_ADD_SUBDIRECTORY			0x00000004
#define FILE_APPEND_DATA			0x00000004
#define FILE_CREATE_PIPE_INSTANCE		0x00000004
#define FILE_READ_EA				0x00000008
#define FILE_READ_PROPERTIES			0x00000008
#define FILE_WRITE_EA				0x00000010
#define FILE_WRITE_PROPERTIES			0x00000010
#define FILE_EXECUTE				0x00000020
#define FILE_TRAVERSE				0x00000020
#define FILE_DELETE_CHILD			0x00000040
#define FILE_READ_ATTRIBUTES			0x00000080
#define FILE_WRITE_ATTRIBUTES			0x00000100

#define FILE_SHARE_READ 			0x00000001
#define FILE_SHARE_WRITE			0x00000002
#define FILE_SHARE_DELETE			0x00000004
#define FILE_SHARE_VALID_FLAGS			0x00000007

#define FILE_ATTRIBUTE_READONLY 		0x00000001
#define FILE_ATTRIBUTE_HIDDEN			0x00000002
#define FILE_ATTRIBUTE_SYSTEM			0x00000004
#define FILE_ATTRIBUTE_DIRECTORY		0x00000010
#define FILE_ATTRIBUTE_ARCHIVE			0x00000020
#define FILE_ATTRIBUTE_DEVICE			0x00000040
#define FILE_ATTRIBUTE_NORMAL			0x00000080
#define FILE_ATTRIBUTE_TEMPORARY		0x00000100
#define FILE_ATTRIBUTE_SPARSE_FILE		0x00000200
#define FILE_ATTRIBUTE_REPARSE_POINT		0x00000400
#define FILE_ATTRIBUTE_COMPRESSED		0x00000800
#define FILE_ATTRIBUTE_OFFLINE			0x00001000
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED	0x00002000
#define FILE_ATTRIBUTE_ENCRYPTED		0x00004000
#define FILE_ATTRIBUTE_VIRTUAL			0x00010000
#define FILE_ATTRIBUTE_VALID_FLAGS		0x00017fb7
#define FILE_ATTRIBUTE_VALID_SET_FLAGS		0x000031a7

#define FILE_COPY_STRUCTURED_STORAGE		0x00000041
#define FILE_STRUCTURED_STORAGE 		0x00000441

#define FILE_VALID_OPTION_FLAGS 		0x00ffffff
#define FILE_VALID_PIPE_OPTION_FLAGS		0x00000032
#define FILE_VALID_MAILSLOT_OPTION_FLAGS	0x00000032
#define FILE_VALID_SET_FLAGS			0x00000036

#define FILE_SUPERSEDE				0x00000000
#define FILE_OPEN				0x00000001
#define FILE_CREATE				0x00000002
#define FILE_OPEN_IF				0x00000003
#define FILE_OVERWRITE				0x00000004
#define FILE_OVERWRITE_IF			0x00000005
#define FILE_MAXIMUM_DISPOSITION		0x00000005

#define FILE_DIRECTORY_FILE			0x00000001
#define FILE_WRITE_THROUGH			0x00000002
#define FILE_SEQUENTIAL_ONLY			0x00000004
#define FILE_NO_INTERMEDIATE_BUFFERING		0x00000008
#define FILE_SYNCHRONOUS_IO_ALERT		0x00000010
#define FILE_SYNCHRONOUS_IO_NONALERT		0x00000020
#define FILE_NON_DIRECTORY_FILE 		0x00000040
#define FILE_CREATE_TREE_CONNECTION		0x00000080
#define FILE_COMPLETE_IF_OPLOCKED		0x00000100
#define FILE_NO_EA_KNOWLEDGE			0x00000200
#define FILE_OPEN_FOR_RECOVERY			0x00000400
#define FILE_RANDOM_ACCESS			0x00000800
#define FILE_DELETE_ON_CLOSE			0x00001000
#define FILE_OPEN_BY_FILE_ID			0x00002000
#define FILE_OPEN_FOR_BACKUP_INTENT		0x00004000
#define FILE_NO_COMPRESSION			0x00008000
#define FILE_RESERVE_OPFILTER			0x00100000
#define FILE_OPEN_REPARSE_POINT 		0x00200000
#define FILE_OPEN_NO_RECALL			0x00400000
#define FILE_OPEN_FOR_FREE_SPACE_QUERY		0x00800000

#define FILE_ALL_ACCESS     ( STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF )

#define FILE_GENERIC_EXECUTE	\
  ( STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE \
  )
#define FILE_GENERIC_READ   \
  ( STANDARD_RIGHTS_READ    | FILE_READ_DATA       | FILE_READ_ATTRIBUTES  | \
    FILE_READ_EA	    | SYNCHRONIZE	   \
  )
#define FILE_GENERIC_WRITE  \
  ( STANDARD_RIGHTS_WRITE   | FILE_WRITE_DATA      | FILE_WRITE_ATTRIBUTES | \
    FILE_WRITE_EA	    | FILE_APPEND_DATA	   | SYNCHRONIZE	   \
  )
/* end winddk.h */
/* also in ddk/ntifs.h */
#define FILE_NOTIFY_CHANGE_FILE_NAME		0x00000001
#define FILE_NOTIFY_CHANGE_DIR_NAME		0x00000002
#define FILE_NOTIFY_CHANGE_NAME 		0x00000003
#define FILE_NOTIFY_CHANGE_ATTRIBUTES		0x00000004
#define FILE_NOTIFY_CHANGE_SIZE 		0x00000008
#define FILE_NOTIFY_CHANGE_LAST_WRITE		0x00000010
#define FILE_NOTIFY_CHANGE_LAST_ACCESS		0x00000020
#define FILE_NOTIFY_CHANGE_CREATION		0x00000040
#define FILE_NOTIFY_CHANGE_EA			0x00000080
#define FILE_NOTIFY_CHANGE_SECURITY		0x00000100
#define FILE_NOTIFY_CHANGE_STREAM_NAME		0x00000200
#define FILE_NOTIFY_CHANGE_STREAM_SIZE		0x00000400
#define FILE_NOTIFY_CHANGE_STREAM_WRITE 	0x00000800
#define FILE_NOTIFY_VALID_MASK			0x00000fff

#define FILE_CASE_SENSITIVE_SEARCH		0x00000001
#define FILE_CASE_PRESERVED_NAMES		0x00000002
#define FILE_UNICODE_ON_DISK			0x00000004
#define FILE_PERSISTENT_ACLS			0x00000008
#define FILE_FILE_COMPRESSION			0x00000010
#define FILE_VOLUME_QUOTAS			0x00000020
#define FILE_SUPPORTS_SPARSE_FILES		0x00000040
#define FILE_SUPPORTS_REPARSE_POINTS		0x00000080
#define FILE_SUPPORTS_REMOTE_STORAGE		0x00000100
#define FS_LFN_APIS				0x00004000
#define FILE_VOLUME_IS_COMPRESSED		0x00008000
#define FILE_SUPPORTS_OBJECT_IDS		0x00010000
#define FILE_SUPPORTS_ENCRYPTION		0x00020000
#define FILE_NAMED_STREAMS			0x00040000
#define FILE_READ_ONLY_VOLUME			0x00080000
#define FILE_SEQUENTIAL_WRITE_ONCE		0x00100000
#define FILE_SUPPORTS_TRANSACTIONS		0x00200000
/* Note: These flags only have a meaning starting with Windows 7/2008 R2.
   Their absence on older OSes does NOT mean that a filesystem is missing
   that property. */
#define FILE_SUPPORTS_HARD_LINKS		0x00400000
#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES	0x00800000
#define FILE_SUPPORTS_OPEN_BY_FILE_ID		0x01000000
#define FILE_SUPPORTS_USN_JOURNAL		0x02000000


#define IO_COMPLETION_QUERY_STATE		    0x0001
#define IO_COMPLETION_MODIFY_STATE		    0x0002
#define IO_COMPLETION_ALL_ACCESS	(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
/* end ntifs.h */

/* also in ddk/winddk.h */
#define DUPLICATE_CLOSE_SOURCE			0x00000001
#define DUPLICATE_SAME_ACCESS			0x00000002
#define DUPLICATE_SAME_ATTRIBUTES		0x00000004
/* end winddk.k */

#define MAILSLOT_NO_MESSAGE			((DWORD)-1)
#define MAILSLOT_WAIT_FOREVER			((DWORD)-1)
#define PROCESS_TERMINATE				 1
#define PROCESS_CREATE_THREAD				 2
#define PROCESS_SET_SESSIONID				 4
#define PROCESS_VM_OPERATION				 8
#define PROCESS_VM_READ 				16
#define PROCESS_VM_WRITE				32
#define PROCESS_DUP_HANDLE				64
#define PROCESS_CREATE_PROCESS			       128
#define PROCESS_SET_QUOTA			       256
#define PROCESS_SUSPEND_RESUME			    0x0800
#define PROCESS_SET_INFORMATION 		       512
#define PROCESS_QUERY_INFORMATION		      1024
#define PROCESS_QUERY_LIMITED_INFORMATION	    0x1000

#define PROCESS_ALL_ACCESS		(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xFFF)
#define THREAD_TERMINATE				 1
#define THREAD_SUSPEND_RESUME				 2
#define THREAD_GET_CONTEXT				 8
#define THREAD_SET_CONTEXT				16
#define THREAD_SET_INFORMATION				32
#define THREAD_QUERY_INFORMATION			64
#define THREAD_SET_THREAD_TOKEN 		       128
#define THREAD_IMPERSONATE			       256
#define THREAD_DIRECT_IMPERSONATION		     0x200
#define THREAD_ALL_ACCESS		(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3FF)
#define THREAD_BASE_PRIORITY_LOWRT			15
#define THREAD_BASE_PRIORITY_MAX			 2
#define THREAD_BASE_PRIORITY_MIN		       (-2)
#define THREAD_BASE_PRIORITY_IDLE		      (-15)
#define EXCEPTION_NONCONTINUABLE			 1
#define EXCEPTION_MAXIMUM_PARAMETERS			15
#define MUTANT_QUERY_STATE			    0x0001
#define MUTANT_ALL_ACCESS		(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|MUTANT_QUERY_STATE)
#define TIMER_QUERY_STATE			    0x0001
#define TIMER_MODIFY_STATE			    0x0002
#define TIMER_ALL_ACCESS		(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|TIMER_QUERY_STATE|TIMER_MODIFY_STATE)
/*
 * To prevent gcc compiler warnings, bracket these defines when initialising
 * a  SID_IDENTIFIER_AUTHORITY, eg.
 * SID_IDENTIFIER_AUTHORITY aNullSidAuthority = {SECURITY_NULL_SID_AUTHORITY};
 */
#define SECURITY_NULL_SID_AUTHORITY		{0,0,0,0,0,0}
#define SECURITY_WORLD_SID_AUTHORITY		{0,0,0,0,0,1}
#define SECURITY_LOCAL_SID_AUTHORITY		{0,0,0,0,0,2}
#define SECURITY_CREATOR_SID_AUTHORITY		{0,0,0,0,0,3}
#define SECURITY_NON_UNIQUE_AUTHORITY		{0,0,0,0,0,4}
#define SECURITY_NT_AUTHORITY			{0,0,0,0,0,5}
#define SECURITY_MANDATORY_LABEL_AUTHORITY	{0,0,0,0,0,16}
#define SECURITY_NULL_RID				 0
#define SECURITY_WORLD_RID			(0x00000000L)
#define SECURITY_LOCAL_RID				 0
#define SECURITY_CREATOR_OWNER_RID			 0
#define SECURITY_CREATOR_GROUP_RID			 1
#define SECURITY_DIALUP_RID				 1
#define SECURITY_NETWORK_RID				 2
#define SECURITY_BATCH_RID				 3
#define SECURITY_INTERACTIVE_RID			 4
#define SECURITY_LOGON_IDS_RID				 5
#define SECURITY_SERVICE_RID				 6
#define SECURITY_LOCAL_SYSTEM_RID			18
#define SECURITY_BUILTIN_DOMAIN_RID			32
#define SECURITY_PRINCIPAL_SELF_RID			10
#define SECURITY_CREATOR_OWNER_SERVER_RID	       0x2
#define SECURITY_CREATOR_GROUP_SERVER_RID	       0x3
#define SECURITY_LOGON_IDS_RID_COUNT		       0x3
#define SECURITY_ANONYMOUS_LOGON_RID		       0x7
#define SECURITY_PROXY_RID			       0x8
#define SECURITY_ENTERPRISE_CONTROLLERS_RID	       0x9
#define SECURITY_SERVER_LOGON_RID		SECURITY_ENTERPRISE_CONTROLLERS_RID
#define SECURITY_AUTHENTICATED_USER_RID 	       0xB
#define SECURITY_RESTRICTED_CODE_RID		       0xC
#define SECURITY_NT_NON_UNIQUE_RID		      0x15
#define SID_REVISION					 1
#if (_WIN32_WINNT >= 0x0600)
#define SID_HASH_SIZE					32
#endif
#define DOMAIN_USER_RID_ADMIN			     0x1F4L
#define DOMAIN_USER_RID_GUEST			     0x1F5L
#define DOMAIN_GROUP_RID_ADMINS 		     0x200L
#define DOMAIN_GROUP_RID_USERS			     0x201L
#define DOMAIN_ALIAS_RID_ADMINS 		     0x220L
#define DOMAIN_ALIAS_RID_USERS			     0x221L
#define DOMAIN_ALIAS_RID_GUESTS 		     0x222L
#define DOMAIN_ALIAS_RID_POWER_USERS		     0x223L
#define DOMAIN_ALIAS_RID_ACCOUNT_OPS		     0x224L
#define DOMAIN_ALIAS_RID_SYSTEM_OPS		     0x225L
#define DOMAIN_ALIAS_RID_PRINT_OPS		     0x226L
#define DOMAIN_ALIAS_RID_BACKUP_OPS		     0x227L
#define DOMAIN_ALIAS_RID_REPLICATOR		     0x228L
#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS	     0x22BL
#define SECURITY_MANDATORY_UNTRUSTED_RID		 0
#define SECURITY_MANDATORY_LOW_RID		    0x1000
#define SECURITY_MANDATORY_MEDIUM_RID		    0x2000
#define SECURITY_MANDATORY_HIGH_RID		    0x3000
#define SECURITY_MANDATORY_SYSTEM_RID		    0x4000
#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    0x5000

#define SECURITY_MANDATORY_MAXIMUM_USER_RID	SECURITY_MANDATORY_SYSTEM_RID
#define SE_CREATE_TOKEN_NAME			TEXT("SeCreateTokenPrivilege")
#define SE_ASSIGNPRIMARYTOKEN_NAME		TEXT("SeAssignPrimaryTokenPrivilege")
#define SE_LOCK_MEMORY_NAME			TEXT("SeLockMemoryPrivilege")
#define SE_INCREASE_QUOTA_NAME			TEXT("SeIncreaseQuotaPrivilege")
#define SE_UNSOLICITED_INPUT_NAME		TEXT("SeUnsolicitedInputPrivilege")
#define SE_MACHINE_ACCOUNT_NAME 		TEXT("SeMachineAccountPrivilege")
#define SE_TCB_NAME				TEXT("SeTcbPrivilege")
#define SE_SECURITY_NAME			TEXT("SeSecurityPrivilege")
#define SE_TAKE_OWNERSHIP_NAME			TEXT("SeTakeOwnershipPrivilege")
#define SE_LOAD_DRIVER_NAME			TEXT("SeLoadDriverPrivilege")
#define SE_SYSTEM_PROFILE_NAME			TEXT("SeSystemProfilePrivilege")
#define SE_SYSTEMTIME_NAME			TEXT("SeSystemtimePrivilege")
#define SE_PROF_SINGLE_PROCESS_NAME		TEXT("SeProfileSingleProcessPrivilege")
#define SE_INC_BASE_PRIORITY_NAME		TEXT("SeIncreaseBasePriorityPrivilege")
#define SE_CREATE_PAGEFILE_NAME 		TEXT("SeCreatePagefilePrivilege")
#define SE_CREATE_PERMANENT_NAME		TEXT("SeCreatePermanentPrivilege")
#define SE_BACKUP_NAME				TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME 			TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME			TEXT("SeShutdownPrivilege")
#define SE_DEBUG_NAME				TEXT("SeDebugPrivilege")
#define SE_AUDIT_NAME				TEXT("SeAuditPrivilege")
#define SE_SYSTEM_ENVIRONMENT_NAME		TEXT("SeSystemEnvironmentPrivilege")
#define SE_CHANGE_NOTIFY_NAME			TEXT("SeChangeNotifyPrivilege")
#define SE_REMOTE_SHUTDOWN_NAME 		TEXT("SeRemoteShutdownPrivilege")
#define SE_CREATE_GLOBAL_NAME			TEXT("SeCreateGlobalPrivilege")
#define SE_UNDOCK_NAME				TEXT("SeUndockPrivilege")
#define SE_MANAGE_VOLUME_NAME			TEXT("SeManageVolumePrivilege")
#define SE_IMPERSONATE_NAME			TEXT("SeImpersonatePrivilege")
#define SE_ENABLE_DELEGATION_NAME		TEXT("SeEnableDelegationPrivilege")
#define SE_SYNC_AGENT_NAME			TEXT("SeSyncAgentPrivilege")
#define SE_TRUSTED_CREDMAN_ACCESS_NAME		TEXT("SeTrustedCredManAccessPrivilege")
#define SE_RELABEL_NAME 			TEXT("SeRelabelPrivilege")
#define SE_INCREASE_WORKING_SET_NAME		TEXT("SeIncreaseWorkingSetPrivilege")
#define SE_TIME_ZONE_NAME			TEXT("SeTimeZonePrivilege")
#define SE_CREATE_SYMBOLIC_LINK_NAME		TEXT("SeCreateSymbolicLinkPrivilege")
#define SE_GROUP_MANDATORY				 1
#define SE_GROUP_ENABLED_BY_DEFAULT			 2
#define SE_GROUP_ENABLED				 4
#define SE_GROUP_OWNER					 8
#define SE_GROUP_USE_FOR_DENY_ONLY			16
#define SE_GROUP_INTEGRITY				32
#define SE_GROUP_INTEGRITY_ENABLED			64
#define SE_GROUP_LOGON_ID			3221225472U
#define SE_GROUP_RESOURCE			 536870912
#define LANG_NEUTRAL				      0x00
#define LANG_ARABIC				      0x01
#define LANG_BULGARIAN				      0x02
#define LANG_CATALAN				      0x03
#define LANG_CHINESE				      0x04
#define LANG_CZECH				      0x05
#define LANG_DANISH				      0x06
#define LANG_GERMAN				      0x07
#define LANG_GREEK				      0x08
#define LANG_ENGLISH				      0x09
#define LANG_SPANISH				      0x0a
#define LANG_FINNISH				      0x0b
#define LANG_FRENCH				      0x0c
#define LANG_HEBREW				      0x0d
#define LANG_HUNGARIAN				      0x0e
#define LANG_ICELANDIC				      0x0f
#define LANG_ITALIAN				      0x10
#define LANG_JAPANESE				      0x11
#define LANG_KOREAN				      0x12
#define LANG_DUTCH				      0x13
#define LANG_NORWEGIAN				      0x14
#define LANG_POLISH				      0x15
#define LANG_PORTUGUESE 			      0x16
#define LANG_ROMANIAN				      0x18
#define LANG_RUSSIAN				      0x19
#define LANG_CROATIAN				      0x1a
#define LANG_SERBIAN				      0x1a
#define LANG_SERBIAN_NEUTRAL			    0x7c1a
#define LANG_BOSNIAN				      0x1a
#define LANG_BOSNIAN_NEUTRAL			    0x781a
#define LANG_SLOVAK				      0x1b
#define LANG_ALBANIAN				      0x1c
#define LANG_SWEDISH				      0x1d
#define LANG_THAI				      0x1e
#define LANG_TURKISH				      0x1f
#define LANG_URDU				      0x20
#define LANG_INDONESIAN 			      0x21
#define LANG_UKRAINIAN				      0x22
#define LANG_BELARUSIAN 			      0x23
#define LANG_SLOVENIAN				      0x24
#define LANG_ESTONIAN				      0x25
#define LANG_LATVIAN				      0x26
#define LANG_LITHUANIAN 			      0x27
#define LANG_PERSIAN				      0x29
#define LANG_FARSI				  LANG_PERSIAN
#define LANG_VIETNAMESE 			      0x2a
#define LANG_ARMENIAN				      0x2b
#define LANG_AZERI				      0x2c
#define LANG_BASQUE				      0x2d
#define LANG_LOWER_SORBIAN			      0x2e
#define LANG_UPPER_SORBIAN			      0x2e
#define LANG_MACEDONIAN 			      0x2f
#define LANG_TSWANA				      0x32
#define LANG_XHOSA				      0x34
#define LANG_ZULU				      0x35
#define LANG_AFRIKAANS				      0x36
#define LANG_GEORGIAN				      0x37
#define LANG_FAEROESE				      0x38
#define LANG_HINDI				      0x39
#define LANG_MALTESE				      0x3a
#define LANG_SAMI				      0x3b
#define LANG_IRISH				      0x3c
#define LANG_MALAY				      0x3e
#define LANG_KAZAK				      0x3f
#define LANG_KYRGYZ				      0x40
#define LANG_SWAHILI				      0x41
#define LANG_UZBEK				      0x43
#define LANG_TATAR				      0x44
#define LANG_BENGALI				      0x45
#define LANG_PUNJABI				      0x46
#define LANG_GUJARATI				      0x47
#define LANG_ORIYA				      0x48
#define LANG_TAMIL				      0x49
#define LANG_TELUGU				      0x4a
#define LANG_KANNADA				      0x4b
#define LANG_MALAYALAM				      0x4c
#define LANG_ASSAMESE				      0x4d
#define LANG_MARATHI				      0x4e
#define LANG_SANSKRIT				      0x4f
#define LANG_MONGOLIAN				      0x50
#define LANG_TIBETAN				      0x51
#define LANG_WELSH				      0x52
#define LANG_KHMER				      0x53
#define LANG_LAO				      0x54
#define LANG_GALICIAN				      0x56
#define LANG_KONKANI				      0x57
#define LANG_MANIPURI				      0x58
#define LANG_SINDHI				      0x59
#define LANG_SYRIAC				      0x5a
#define LANG_SINHALESE				      0x5b
#define LANG_INUKTITUT				      0x5d
#define LANG_AMHARIC				      0x5e
#define LANG_TAMAZIGHT				      0x5f
#define LANG_KASHMIRI				      0x60
#define LANG_NEPALI				      0x61
#define LANG_FRISIAN				      0x62
#define LANG_PASHTO				      0x63
#define LANG_FILIPINO				      0x64
#define LANG_DIVEHI				      0x65
#define LANG_HAUSA				      0x68
#define LANG_YORUBA				      0x6a
#define LANG_QUECHUA				      0x6b
#define LANG_SOTHO				      0x6c
#define LANG_BASHKIR				      0x6d
#define LANG_LUXEMBOURGISH			      0x6e
#define LANG_GREENLANDIC			      0x6f
#define LANG_IGBO				      0x70
#define LANG_TIGRIGNA				      0x73
#define LANG_YI 				      0x78
#define LANG_MAPUDUNGUN 			      0x7a
#define LANG_MOHAWK				      0x7c
#define LANG_BRETON				      0x7e
#define LANG_INVARIANT				      0x7f
#define LANG_UIGHUR				      0x80
#define LANG_MAORI				      0x81
#define LANG_OCCITAN				      0x82
#define LANG_CORSICAN				      0x83
#define LANG_ALSATIAN				      0x84
#define LANG_YAKUT				      0x85
#define LANG_KICHE				      0x86
#define LANG_KINYARWANDA			      0x87
#define LANG_WOLOF				      0x88
#define LANG_DARI				      0x8c
#define LANG_MALAGASY				      0x8d
#define SUBLANG_NEUTRAL 			      0x00
#define SUBLANG_DEFAULT 			      0x01
#define SUBLANG_SYS_DEFAULT			      0x02
#define SUBLANG_CUSTOM_DEFAULT			      0x03
#define SUBLANG_CUSTOM_UNSPECIFIED		      0x04
#define SUBLANG_UI_CUSTOM_DEFAULT		      0x05
#define SUBLANG_AFRIKAANS_SOUTH_AFRICA		      0x01
#define SUBLANG_ALBANIAN_ALBANIA		      0x01
#define SUBLANG_ALSATIAN_FRANCE 		      0x01
#define SUBLANG_AMHARIC_ETHIOPIA		      0x01
#define SUBLANG_ARABIC_SAUDI_ARABIA		      0x01
#define SUBLANG_ARABIC_IRAQ			      0x02
#define SUBLANG_ARABIC_EGYPT			      0x03
#define SUBLANG_ARABIC_LIBYA			      0x04
#define SUBLANG_ARABIC_ALGERIA			      0x05
#define SUBLANG_ARABIC_MOROCCO			      0x06
#define SUBLANG_ARABIC_TUNISIA			      0x07
#define SUBLANG_ARABIC_OMAN			      0x08
#define SUBLANG_ARABIC_YEMEN			      0x09
#define SUBLANG_ARABIC_SYRIA			      0x0a
#define SUBLANG_ARABIC_JORDAN			      0x0b
#define SUBLANG_ARABIC_LEBANON			      0x0c
#define SUBLANG_ARABIC_KUWAIT			      0x0d
#define SUBLANG_ARABIC_UAE			      0x0e
#define SUBLANG_ARABIC_BAHRAIN			      0x0f
#define SUBLANG_ARABIC_QATAR			      0x10
#define SUBLANG_ARMENIAN_ARMENIA		      0x01
#define SUBLANG_ASSAMESE_INDIA			      0x01
#define SUBLANG_AZERI_LATIN			      0x01
#define SUBLANG_AZERI_CYRILLIC			      0x02
#define SUBLANG_BASHKIR_RUSSIA			      0x01
#define SUBLANG_BASQUE_BASQUE			      0x01
#define SUBLANG_BELARUSIAN_BELARUS		      0x01
#define SUBLANG_BENGALI_INDIA			      0x01
#define SUBLANG_BENGALI_BANGLADESH		      0x02
#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN      0x05
#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC   0x08
#define SUBLANG_BRETON_FRANCE			      0x01
#define SUBLANG_BULGARIAN_BULGARIA		      0x01
#define SUBLANG_CATALAN_CATALAN 		      0x01
#define SUBLANG_CHINESE_TRADITIONAL		      0x01
#define SUBLANG_CHINESE_SIMPLIFIED		      0x02
#define SUBLANG_CHINESE_HONGKONG		      0x03
#define SUBLANG_CHINESE_SINGAPORE		      0x04
#define SUBLANG_CHINESE_MACAU			      0x05
#define SUBLANG_CORSICAN_FRANCE 		      0x01
#define SUBLANG_CZECH_CZECH_REPUBLIC		      0x01
#define SUBLANG_CROATIAN_CROATIA		      0x01
#define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN     0x04
#define SUBLANG_DANISH_DENMARK			      0x01
#define SUBLANG_DIVEHI_MALDIVES 		      0x01
#define SUBLANG_DUTCH				      0x01
#define SUBLANG_DUTCH_BELGIAN			      0x02
#define SUBLANG_ENGLISH_US			      0x01
#define SUBLANG_ENGLISH_UK			      0x02
#define SUBLANG_ENGLISH_AUS			      0x03
#define SUBLANG_ENGLISH_CAN			      0x04
#define SUBLANG_ENGLISH_NZ			      0x05
#if (WINVER >= 0x0600)
#define SUBLANG_ENGLISH_IRELAND 		      0x06
#endif
#define SUBLANG_ENGLISH_EIRE			      0x06
#define SUBLANG_ENGLISH_SOUTH_AFRICA		      0x07
#define SUBLANG_ENGLISH_JAMAICA 		      0x08
#define SUBLANG_ENGLISH_CARIBBEAN		      0x09
#define SUBLANG_ENGLISH_BELIZE			      0x0a
#define SUBLANG_ENGLISH_TRINIDAD		      0x0b
#define SUBLANG_ENGLISH_ZIMBABWE		      0x0c
#define SUBLANG_ENGLISH_PHILIPPINES		      0x0d
#define SUBLANG_ENGLISH_INDIA			      0x10
#define SUBLANG_ENGLISH_MALAYSIA		      0x11
#define SUBLANG_ENGLISH_SINGAPORE		      0x12
#define SUBLANG_ESTONIAN_ESTONIA		      0x01
#define SUBLANG_FAEROESE_FAROE_ISLANDS		      0x01
#define SUBLANG_FILIPINO_PHILIPPINES		      0x01
#define SUBLANG_FINNISH_FINLAND 		      0x01
#define SUBLANG_FRENCH				      0x01
#define SUBLANG_FRENCH_BELGIAN			      0x02
#define SUBLANG_FRENCH_CANADIAN 		      0x03
#define SUBLANG_FRENCH_SWISS			      0x04
#define SUBLANG_FRENCH_LUXEMBOURG		      0x05
#define SUBLANG_FRENCH_MONACO			      0x06
#define SUBLANG_FRISIAN_NETHERLANDS		      0x01
#define SUBLANG_GALICIAN_GALICIAN		      0x01
#define SUBLANG_GEORGIAN_GEORGIA		      0x01
#define SUBLANG_GERMAN				      0x01
#define SUBLANG_GERMAN_SWISS			      0x02
#define SUBLANG_GERMAN_AUSTRIAN 		      0x03
#define SUBLANG_GERMAN_LUXEMBOURG		      0x04
#define SUBLANG_GERMAN_LIECHTENSTEIN		      0x05
#define SUBLANG_GREEK_GREECE			      0x01
#define SUBLANG_GREENLANDIC_GREENLAND		      0x01
#define SUBLANG_GUJARATI_INDIA			      0x01
#define SUBLANG_HAUSA_NIGERIA_LATIN		      0x01
#define SUBLANG_HAUSA_NIGERIA			SUBLANG_HAUSA_NIGERIA_LATIN /* SUBLANG_HAUSA_NIGERIA_LATIN is what MS defines */
#define SUBLANG_HEBREW_ISRAEL			      0x01
#define SUBLANG_HINDI_INDIA			      0x01
#define SUBLANG_HUNGARIAN_HUNGARY		      0x01
#define SUBLANG_ICELANDIC_ICELAND		      0x01
#define SUBLANG_IGBO_NIGERIA			      0x01
#define SUBLANG_INDONESIAN_INDONESIA		      0x01
#define SUBLANG_INUKTITUT_CANADA		      0x01
#define SUBLANG_INUKTITUT_CANADA_LATIN		      0x02
#define SUBLANG_IRISH_IRELAND			      0x02
#define SUBLANG_ITALIAN 			      0x01
#define SUBLANG_ITALIAN_SWISS			      0x02
#define SUBLANG_JAPANESE_JAPAN			      0x01
#define SUBLANG_KASHMIRI_INDIA			      0x02
#define SUBLANG_KASHMIRI_SASIA			      0x02
#define SUBLANG_KAZAK_KAZAKHSTAN		      0x01
#define SUBLANG_KHMER_CAMBODIA			      0x01
#define SUBLANG_KICHE_GUATEMALA 		      0x01
#define SUBLANG_KINYARWANDA_RWANDA		      0x01
#define SUBLANG_KONKANI_INDIA			      0x01
#define SUBLANG_KOREAN				      0x01
#define SUBLANG_KYRGYZ_KYRGYZSTAN		      0x01
#define SUBLANG_LAO_LAO 			      0x01
#define SUBLANG_LAO_LAO_PDR			SUBLANG_LAO_LAO /* SUBLANG_LAO_LAO is what MS defines */
#define SUBLANG_LATVIAN_LATVIA			      0x01
#if (WINVER >= 0x0600)
#define SUBLANG_LITHUANIAN_LITHUANIA		      0x01
#endif
#define SUBLANG_LITHUANIAN			      0x01
#define SUBLANG_LOWER_SORBIAN_GERMANY		      0x02
#define SUBLANG_LUXEMBOURGISH_LUXEMBOURG	      0x01
#define SUBLANG_MACEDONIAN_MACEDONIA		      0x01
#define SUBLANG_MALAY_MALAYSIA			      0x01
#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 	      0x02
#define SUBLANG_MALAYALAM_INDIA 		      0x01
#define SUBLANG_MALTESE_MALTA			      0x01
#define SUBLANG_MAORI_NEW_ZEALAND		      0x01
#define SUBLANG_MAPUDUNGUN_CHILE		      0x01
#define SUBLANG_MARATHI_INDIA			      0x01
#define SUBLANG_MOHAWK_MOHAWK			      0x01
#define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA	      0x01
#define SUBLANG_MONGOLIAN_PRC			      0x02
#define SUBLANG_NEPALI_NEPAL			      0x01
#define SUBLANG_NEPALI_INDIA			      0x02
#define SUBLANG_NORWEGIAN_BOKMAL		      0x01
#define SUBLANG_NORWEGIAN_NYNORSK		      0x02
#define SUBLANG_OCCITAN_FRANCE			      0x01
#define SUBLANG_ORIYA_INDIA			      0x01
#define SUBLANG_PASHTO_AFGHANISTAN		      0x01
#define SUBLANG_PERSIAN_IRAN			      0x01
#define SUBLANG_POLISH_POLAND			      0x01
#define SUBLANG_PORTUGUESE_BRAZILIAN		      0x01
#if (WINVER >= 0x0600)
#define SUBLANG_PORTUGUESE_PORTUGAL		      0x02
#endif
#define SUBLANG_PORTUGUESE			      0x02
#define SUBLANG_PUNJABI_INDIA			      0x01
/* ??? #define SUBLANG_PUNJABI_PAKISTAN		      0x01 ??? */
#define SUBLANG_QUECHUA_BOLIVIA 		      0x01
#define SUBLANG_QUECHUA_ECUADOR 		      0x02
#define SUBLANG_QUECHUA_PERU			      0x03
#define SUBLANG_ROMANIAN_ROMANIA		      0x01
/* ??? #define SUBLANG_ROMANIAN_MOLDOVA		      0x01 ??? */
#define SUBLANG_ROMANSH_SWITZERLAND		      0x01
#define SUBLANG_RUSSIAN_RUSSIA			      0x01
#define SUBLANG_SAMI_NORTHERN_NORWAY		      0x01
#define SUBLANG_SAMI_NORTHERN_SWEDEN		      0x02
#define SUBLANG_SAMI_NORTHERN_FINLAND		      0x03
#define SUBLANG_SAMI_LULE_NORWAY		      0x04
#define SUBLANG_SAMI_LULE_SWEDEN		      0x05
#define SUBLANG_SAMI_SOUTHERN_NORWAY		      0x06
#define SUBLANG_SAMI_SOUTHERN_SWEDEN		      0x07
#define SUBLANG_SAMI_SKOLT_FINLAND		      0x08
#define SUBLANG_SAMI_INARI_FINLAND		      0x09
#define SUBLANG_SANSKRIT_INDIA			      0x01
#define SUBLANG_SERBIAN_LATIN			      0x02
#define SUBLANG_SERBIAN_CYRILLIC		      0x03
#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN      0x06
#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC   0x07
#define SUBLANG_SINDHI_AFGHANISTAN		      0x02
#define SUBLANG_SINHALESE_SRI_LANKA		      0x01
#define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA	      0x01
#define SUBLANG_SLOVAK_SLOVAKIA 		      0x01
#define SUBLANG_SLOVENIAN_SLOVENIA		      0x01
#define SUBLANG_SPANISH 			      0x01
#define SUBLANG_SPANISH_MEXICAN 		      0x02
#define SUBLANG_SPANISH_MODERN			      0x03
#define SUBLANG_SPANISH_GUATEMALA		      0x04
#define SUBLANG_SPANISH_COSTA_RICA		      0x05
#define SUBLANG_SPANISH_PANAMA			      0x06
#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC	      0x07
#define SUBLANG_SPANISH_VENEZUELA		      0x08
#define SUBLANG_SPANISH_COLOMBIA		      0x09
#define SUBLANG_SPANISH_PERU			      0x0a
#define SUBLANG_SPANISH_ARGENTINA		      0x0b
#define SUBLANG_SPANISH_ECUADOR 		      0x0c
#define SUBLANG_SPANISH_CHILE			      0x0d
#define SUBLANG_SPANISH_URUGUAY 		      0x0e
#define SUBLANG_SPANISH_PARAGUAY		      0x0f
#define SUBLANG_SPANISH_BOLIVIA 		      0x10
#define SUBLANG_SPANISH_EL_SALVADOR		      0x11
#define SUBLANG_SPANISH_HONDURAS		      0x12
#define SUBLANG_SPANISH_NICARAGUA		      0x13
#define SUBLANG_SPANISH_PUERTO_RICO		      0x14
#define SUBLANG_SPANISH_US			      0x15
#if (WINVER >= 0x0600)
#define SUBLANG_SWEDISH_SWEDEN			      0x01
#endif
#define SUBLANG_SWEDISH 			      0x01
#define SUBLANG_SWEDISH_FINLAND 		      0x02
#define SUBLANG_SYRIAC				      0x01
#define SUBLANG_SYRIAC_SYRIA			SUBLANG_SYRIAC /* SUBLANG_SYRIAC_SYRIA is what MSDN mentions */
#define SUBLANG_TAJIK_TAJIKISTAN		      0x01
#define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 	      0x02
#define SUBLANG_TAMIL_INDIA			      0x01
#define SUBLANG_TATAR_RUSSIA			      0x01
#define SUBLANG_TELUGU_INDIA			      0x01
#define SUBLANG_THAI_THAILAND			      0x01
#define SUBLANG_TIBETAN_PRC			      0x01
#define SUBLANG_TIBETAN_BHUTAN			      0x02
#define SUBLANG_TIGRIGNA_ERITREA		      0x02
#define SUBLANG_TSWANA_SOUTH_AFRICA		      0x01
#define SUBLANG_TURKISH_TURKEY			      0x01
#define SUBLANG_TURKMEN_TURKMENISTAN		      0x01
#define SUBLANG_UIGHUR_PRC			      0x01
#define SUBLANG_UKRAINIAN_UKRAINE		      0x01
#define SUBLANG_UPPER_SORBIAN_GERMANY		      0x01
#define SUBLANG_URDU_PAKISTAN			      0x01
#define SUBLANG_URDU_INDIA			      0x02
#define SUBLANG_UZBEK_LATIN			      0x01
#define SUBLANG_UZBEK_CYRILLIC			      0x02
#define SUBLANG_VIETNAMESE_VIETNAM		      0x01
#define SUBLANG_WELSH_UNITED_KINGDOM		      0x01
#define SUBLANG_WOLOF_SENEGAL			      0x01
#define SUBLANG_YORUBA_NIGERIA			      0x01
#define SUBLANG_XHOSA_SOUTH_AFRICA		      0x01
#define SUBLANG_YAKUT_RUSSIA			      0x01
#define SUBLANG_YI_PRC				      0x01
#define SUBLANG_ZULU_SOUTH_AFRICA		      0x01
#define NLS_VALID_LOCALE_MASK			   1048575
#define SORT_DEFAULT					 0
#define SORT_JAPANESE_XJIS				 0
#define SORT_JAPANESE_UNICODE				 1
#define SORT_CHINESE_BIG5				 0
#define SORT_CHINESE_PRCP				 0
#define SORT_CHINESE_UNICODE				 1
#define SORT_CHINESE_PRC				 2
#define SORT_CHINESE_BOPOMOFO				 3
#define SORT_KOREAN_KSC 				 0
#define SORT_KOREAN_UNICODE				 1
#define SORT_GERMAN_PHONE_BOOK				 1
#define SORT_HUNGARIAN_DEFAULT				 0
#define SORT_HUNGARIAN_TECHNICAL			 1
#define SORT_GEORGIAN_TRADITIONAL			 0
#define SORT_GEORGIAN_MODERN				 1
#define MAKELANGID(p,s) 		((((WORD)(s))<<10)|(WORD)(p))
#define MAKELCID(l,s)			((DWORD)((((DWORD)((WORD)(s)))<<16)|((DWORD)((WORD)(l)))))
#define PRIMARYLANGID(l)		((WORD)(l)&0x3ff)
#define SORTIDFROMLCID(l)		((WORD)((((DWORD)(l))&NLS_VALID_LOCALE_MASK)>>16))
#define SORTVERSIONFROMLCID(l)		((WORD)((((DWORD)(l))>>20)&0xf))
#define SUBLANGID(l)			((WORD)(l)>>10)
#define LANGIDFROMLCID(l)		((WORD)(l))
#define LANG_SYSTEM_DEFAULT		MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT)
#define LANG_USER_DEFAULT		MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)
#define LOCALE_NEUTRAL			MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT)
#define ACL_REVISION					 2
#define ACL_REVISION_DS 				 4
#define ACL_REVISION1					 1
#define ACL_REVISION2					 2
#define ACL_REVISION3					 3
#define ACL_REVISION4					 4
#define MIN_ACL_REVISION				 2
#define MAX_ACL_REVISION				 4
#define MINCHAR 				      0x80
#define MAXCHAR 				      0x7f
#define MINSHORT				    0x8000
#define MAXSHORT				    0x7fff
#define MINLONG 				0x80000000
#define MAXLONG  				0x7fffffff
#define MAXBYTE 				      0xff
#define MAXWORD 				    0xffff
#define MAXDWORD				0xffffffff
#define PROCESSOR_INTEL_386			       386
#define PROCESSOR_INTEL_486			       486
#define PROCESSOR_INTEL_PENTIUM 		       586
#define PROCESSOR_MIPS_R4000			      4000
#define PROCESSOR_ALPHA_21064			     21064
#define PROCESSOR_INTEL_IA64			      2200
#define PROCESSOR_ARCHITECTURE_INTEL			 0
#define PROCESSOR_ARCHITECTURE_MIPS			 1
#define PROCESSOR_ARCHITECTURE_ALPHA			 2
#define PROCESSOR_ARCHITECTURE_PPC			 3
#define PROCESSOR_ARCHITECTURE_SHX			 4
#define PROCESSOR_ARCHITECTURE_ARM			 5
#define PROCESSOR_ARCHITECTURE_IA64			 6
#define PROCESSOR_ARCHITECTURE_ALPHA64			 7
#define PROCESSOR_ARCHITECTURE_MSIL			 8
#define PROCESSOR_ARCHITECTURE_AMD64			 9
#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64		10
#define PROCESSOR_ARCHITECTURE_UNKNOWN		    0xFFFF
#define PF_FLOATING_POINT_PRECISION_ERRATA		 0
#define PF_FLOATING_POINT_EMULATED			 1
#define PF_COMPARE_EXCHANGE_DOUBLE			 2
#define PF_MMX_INSTRUCTIONS_AVAILABLE			 3
#define PF_PPC_MOVEMEM_64BIT_OK 			 4
#define PF_ALPHA_BYTE_INSTRUCTIONS			 5
#define PF_XMMI_INSTRUCTIONS_AVAILABLE			 6
#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 		 7
#define PF_RDTSC_INSTRUCTION_AVAILABLE			 8
#define PF_PAE_ENABLED					 9
#define PF_XMMI64_INSTRUCTIONS_AVAILABLE		10
/* also in ddk/ntifs.h */
#define FILE_ACTION_ADDED			0x00000001
#define FILE_ACTION_REMOVED			0x00000002
#define FILE_ACTION_MODIFIED			0x00000003
#define FILE_ACTION_RENAMED_OLD_NAME		0x00000004
#define FILE_ACTION_RENAMED_NEW_NAME		0x00000005
#define FILE_ACTION_ADDED_STREAM		0x00000006
#define FILE_ACTION_REMOVED_STREAM		0x00000007
#define FILE_ACTION_MODIFIED_STREAM		0x00000008
#define FILE_ACTION_REMOVED_BY_DELETE		0x00000009
#define FILE_ACTION_ID_NOT_TUNNELLED		0x0000000A
#define FILE_ACTION_TUNNELLED_ID_COLLISION	0x0000000B
/* end ntifs.h */
#define HEAP_NO_SERIALIZE				 1
#define HEAP_GROWABLE					 2
#define HEAP_GENERATE_EXCEPTIONS			 4
#define HEAP_ZERO_MEMORY				 8
#define HEAP_REALLOC_IN_PLACE_ONLY			16
#define HEAP_TAIL_CHECKING_ENABLED			32
#define HEAP_FREE_CHECKING_ENABLED			64
#define HEAP_DISABLE_COALESCE_ON_FREE		       128
#define HEAP_CREATE_ALIGN_16			    0x0000
#define HEAP_CREATE_ENABLE_TRACING		   0x20000
#define HEAP_MAXIMUM_TAG			     0xFFF
#define HEAP_PSEUDO_TAG_FLAG			    0x8000
#define HEAP_TAG_SHIFT					16
#define HEAP_MAKE_TAG_FLAGS(b,o)	     ((DWORD)((b)+(o)<<16))
#define KEY_QUERY_VALUE 				 1
#define KEY_SET_VALUE					 2
#define KEY_CREATE_SUB_KEY				 4
#define KEY_ENUMERATE_SUB_KEYS				 8
#define KEY_NOTIFY					16
#define KEY_CREATE_LINK 				32
#define KEY_WRITE				   0x20006
#define KEY_EXECUTE				   0x20019
#define KEY_READ				   0x20019
#if (_WIN32_WINNT >= 0x0502)
#define KEY_WOW64_64KEY 			    0x0100
#define KEY_WOW64_32KEY 			    0x0200
#endif
#define KEY_ALL_ACCESS				   0xf003f
#define REG_WHOLE_HIVE_VOLATILE 			 1
#define REG_REFRESH_HIVE				 2
#define REG_NO_LAZY_FLUSH				 4
#define REG_OPTION_RESERVED				 0
#define REG_OPTION_NON_VOLATILE 			 0
#define REG_OPTION_VOLATILE				 1
#define REG_OPTION_CREATE_LINK				 2
#define REG_OPTION_BACKUP_RESTORE			 4
#define REG_OPTION_OPEN_LINK				 8
#define REG_LEGAL_OPTION				15
#define OWNER_SECURITY_INFORMATION		0x00000001
#define GROUP_SECURITY_INFORMATION		0x00000002
#define DACL_SECURITY_INFORMATION		0x00000004
#define SACL_SECURITY_INFORMATION		0x00000008
#define LABEL_SECURITY_INFORMATION		0x00000010
#define UNPROTECTED_SACL_SECURITY_INFORMATION	0x10000000
#define UNPROTECTED_DACL_SECURITY_INFORMATION	0x20000000
#define PROTECTED_SACL_SECURITY_INFORMATION	0x40000000
#define PROTECTED_DACL_SECURITY_INFORMATION	0x80000000
#define MAXIMUM_PROCESSORS				32
#define PAGE_NOACCESS				    0x0001
#define PAGE_READONLY				    0x0002
#define PAGE_READWRITE				    0x0004
#define PAGE_WRITECOPY				    0x0008
#define PAGE_EXECUTE				    0x0010
#define PAGE_EXECUTE_READ			    0x0020
#define PAGE_EXECUTE_READWRITE			    0x0040
#define PAGE_EXECUTE_WRITECOPY			    0x0080
#define PAGE_TARGETS_INVALID			0x40000000
#define PAGE_TARGETS_NO_UPDATE			0x40000000
#define PAGE_GUARD				    0x0100
#define PAGE_NOCACHE				    0x0200
#define PAGE_WRITECOMBINE			    0x0400
#define MEM_COMMIT				    0x1000
#define MEM_RESERVE				    0x2000
#define MEM_DECOMMIT				    0x4000
#define MEM_RELEASE				    0x8000
#define MEM_FREE				   0x10000
#define MEM_PRIVATE				   0x20000
#define MEM_MAPPED				   0x40000
#define MEM_RESET				   0x80000
#define MEM_TOP_DOWN				  0x100000
#define MEM_WRITE_WATCH 			  0x200000 /* 98/Me */
#define MEM_PHYSICAL				  0x400000
#define MEM_4MB_PAGES				0x80000000
/* also in ddk/ntifs.h */
#define MEM_IMAGE				SEC_IMAGE
#define SEC_BASED				0x00200000
#define SEC_NO_CHANGE				0x00400000
#define SEC_FILE				0x00800000
#define SEC_IMAGE				0x01000000
#define SEC_VLM 				0x02000000
#define SEC_RESERVE				0x04000000
#define SEC_COMMIT				0x08000000
#define SEC_NOCACHE				0x10000000
/* end ntifs.h */
#define SECTION_EXTEND_SIZE				16
#define SECTION_MAP_READ				 4
#define SECTION_MAP_WRITE				 2
#define SECTION_QUERY					 1
#define SECTION_MAP_EXECUTE				 8
#define SECTION_ALL_ACCESS			   0xf001f
#define MESSAGE_RESOURCE_UNICODE			 1
#define RTL_CRITSECT_TYPE				 0
#define RTL_RESOURCE_TYPE				 1
/* Also in winddk.h */
#define FIELD_OFFSET(t,f)		((LONG)&(((t*)0)->f))
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) \
  ((type*)((PCHAR)(address) - (PCHAR)(&((type *)0)->field)))
#endif
/* end winddk.h */
#define IMAGE_SIZEOF_FILE_HEADER			20
#define IMAGE_FILE_RELOCS_STRIPPED			 1
#define IMAGE_FILE_EXECUTABLE_IMAGE			 2
#define IMAGE_FILE_LINE_NUMS_STRIPPED			 4
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED			 8
#define IMAGE_FILE_AGGRESIVE_WS_TRIM			16
#define IMAGE_FILE_LARGE_ADDRESS_AWARE			32
#define IMAGE_FILE_BYTES_REVERSED_LO		       128
#define IMAGE_FILE_32BIT_MACHINE		       256
#define IMAGE_FILE_DEBUG_STRIPPED		       512
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP	      1024
#define IMAGE_FILE_NET_RUN_FROM_SWAP		      2048
#define IMAGE_FILE_SYSTEM			      4096
#define IMAGE_FILE_DLL				      8192
#define IMAGE_FILE_UP_SYSTEM_ONLY		     16384
#define IMAGE_FILE_BYTES_REVERSED_HI		     32768

#define IMAGE_FILE_MACHINE_UNKNOWN		    0x0000
#define IMAGE_FILE_MACHINE_AM33 		    0x01d3 /* Matsushita AM33 */
#define IMAGE_FILE_MACHINE_AMD64		    0x8664 /* x64 */
#define IMAGE_FILE_MACHINE_ARM			    0x01c0 /* ARM little endian */
#define IMAGE_FILE_MACHINE_EBC			    0x0ebc /* EFI byte code */
#define IMAGE_FILE_MACHINE_I386 		    0x014c /* Intel 386 or later processors and compatible processors */
#define IMAGE_FILE_MACHINE_IA64 		    0x0200 /* Intel Itanium processor family */
#define IMAGE_FILE_MACHINE_M32R 		    0x9041 /* Mitsubishi M32R little endian */
#define IMAGE_FILE_MACHINE_MIPS16		    0x0266 /* MIPS16 */
#define IMAGE_FILE_MACHINE_MIPSFPU		    0x0366 /* MIPS with FPU */
#define IMAGE_FILE_MACHINE_MIPSFPU16		    0x0466 /* MIPS16 with FPU */
#define IMAGE_FILE_MACHINE_POWERPC		    0x01f0 /* Power PC little endian */
#define IMAGE_FILE_MACHINE_POWERPCFP		    0x01f1 /* Power PC with floating point support */
#define IMAGE_FILE_MACHINE_R4000		    0x0166 /* MIPS little endian */
#define IMAGE_FILE_MACHINE_SH3			    0x01a2 /* Hitachi SH3 */
#define IMAGE_FILE_MACHINE_SH3DSP		    0x01a3 /* Hitachi SH3 DSP */
#define IMAGE_FILE_MACHINE_SH4			    0x01a6 /* Hitachi SH4 */
#define IMAGE_FILE_MACHINE_SH5			    0x01a8 /* Hitachi SH5 */
#define IMAGE_FILE_MACHINE_THUMB		    0x01c2 /* Thumb */
#define IMAGE_FILE_MACHINE_WCEMIPSV2		    0x0169 /* MIPS little-endian WCE v2 */

#define IMAGE_DOS_SIGNATURE			    0x5A4D
#define IMAGE_OS2_SIGNATURE			    0x454E
#define IMAGE_OS2_SIGNATURE_LE			    0x454C
#define IMAGE_VXD_SIGNATURE			    0x454C
#define IMAGE_NT_SIGNATURE			0x00004550
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC		     0x10b
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC		     0x20b
#ifdef _WIN64
#define IMAGE_NT_OPTIONAL_HDR_MAGIC	IMAGE_NT_OPTIONAL_HDR64_MAGIC
#else
#define IMAGE_NT_OPTIONAL_HDR_MAGIC	IMAGE_NT_OPTIONAL_HDR32_MAGIC
#endif
#define IMAGE_ROM_OPTIONAL_HDR_MAGIC		     0x107
#define IMAGE_SEPARATE_DEBUG_SIGNATURE		    0x4944
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES		16
#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER		56
#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER		28
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 	       224
#define IMAGE_SIZEOF_SHORT_NAME 			 8
#define IMAGE_SIZEOF_SECTION_HEADER			40
#define IMAGE_SIZEOF_SYMBOL				18
#define IMAGE_SIZEOF_AUX_SYMBOL 			18
#define IMAGE_SIZEOF_RELOCATION 			10
#define IMAGE_SIZEOF_BASE_RELOCATION			 8
#define IMAGE_SIZEOF_LINENUMBER 			 6
#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 		60
#define SIZEOF_RFPO_DATA				16

#define IMAGE_SUBSYSTEM_UNKNOWN 			 0
#define IMAGE_SUBSYSTEM_NATIVE				 1
#define IMAGE_SUBSYSTEM_WINDOWS_GUI			 2
#define IMAGE_SUBSYSTEM_WINDOWS_CUI			 3
#define IMAGE_SUBSYSTEM_OS2_CUI 			 5  /* Not in PECOFF v8 spec */
#define IMAGE_SUBSYSTEM_POSIX_CUI			 7
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS			 8  /* Not in PECOFF v8 spec */
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI			 9
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 		10
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 	11
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER		12
#define IMAGE_SUBSYSTEM_EFI_ROM 			13
#define IMAGE_SUBSYSTEM_XBOX				14

#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE		0x0040
#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY	0x0080
#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT		0x0100
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION		0x0200
#define IMAGE_DLLCHARACTERISTICS_NO_SEH 		0x0400
#define IMAGE_DLLCHARACTERISTICS_NO_BIND		0x0800
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER		0x2000
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE	0x8000

/* Keep broken definitions for backward compatibility. */
#define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE		IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
#define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY	IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
#define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT		IMAGE_DLLCHARACTERISTICS_NX_COMPAT

#define IMAGE_FIRST_SECTION(h)				((PIMAGE_SECTION_HEADER) ((DWORD)h+FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader)+((PIMAGE_NT_HEADERS)(h))->FileHeader.SizeOfOptionalHeader))
#define IMAGE_DIRECTORY_ENTRY_EXPORT			 0
#define IMAGE_DIRECTORY_ENTRY_IMPORT			 1
#define IMAGE_DIRECTORY_ENTRY_RESOURCE			 2
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 		 3
#define IMAGE_DIRECTORY_ENTRY_SECURITY			 4
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 		 5
#define IMAGE_DIRECTORY_ENTRY_DEBUG			 6
#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 		 7
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE		 7
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 		 8
#define IMAGE_DIRECTORY_ENTRY_TLS			 9
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG		10
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT		11
#define IMAGE_DIRECTORY_ENTRY_IAT			12
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT		13
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR		14
#define IMAGE_SCN_TYPE_REG				 0
#define IMAGE_SCN_TYPE_DSECT				 1
#define IMAGE_SCN_TYPE_NOLOAD				 2
#define IMAGE_SCN_TYPE_GROUP				 4
#define IMAGE_SCN_TYPE_NO_PAD				 8
#define IMAGE_SCN_TYPE_COPY				16
#define IMAGE_SCN_CNT_CODE				32
#define IMAGE_SCN_CNT_INITIALIZED_DATA			64
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA	       128
#define IMAGE_SCN_LNK_OTHER			       256
#define IMAGE_SCN_LNK_INFO			       512
#define IMAGE_SCN_TYPE_OVER			      1024
#define IMAGE_SCN_LNK_REMOVE			      2048
#define IMAGE_SCN_LNK_COMDAT			      4096
#define IMAGE_SCN_GPREL 			    0x8000 /*  Valid only for IA64 */
#define IMAGE_SCN_MEM_FARDATA			    0x8000 /* Not in PECOFF v8 spec */
#define IMAGE_SCN_MEM_PURGEABLE 		   0x20000
#define IMAGE_SCN_MEM_16BIT			   0x20000
#define IMAGE_SCN_MEM_LOCKED			   0x40000
#define IMAGE_SCN_MEM_PRELOAD			   0x80000
#define IMAGE_SCN_ALIGN_1BYTES			  0x100000
#define IMAGE_SCN_ALIGN_2BYTES			  0x200000
#define IMAGE_SCN_ALIGN_4BYTES			  0x300000
#define IMAGE_SCN_ALIGN_8BYTES			  0x400000
#define IMAGE_SCN_ALIGN_16BYTES 		  0x500000
#define IMAGE_SCN_ALIGN_32BYTES 		  0x600000
#define IMAGE_SCN_ALIGN_64BYTES 		  0x700000
#define IMAGE_SCN_ALIGN_128BYTES		  0x800000
#define IMAGE_SCN_ALIGN_256BYTES		  0x900000
#define IMAGE_SCN_ALIGN_512BYTES		  0xa00000
#define IMAGE_SCN_ALIGN_1024BYTES		  0xb00000
#define IMAGE_SCN_ALIGN_2048BYTES		  0xc00000
#define IMAGE_SCN_ALIGN_4096BYTES		  0xd00000
#define IMAGE_SCN_ALIGN_8192BYTES		  0xe00000
#define IMAGE_SCN_LNK_NRELOC_OVFL		 0x1000000
#define IMAGE_SCN_MEM_DISCARDABLE		 0x2000000
#define IMAGE_SCN_MEM_NOT_CACHED		 0x4000000
#define IMAGE_SCN_MEM_NOT_PAGED 		 0x8000000
#define IMAGE_SCN_MEM_SHARED			0x10000000
#define IMAGE_SCN_MEM_EXECUTE			0x20000000
#define IMAGE_SCN_MEM_READ			0x40000000
#define IMAGE_SCN_MEM_WRITE			0x80000000
#define IMAGE_SYM_UNDEFINED				 0
#define IMAGE_SYM_ABSOLUTE			       (-1)
#define IMAGE_SYM_DEBUG 			       (-2)
#define IMAGE_SYM_TYPE_NULL				 0
#define IMAGE_SYM_TYPE_VOID				 1
#define IMAGE_SYM_TYPE_CHAR				 2
#define IMAGE_SYM_TYPE_SHORT				 3
#define IMAGE_SYM_TYPE_INT				 4
#define IMAGE_SYM_TYPE_LONG				 5
#define IMAGE_SYM_TYPE_FLOAT				 6
#define IMAGE_SYM_TYPE_DOUBLE				 7
#define IMAGE_SYM_TYPE_STRUCT				 8
#define IMAGE_SYM_TYPE_UNION				 9
#define IMAGE_SYM_TYPE_ENUM				10
#define IMAGE_SYM_TYPE_MOE				11
#define IMAGE_SYM_TYPE_BYTE				12
#define IMAGE_SYM_TYPE_WORD				13
#define IMAGE_SYM_TYPE_UINT				14
#define IMAGE_SYM_TYPE_DWORD				15
#define IMAGE_SYM_TYPE_PCODE			     32768
#define IMAGE_SYM_DTYPE_NULL				 0
#define IMAGE_SYM_DTYPE_POINTER 			 1
#define IMAGE_SYM_DTYPE_FUNCTION			 2
#define IMAGE_SYM_DTYPE_ARRAY				 3
#define IMAGE_SYM_CLASS_END_OF_FUNCTION 	       (-1)
#define IMAGE_SYM_CLASS_NULL				 0
#define IMAGE_SYM_CLASS_AUTOMATIC			 1
#define IMAGE_SYM_CLASS_EXTERNAL			 2
#define IMAGE_SYM_CLASS_STATIC				 3
#define IMAGE_SYM_CLASS_REGISTER			 4
#define IMAGE_SYM_CLASS_EXTERNAL_DEF			 5
#define IMAGE_SYM_CLASS_LABEL				 6
#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 		 7
#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT		 8
#define IMAGE_SYM_CLASS_ARGUMENT			 9
#define IMAGE_SYM_CLASS_STRUCT_TAG			10
#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 		11
#define IMAGE_SYM_CLASS_UNION_TAG			12
#define IMAGE_SYM_CLASS_TYPE_DEFINITION 		13
#define IMAGE_SYM_CLASS_UNDEFINED_STATIC		14
#define IMAGE_SYM_CLASS_ENUM_TAG			15
#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM			16
#define IMAGE_SYM_CLASS_REGISTER_PARAM			17
#define IMAGE_SYM_CLASS_BIT_FIELD			18
#define IMAGE_SYM_CLASS_FAR_EXTERNAL			68 /* Not in PECOFF v8 spec */
#define IMAGE_SYM_CLASS_BLOCK			       100
#define IMAGE_SYM_CLASS_FUNCTION		       101
#define IMAGE_SYM_CLASS_END_OF_STRUCT		       102
#define IMAGE_SYM_CLASS_FILE			       103
#define IMAGE_SYM_CLASS_SECTION 		       104
#define IMAGE_SYM_CLASS_WEAK_EXTERNAL		       105
#define IMAGE_SYM_CLASS_CLR_TOKEN		       107

#define IMAGE_COMDAT_SELECT_NODUPLICATES		 1
#define IMAGE_COMDAT_SELECT_ANY 			 2
#define IMAGE_COMDAT_SELECT_SAME_SIZE			 3
#define IMAGE_COMDAT_SELECT_EXACT_MATCH 		 4
#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 		 5
#define IMAGE_COMDAT_SELECT_LARGEST			 6
#define IMAGE_COMDAT_SELECT_NEWEST			 7 /* Not in PECOFF v8 spec */

#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY		 1
#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY		 2
#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS			 3

#define IMAGE_REL_I386_ABSOLUTE 		    0x0000
#define IMAGE_REL_I386_DIR16			    0x0001
#define IMAGE_REL_I386_REL16			    0x0002
#define IMAGE_REL_I386_DIR32			    0x0006
#define IMAGE_REL_I386_DIR32NB			    0x0007
#define IMAGE_REL_I386_SEG12			    0x0009
#define IMAGE_REL_I386_SECTION			    0x000A
#define IMAGE_REL_I386_SECREL			    0x000B
#define IMAGE_REL_I386_TOKEN			    0x000C
#define IMAGE_REL_I386_SECREL7			    0x000D
#define IMAGE_REL_I386_REL32			    0x0014

#define IMAGE_REL_AMD64_ABSOLUTE		    0x0000
#define IMAGE_REL_AMD64_ADDR64			    0x0001
#define IMAGE_REL_AMD64_ADDR32			    0x0002
#define IMAGE_REL_AMD64_ADDR32NB		    0x0003
#define IMAGE_REL_AMD64_REL32			    0x0004
#define IMAGE_REL_AMD64_REL32_1 		    0x0005
#define IMAGE_REL_AMD64_REL32_2 		    0x0006
#define IMAGE_REL_AMD64_REL32_3 		    0x0007
#define IMAGE_REL_AMD64_REL32_4 		    0x0008
#define IMAGE_REL_AMD64_REL32_5 		    0x0009
#define IMAGE_REL_AMD64_SECTION 		    0x000A
#define IMAGE_REL_AMD64_SECREL			    0x000B
#define IMAGE_REL_AMD64_SECREL7 		    0x000C
#define IMAGE_REL_AMD64_TOKEN			    0x000D
#define IMAGE_REL_AMD64_SREL32			    0x000E
#define IMAGE_REL_AMD64_PAIR			    0x000F
#define IMAGE_REL_AMD64_SSPAN32 		    0x0010

#define IMAGE_REL_IA64_ABSOLUTE 		    0x0000
#define IMAGE_REL_IA64_IMM14			    0x0001
#define IMAGE_REL_IA64_IMM22			    0x0002
#define IMAGE_REL_IA64_IMM64			    0x0003
#define IMAGE_REL_IA64_DIR32			    0x0004
#define IMAGE_REL_IA64_DIR64			    0x0005
#define IMAGE_REL_IA64_PCREL21B 		    0x0006
#define IMAGE_REL_IA64_PCREL21M 		    0x0007
#define IMAGE_REL_IA64_PCREL21F 		    0x0008
#define IMAGE_REL_IA64_GPREL22			    0x0009
#define IMAGE_REL_IA64_LTOFF22			    0x000A
#define IMAGE_REL_IA64_SECTION			    0x000B
#define IMAGE_REL_IA64_SECREL22 		    0x000C
#define IMAGE_REL_IA64_SECREL64I		    0x000D
#define IMAGE_REL_IA64_SECREL32 		    0x000E
#define IMAGE_REL_IA64_DIR32NB			    0x0010
#define IMAGE_REL_IA64_SREL14			    0x0011
#define IMAGE_REL_IA64_SREL22			    0x0012
#define IMAGE_REL_IA64_SREL32			    0x0013
#define IMAGE_REL_IA64_UREL32			    0x0014
#define IMAGE_REL_IA64_PCREL60X 		    0x0015
#define IMAGE_REL_IA64_PCREL60B 		    0x0016
#define IMAGE_REL_IA64_PCREL60F 		    0x0017
#define IMAGE_REL_IA64_PCREL60I 		    0x0018
#define IMAGE_REL_IA64_PCREL60M 		    0x0019
#define IMAGE_REL_IA64_IMMGPREL64		    0x001a
#define IMAGE_REL_IA64_TOKEN			    0x001b
#define IMAGE_REL_IA64_GPREL32			    0x001c
#define IMAGE_REL_IA64_ADDEND			    0x001F

#define IMAGE_REL_SH3_ABSOLUTE			    0x0000
#define IMAGE_REL_SH3_DIRECT16			    0x0001
#define IMAGE_REL_SH3_DIRECT32			    0x0002
#define IMAGE_REL_SH3_DIRECT8			    0x0003
#define IMAGE_REL_SH3_DIRECT8_WORD		    0x0004
#define IMAGE_REL_SH3_DIRECT8_LONG		    0x0005
#define IMAGE_REL_SH3_DIRECT4			    0x0006
#define IMAGE_REL_SH3_DIRECT4_WORD		    0x0007
#define IMAGE_REL_SH3_DIRECT4_LONG		    0x0008
#define IMAGE_REL_SH3_PCREL8_WORD		    0x0009
#define IMAGE_REL_SH3_PCREL8_LONG		    0x000A
#define IMAGE_REL_SH3_PCREL12_WORD		    0x000B
#define IMAGE_REL_SH3_STARTOF_SECTION		    0x000C
#define IMAGE_REL_SH3_SIZEOF_SECTION		    0x000D
#define IMAGE_REL_SH3_SECTION			    0x000E
#define IMAGE_REL_SH3_SECREL			    0x000F
#define IMAGE_REL_SH3_DIRECT32_NB		    0x0010
#define IMAGE_REL_SH3_GPREL4_LONG		    0x0011
#define IMAGE_REL_SH3_TOKEN			    0x0012
#define IMAGE_REL_SHM_PCRELPT			    0x0013
#define IMAGE_REL_SHM_REFLO			    0x0014
#define IMAGE_REL_SHM_REFHALF			    0x0015
#define IMAGE_REL_SHM_RELLO			    0x0016
#define IMAGE_REL_SHM_RELHALF			    0x0017
#define IMAGE_REL_SHM_PAIR			    0x0018
#define IMAGE_REL_SHM_NOMODE			    0x8000

#define IMAGE_REL_M32R_ABSOLUTE 		    0x0000
#define IMAGE_REL_M32R_ADDR32			    0x0001
#define IMAGE_REL_M32R_ADDR32NB 		    0x0002
#define IMAGE_REL_M32R_ADDR24			    0x0003
#define IMAGE_REL_M32R_GPREL16			    0x0004
#define IMAGE_REL_M32R_PCREL24			    0x0005
#define IMAGE_REL_M32R_PCREL16			    0x0006
#define IMAGE_REL_M32R_PCREL8			    0x0007
#define IMAGE_REL_M32R_REFHALF			    0x0008
#define IMAGE_REL_M32R_REFHI			    0x0009
#define IMAGE_REL_M32R_REFLO			    0x000A
#define IMAGE_REL_M32R_PAIR			    0x000B
#define IMAGE_REL_M32R_SECTION			    0x000C
#define IMAGE_REL_M32R_SECREL			    0x000D
#define IMAGE_REL_M32R_TOKEN			    0x000E

#define IMAGE_REL_MIPS_ABSOLUTE 		    0x0000
#define IMAGE_REL_MIPS_REFHALF			    0x0001
#define IMAGE_REL_MIPS_REFWORD			    0x0002
#define IMAGE_REL_MIPS_JMPADDR			    0x0003
#define IMAGE_REL_MIPS_REFHI			    0x0004
#define IMAGE_REL_MIPS_REFLO			    0x0005
#define IMAGE_REL_MIPS_GPREL			    0x0006
#define IMAGE_REL_MIPS_LITERAL			    0x0007
#define IMAGE_REL_MIPS_SECTION			    0x000A
#define IMAGE_REL_MIPS_SECREL			    0x000B
#define IMAGE_REL_MIPS_SECRELLO 		    0x000C
#define IMAGE_REL_MIPS_SECRELHI 		    0x000D
#define IMAGE_REL_MIPS_JMPADDR16		    0x0010
#define IMAGE_REL_MIPS_REFWORDNB		    0x0022
#define IMAGE_REL_MIPS_PAIR			    0x0025

#define IMAGE_REL_ALPHA_ABSOLUTE			 0
#define IMAGE_REL_ALPHA_REFLONG 			 1
#define IMAGE_REL_ALPHA_REFQUAD 			 2
#define IMAGE_REL_ALPHA_GPREL32 			 3
#define IMAGE_REL_ALPHA_LITERAL 			 4
#define IMAGE_REL_ALPHA_LITUSE				 5
#define IMAGE_REL_ALPHA_GPDISP				 6
#define IMAGE_REL_ALPHA_BRADDR				 7
#define IMAGE_REL_ALPHA_HINT				 8
#define IMAGE_REL_ALPHA_INLINE_REFLONG			 9
#define IMAGE_REL_ALPHA_REFHI				10
#define IMAGE_REL_ALPHA_REFLO				11
#define IMAGE_REL_ALPHA_PAIR				12
#define IMAGE_REL_ALPHA_MATCH				13
#define IMAGE_REL_ALPHA_SECTION 			14
#define IMAGE_REL_ALPHA_SECREL				15
#define IMAGE_REL_ALPHA_REFLONGNB			16
#define IMAGE_REL_ALPHA_SECRELLO			17
#define IMAGE_REL_ALPHA_SECRELHI			18
#define IMAGE_REL_PPC_ABSOLUTE				 0
#define IMAGE_REL_PPC_ADDR64				 1
#define IMAGE_REL_PPC_ADDR32				 2
#define IMAGE_REL_PPC_ADDR24				 3
#define IMAGE_REL_PPC_ADDR16				 4
#define IMAGE_REL_PPC_ADDR14				 5
#define IMAGE_REL_PPC_REL24				 6
#define IMAGE_REL_PPC_REL14				 7
#define IMAGE_REL_PPC_TOCREL16				 8
#define IMAGE_REL_PPC_TOCREL14				 9
#define IMAGE_REL_PPC_ADDR32NB				10
#define IMAGE_REL_PPC_SECREL				11
#define IMAGE_REL_PPC_SECTION				12
#define IMAGE_REL_PPC_IFGLUE				13
#define IMAGE_REL_PPC_IMGLUE				14
#define IMAGE_REL_PPC_SECREL16				15
#define IMAGE_REL_PPC_REFHI				16
#define IMAGE_REL_PPC_REFLO				17
#define IMAGE_REL_PPC_PAIR				18
#define IMAGE_REL_PPC_TYPEMASK			       255
#define IMAGE_REL_PPC_NEG			       256
#define IMAGE_REL_PPC_BRTAKEN			       512
#define IMAGE_REL_PPC_BRNTAKEN			      1024
#define IMAGE_REL_PPC_TOCDEFN			      2048
#define IMAGE_REL_BASED_ABSOLUTE			 0
#define IMAGE_REL_BASED_HIGH				 1
#define IMAGE_REL_BASED_LOW				 2
#define IMAGE_REL_BASED_HIGHLOW 			 3
#define IMAGE_REL_BASED_HIGHADJ 			 4
#define IMAGE_REL_BASED_MIPS_JMPADDR			 5
#define IMAGE_ARCHIVE_START_SIZE			 8
#define IMAGE_ARCHIVE_START			"!<arch>\n"
#define IMAGE_ARCHIVE_END			"`\n"
#define IMAGE_ARCHIVE_PAD			"\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER		"/               "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER		"//              "
#define IMAGE_ORDINAL_FLAG32			0x80000000
#define IMAGE_SNAP_BY_ORDINAL32(o)		((o&IMAGE_ORDINAL_FLAG32)!=0)
#define IMAGE_ORDINAL32(o)			(o&0xffff)
#define IMAGE_ORDINAL_FLAG64			0x8000000000000000ULL
#define IMAGE_SNAP_BY_ORDINAL64(o)		((o&IMAGE_ORDINAL_FLAG64)!=0)
#define IMAGE_ORDINAL64(o)			(o&0xffff)
#ifdef _WIN64
#define IMAGE_ORDINAL_FLAG			IMAGE_ORDINAL_FLAG64
#define IMAGE_SNAP_BY_ORDINAL(o)		IMAGE_SNAP_BY_ORDINAL64(o)
#define IMAGE_ORDINAL(o)			IMAGE_ORDINAL64(o)
#else
#define IMAGE_ORDINAL_FLAG			IMAGE_ORDINAL_FLAG32
#define IMAGE_SNAP_BY_ORDINAL(o)		IMAGE_SNAP_BY_ORDINAL32(o)
#define IMAGE_ORDINAL(o)			IMAGE_ORDINAL32(o)
#endif
#define IMAGE_RESOURCE_NAME_IS_STRING		0x80000000
#define IMAGE_RESOURCE_DATA_IS_DIRECTORY	0x80000000
#define IMAGE_DEBUG_TYPE_UNKNOWN			 0
#define IMAGE_DEBUG_TYPE_COFF				 1
#define IMAGE_DEBUG_TYPE_CODEVIEW			 2
#define IMAGE_DEBUG_TYPE_FPO				 3
#define IMAGE_DEBUG_TYPE_MISC				 4
#define IMAGE_DEBUG_TYPE_EXCEPTION			 5
#define IMAGE_DEBUG_TYPE_FIXUP				 6
#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC			 7
#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC			 8
#define IMAGE_DEBUG_TYPE_BORLAND			 9
#define FRAME_FPO					 0
#define FRAME_TRAP					 1
#define FRAME_TSS					 2
#define FRAME_NONFPO					 3
#define IMAGE_DEBUG_MISC_EXENAME			 1
#define N_BTMASK				    0x000F
#define N_TMASK 				    0x0030
#define N_TMASK1				    0x00C0
#define N_TMASK2				    0x00F0
#define N_BTSHFT					 4
#define N_TSHIFT					 2
#define IS_TEXT_UNICODE_ASCII16 			 1
#define IS_TEXT_UNICODE_REVERSE_ASCII16 		16
#define IS_TEXT_UNICODE_STATISTICS			 2
#define IS_TEXT_UNICODE_REVERSE_STATISTICS		32
#define IS_TEXT_UNICODE_CONTROLS			 4
#define IS_TEXT_UNICODE_REVERSE_CONTROLS		64
#define IS_TEXT_UNICODE_SIGNATURE			 8
#define IS_TEXT_UNICODE_REVERSE_SIGNATURE	       128
#define IS_TEXT_UNICODE_ILLEGAL_CHARS		       256
#define IS_TEXT_UNICODE_ODD_LENGTH		       512
#define IS_TEXT_UNICODE_NULL_BYTES		      4096
#define IS_TEXT_UNICODE_UNICODE_MASK			15
#define IS_TEXT_UNICODE_REVERSE_MASK		       240
#define IS_TEXT_UNICODE_NOT_UNICODE_MASK	      3840
#define IS_TEXT_UNICODE_NOT_ASCII_MASK		     61440
#define SERVICE_KERNEL_DRIVER				 1
#define SERVICE_FILE_SYSTEM_DRIVER			 2
#define SERVICE_ADAPTER 				 4
#define SERVICE_RECOGNIZER_DRIVER			 8
#define SERVICE_DRIVER  (SERVICE_KERNEL_DRIVER|SERVICE_FILE_SYSTEM_DRIVER|SERVICE_RECOGNIZER_DRIVER)
#define SERVICE_WIN32_OWN_PROCESS			16
#define SERVICE_WIN32_SHARE_PROCESS			32
#define SERVICE_WIN32  (SERVICE_WIN32_OWN_PROCESS|SERVICE_WIN32_SHARE_PROCESS)
#define SERVICE_INTERACTIVE_PROCESS		       256
#define SERVICE_TYPE_ALL  (SERVICE_WIN32|SERVICE_ADAPTER|SERVICE_DRIVER|SERVICE_INTERACTIVE_PROCESS)
#define SERVICE_BOOT_START				 0
#define SERVICE_SYSTEM_START				 1
#define SERVICE_AUTO_START				 2
#define SERVICE_DEMAND_START				 3
#define SERVICE_DISABLED				 4
#define SERVICE_ERROR_IGNORE				 0
#define SERVICE_ERROR_NORMAL				 1
#define SERVICE_ERROR_SEVERE				 2
#define SERVICE_ERROR_CRITICAL				 3
#define SE_OWNER_DEFAULTED				 1
#define SE_GROUP_DEFAULTED				 2
#define SE_DACL_PRESENT 				 4
#define SE_DACL_DEFAULTED				 8
#define SE_SACL_PRESENT 				16
#define SE_SACL_DEFAULTED				32
#define SE_DACL_AUTO_INHERIT_REQ		       256
#define SE_SACL_AUTO_INHERIT_REQ		       512
#define SE_DACL_AUTO_INHERITED			      1024
#define SE_SACL_AUTO_INHERITED			      2048
#define SE_DACL_PROTECTED			      4096
#define SE_SACL_PROTECTED			      8192
#define SE_SELF_RELATIVE			    0x8000
#define SECURITY_DESCRIPTOR_MIN_LENGTH			20
#define SECURITY_DESCRIPTOR_REVISION			 1
#define SECURITY_DESCRIPTOR_REVISION1			 1
#define SE_PRIVILEGE_ENABLED_BY_DEFAULT 		 1
#define SE_PRIVILEGE_ENABLED				 2
#define SE_PRIVILEGE_USED_FOR_ACCESS		0x80000000
#define PRIVILEGE_SET_ALL_NECESSARY			 1
#define SECURITY_MAX_IMPERSONATION_LEVEL	SecurityDelegation
#define DEFAULT_IMPERSONATION_LEVEL		SecurityImpersonation
#define SECURITY_DYNAMIC_TRACKING		      TRUE
#define SECURITY_STATIC_TRACKING		     FALSE
/* also in ddk/ntifs.h */
#define TOKEN_ASSIGN_PRIMARY			   (0x0001)
#define TOKEN_DUPLICATE 			   (0x0002)
#define TOKEN_IMPERSONATE			   (0x0004)
#define TOKEN_QUERY				   (0x0008)
#define TOKEN_QUERY_SOURCE			   (0x0010)
#define TOKEN_ADJUST_PRIVILEGES 		   (0x0020)
#define TOKEN_ADJUST_GROUPS			   (0x0040)
#define TOKEN_ADJUST_DEFAULT			   (0x0080)

#define TOKEN_ALL_ACCESS     \
  ( STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE      | \
    TOKEN_IMPERSONATE        | TOKEN_QUERY          | TOKEN_QUERY_SOURCE   | \
    TOKEN_ADJUST_PRIVILEGES  | TOKEN_ADJUST_GROUPS  | TOKEN_ADJUST_DEFAULT \
  )
#define TOKEN_READ	  ( STANDARD_RIGHTS_READ | TOKEN_QUERY )
#define TOKEN_WRITE	  \
  ( STANDARD_RIGHTS_WRITE | TOKEN_ADJUST_PRIVILEGES | \
    TOKEN_ADJUST_GROUPS   | TOKEN_ADJUST_DEFAULT    \
  )
#define TOKEN_EXECUTE	  ( STANDARD_RIGHTS_EXECUTE )

#define TOKEN_SOURCE_LENGTH				 8
#if (_WIN32_WINNT >= 0x0600)
#define TOKEN_MANDATORY_POLICY_OFF			 0
#define TOKEN_MANDATORY_POLICY_NO_WRITE_UP		 1
#define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN		 2
#define TOKEN_MANDATORY_POLICY_VALID_MASK		 3
#endif
/* end ddk/ntifs.h */
#define DLL_PROCESS_DETACH				 0
#define DLL_PROCESS_ATTACH				 1
#define DLL_THREAD_ATTACH				 2
#define DLL_THREAD_DETACH				 3
#define DBG_CONTINUE				   0x10002
#define DBG_TERMINATE_THREAD			0x40010003
#define DBG_TERMINATE_PROCESS			0x40010004
#define DBG_CONTROL_C				0x40010005
#define DBG_CONTROL_BREAK			0x40010008
#define DBG_EXCEPTION_NOT_HANDLED		0x80010001
#define TAPE_ABSOLUTE_POSITION				 0
#define TAPE_LOGICAL_POSITION				 1
#define TAPE_PSEUDO_LOGICAL_POSITION			 2
#define TAPE_REWIND					 0
#define TAPE_ABSOLUTE_BLOCK				 1
#define TAPE_LOGICAL_BLOCK				 2
#define TAPE_PSEUDO_LOGICAL_BLOCK			 3
#define TAPE_SPACE_END_OF_DATA				 4
#define TAPE_SPACE_RELATIVE_BLOCKS			 5
#define TAPE_SPACE_FILEMARKS				 6
#define TAPE_SPACE_SEQUENTIAL_FMKS			 7
#define TAPE_SPACE_SETMARKS				 8
#define TAPE_SPACE_SEQUENTIAL_SMKS			 9
#define TAPE_DRIVE_FIXED				 1
#define TAPE_DRIVE_SELECT				 2
#define TAPE_DRIVE_INITIATOR				 4
#define TAPE_DRIVE_ERASE_SHORT				16
#define TAPE_DRIVE_ERASE_LONG				32
#define TAPE_DRIVE_ERASE_BOP_ONLY			64
#define TAPE_DRIVE_ERASE_IMMEDIATE		       128
#define TAPE_DRIVE_TAPE_CAPACITY		       256
#define TAPE_DRIVE_TAPE_REMAINING		       512
#define TAPE_DRIVE_FIXED_BLOCK			      1024
#define TAPE_DRIVE_VARIABLE_BLOCK		      2048
#define TAPE_DRIVE_WRITE_PROTECT		      4096
#define TAPE_DRIVE_EOT_WZ_SIZE			      8192
#define TAPE_DRIVE_ECC				   0x10000
#define TAPE_DRIVE_COMPRESSION			   0x20000
#define TAPE_DRIVE_PADDING			   0x40000
#define TAPE_DRIVE_REPORT_SMKS			   0x80000
#define TAPE_DRIVE_GET_ABSOLUTE_BLK		  0x100000
#define TAPE_DRIVE_GET_LOGICAL_BLK		  0x200000
#define TAPE_DRIVE_SET_EOT_WZ_SIZE		  0x400000
#define TAPE_DRIVE_EJECT_MEDIA			 0x1000000
#define TAPE_DRIVE_CLEAN_REQUESTS		 0x2000000
#define TAPE_DRIVE_SET_CMP_BOP_ONLY		 0x4000000
#define TAPE_DRIVE_RESERVED_BIT 		0x80000000
#define TAPE_DRIVE_LOAD_UNLOAD			0x80000001
#define TAPE_DRIVE_TENSION			0x80000002
#define TAPE_DRIVE_LOCK_UNLOCK			0x80000004
#define TAPE_DRIVE_REWIND_IMMEDIATE		0x80000008
#define TAPE_DRIVE_SET_BLOCK_SIZE		0x80000010
#define TAPE_DRIVE_LOAD_UNLD_IMMED		0x80000020
#define TAPE_DRIVE_TENSION_IMMED		0x80000040
#define TAPE_DRIVE_LOCK_UNLK_IMMED		0x80000080
#define TAPE_DRIVE_SET_ECC			0x80000100
#define TAPE_DRIVE_SET_COMPRESSION		0x80000200
#define TAPE_DRIVE_SET_PADDING			0x80000400
#define TAPE_DRIVE_SET_REPORT_SMKS		0x80000800
#define TAPE_DRIVE_ABSOLUTE_BLK 		0x80001000
#define TAPE_DRIVE_ABS_BLK_IMMED		0x80002000
#define TAPE_DRIVE_LOGICAL_BLK			0x80004000
#define TAPE_DRIVE_LOG_BLK_IMMED		0x80008000
#define TAPE_DRIVE_END_OF_DATA			0x80010000
#define TAPE_DRIVE_RELATIVE_BLKS		0x80020000
#define TAPE_DRIVE_FILEMARKS			0x80040000
#define TAPE_DRIVE_SEQUENTIAL_FMKS		0x80080000
#define TAPE_DRIVE_SETMARKS			0x80100000
#define TAPE_DRIVE_SEQUENTIAL_SMKS		0x80200000
#define TAPE_DRIVE_REVERSE_POSITION		0x80400000
#define TAPE_DRIVE_SPACE_IMMEDIATE		0x80800000
#define TAPE_DRIVE_WRITE_SETMARKS		0x81000000
#define TAPE_DRIVE_WRITE_FILEMARKS		0x82000000
#define TAPE_DRIVE_WRITE_SHORT_FMKS		0x84000000
#define TAPE_DRIVE_WRITE_LONG_FMKS		0x88000000
#define TAPE_DRIVE_WRITE_MARK_IMMED		0x90000000
#define TAPE_DRIVE_FORMAT			0xA0000000
#define TAPE_DRIVE_FORMAT_IMMEDIATE		0xC0000000
#define TAPE_DRIVE_HIGH_FEATURES		0x80000000
#define TAPE_FIXED_PARTITIONS				 0
#define TAPE_INITIATOR_PARTITIONS			 2
#define TAPE_SELECT_PARTITIONS				 1
#define TAPE_FILEMARKS					 1
#define TAPE_LONG_FILEMARKS				 3
#define TAPE_SETMARKS					 0
#define TAPE_SHORT_FILEMARKS				 2
#define TAPE_ERASE_LONG 				 1
#define TAPE_ERASE_SHORT				 0
#define TAPE_LOAD					 0
#define TAPE_UNLOAD					 1
#define TAPE_TENSION					 2
#define TAPE_LOCK					 3
#define TAPE_UNLOCK					 4
#define TAPE_FORMAT					 5
#if (_WIN32_WINNT >= 0x0500)
#define VER_MINORVERSION			 0x0000001
#define VER_MAJORVERSION			 0x0000002
#define VER_BUILDNUMBER 			 0x0000004
#define VER_PLATFORMID				 0x0000008
#define VER_SERVICEPACKMINOR			 0x0000010
#define VER_SERVICEPACKMAJOR			 0x0000020
#define VER_SUITENAME				 0x0000040
#define VER_PRODUCT_TYPE			 0x0000080
#define VER_EQUAL					 1
#define VER_GREATER					 2
#define VER_GREATER_EQUAL				 3
#define VER_LESS					 4
#define VER_LESS_EQUAL					 5
#define VER_AND 					 6
#define VER_OR						 7
#endif
#define VER_PLATFORM_WIN32s				 0
#define VER_PLATFORM_WIN32_WINDOWS			 1
#define VER_PLATFORM_WIN32_NT				 2
#define VER_NT_WORKSTATION				 1
#define VER_NT_DOMAIN_CONTROLLER			 2
#define VER_NT_SERVER					 3
#define VER_SUITE_SMALLBUSINESS 			 1
#define VER_SUITE_ENTERPRISE				 2
#define VER_SUITE_BACKOFFICE				 4
#define VER_SUITE_TERMINAL				16
#define VER_SUITE_SMALLBUSINESS_RESTRICTED		32
#define VER_SUITE_EMBEDDEDNT				64
#define VER_SUITE_DATACENTER			       128
#define VER_SUITE_SINGLEUSERTS			       256
#define VER_SUITE_PERSONAL			       512
#define VER_SUITE_BLADE 			      1024
#define VER_SUITE_STORAGE_SERVER		      8192
#define VER_SUITE_COMPUTE_SERVER		     16384
#define WT_EXECUTEDEFAULT			0x00000000
#define WT_EXECUTEINIOTHREAD			0x00000001
#define WT_EXECUTEINWAITTHREAD			0x00000004
#define WT_EXECUTEONLYONCE			0x00000008
#define WT_EXECUTELONGFUNCTION			0x00000010
#define WT_EXECUTEINTIMERTHREAD 		0x00000020
#define WT_EXECUTEINPERSISTENTTHREAD		0x00000080
#define WT_TRANSFER_IMPERSONATION		0x00000100
#if (_WIN32_WINNT >= 0x0501)
#define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION 	 1
#define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION		 2
#define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION	 3
#define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION	 4
#define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION	 5
#define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION  6
#define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION	 7
#define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES		 9
#endif /* (_WIN32_WINNT >= 0x0501) */

#define BTYPE(x)	((x)&N_BTMASK)
#define ISPTR(x)	(((x)&N_TMASK)==(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT))
#define ISFCN(x)	(((x)&N_TMASK)==(IMAGE_SYM_DTYPE_FUNCTION<<N_BTSHFT))
#define ISARY(x)	(((x)&N_TMASK)==(IMAGE_SYM_DTYPE_ARRAY<<N_BTSHFT))
#define ISTAG(x)	((x)==IMAGE_SYM_CLASS_STRUCT_TAG||(x)==IMAGE_SYM_CLASS_UNION_TAG||(x)==IMAGE_SYM_CLASS_ENUM_TAG)
#define INCREF(x)	((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
#define DECREF(x)	((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))

#define TLS_MINIMUM_AVAILABLE				64
#define REPARSE_DATA_BUFFER_HEADER_SIZE  FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE  FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE	     16384
#define IO_REPARSE_TAG_RESERVED_ZERO			 0
#define IO_REPARSE_TAG_RESERVED_ONE			 1
#define IO_REPARSE_TAG_RESERVED_RANGE	IO_REPARSE_TAG_RESERVED_ONE
#define IsReparseTagMicrosoft(x)	   ((x)&0x80000000)
#define IsReparseTagHighLatency(x)	   ((x)&0x40000000)
#define IsReparseTagNameSurrogate(x)	   ((x)&0x20000000)
#define IO_REPARSE_TAG_VALID_VALUES		0xE000FFFF
#define IsReparseTagValid(x)  (!((x)&~IO_REPARSE_TAG_VALID_VALUES)&&((x)>IO_REPARSE_TAG_RESERVED_RANGE))
#define IO_REPARSE_TAG_SYMBOLIC_LINK  IO_REPARSE_TAG_RESERVED_ZERO
#define IO_REPARSE_TAG_MOUNT_POINT		0xA0000003
#define IO_REPARSE_TAG_SYMLINK			0xA000000C

#define WT_SET_MAX_THREADPOOL_THREADS(Flags,Limit)  ((Flags)|=(Limit)<<16)
#ifndef RC_INVOKED

_BEGIN_C_DECLS

typedef DWORD ACCESS_MASK, *PACCESS_MASK;

#ifdef _GUID_DEFINED
# warning _GUID_DEFINED is deprecated, use GUID_DEFINED instead
#endif

#if ! (defined _GUID_DEFINED || defined GUID_DEFINED) /* also defined in basetyps.h */
#define GUID_DEFINED
typedef struct _GUID
{ unsigned long 	Data1;
  unsigned short	Data2;
  unsigned short	Data3;
  unsigned char 	Data4[8];
} GUID, *REFGUID, *LPGUID;
#define SYSTEM_LUID			      { 0x3e7, 0x0 }
#endif /* GUID_DEFINED */

typedef struct _GENERIC_MAPPING
{ ACCESS_MASK		GenericRead;
  ACCESS_MASK		GenericWrite;
  ACCESS_MASK		GenericExecute;
  ACCESS_MASK		GenericAll;
} GENERIC_MAPPING, *PGENERIC_MAPPING;

typedef struct _ACE_HEADER
{ BYTE			AceType;
  BYTE			AceFlags;
  WORD			AceSize;
} ACE_HEADER, *PACE_HEADER;

typedef struct _ACCESS_ALLOWED_ACE
{ ACE_HEADER		Header;
  ACCESS_MASK		Mask;
  DWORD 		SidStart;
} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE;

typedef struct _ACCESS_DENIED_ACE
{ ACE_HEADER		Header;
  ACCESS_MASK		Mask;
  DWORD 		SidStart;
} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;

typedef struct _SYSTEM_AUDIT_ACE
{ ACE_HEADER		Header;
  ACCESS_MASK		Mask;
  DWORD 		SidStart;
} SYSTEM_AUDIT_ACE;
typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;

typedef struct _SYSTEM_ALARM_ACE
{ ACE_HEADER		Header;
  ACCESS_MASK		Mask;
  DWORD 		SidStart;
} SYSTEM_ALARM_ACE, *PSYSTEM_ALARM_ACE;

typedef struct _ACCESS_ALLOWED_OBJECT_ACE
{ ACE_HEADER		Header;
  ACCESS_MASK		Mask;
  DWORD 		Flags;
  GUID			ObjectType;
  GUID			InheritedObjectType;
  DWORD 		SidStart;
} ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;

typedef struct _ACCESS_DENIED_OBJECT_ACE
{ ACE_HEADER		Header;
  ACCESS_MASK		Mask;
  DWORD 		Flags;
  GUID			ObjectType;
  GUID			InheritedObjectType;
  DWORD 		SidStart;
} ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;

typedef struct _SYSTEM_AUDIT_OBJECT_ACE
{ ACE_HEADER		Header;
  ACCESS_MASK		Mask;
  DWORD 		Flags;
  GUID			ObjectType;
  GUID			InheritedObjectType;
  DWORD 		SidStart;
} SYSTEM_AUDIT_OBJECT_ACE, *PSYSTEM_AUDIT_OBJECT_ACE;

typedef struct _SYSTEM_ALARM_OBJECT_ACE
{ ACE_HEADER		Header;
  ACCESS_MASK		Mask;
  DWORD 		Flags;
  GUID			ObjectType;
  GUID			InheritedObjectType;
  DWORD 		SidStart;
} SYSTEM_ALARM_OBJECT_ACE, *PSYSTEM_ALARM_OBJECT_ACE;

typedef struct _ACL
{ BYTE			AclRevision;
  BYTE			Sbz1;
  WORD			AclSize;
  WORD			AceCount;
  WORD			Sbz2;
} ACL, *PACL;

typedef struct _ACL_REVISION_INFORMATION
{ DWORD 		AclRevision;
} ACL_REVISION_INFORMATION;

typedef struct _ACL_SIZE_INFORMATION
{ DWORD 		AceCount;
  DWORD 		AclBytesInUse;
  DWORD 		AclBytesFree;
} ACL_SIZE_INFORMATION;

/* FIXME: add more machines */
#ifdef _X86_
#define SIZE_OF_80387_REGISTERS 			80
#define CONTEXT_i386				   0x10000
#define CONTEXT_i486				   0x10000
#define CONTEXT_CONTROL 		  (CONTEXT_i386|0x00000001L)
#define CONTEXT_INTEGER 		  (CONTEXT_i386|0x00000002L)
#define CONTEXT_SEGMENTS		  (CONTEXT_i386|0x00000004L)
#define CONTEXT_FLOATING_POINT		  (CONTEXT_i386|0x00000008L)
#define CONTEXT_DEBUG_REGISTERS 	  (CONTEXT_i386|0x00000010L)
#define CONTEXT_EXTENDED_REGISTERS	  (CONTEXT_i386|0x00000020L)

#define CONTEXT_FULL		(CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)

#define MAXIMUM_SUPPORTED_EXTENSION		       512

typedef struct _FLOATING_SAVE_AREA
{ DWORD 		ControlWord;
  DWORD 		StatusWord;
  DWORD 		TagWord;
  DWORD 		ErrorOffset;
  DWORD 		ErrorSelector;
  DWORD 		DataOffset;
  DWORD 		DataSelector;
  BYTE			RegisterArea[80];
  DWORD 		Cr0NpxState;
} FLOATING_SAVE_AREA;

typedef struct _CONTEXT
{ DWORD 		ContextFlags;
  DWORD 		Dr0;
  DWORD 		Dr1;
  DWORD 		Dr2;
  DWORD 		Dr3;
  DWORD 		Dr6;
  DWORD 		Dr7;
  FLOATING_SAVE_AREA	FloatSave;
  DWORD 		SegGs;
  DWORD 		SegFs;
  DWORD 		SegEs;
  DWORD 		SegDs;
  DWORD 		Edi;
  DWORD 		Esi;
  DWORD 		Ebx;
  DWORD 		Edx;
  DWORD 		Ecx;
  DWORD 		Eax;
  DWORD 		Ebp;
  DWORD 		Eip;
  DWORD 		SegCs;
  DWORD 		EFlags;
  DWORD 		Esp;
  DWORD 		SegSs;
  BYTE			ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
} CONTEXT;

#elif defined(_M_PPC)
#define CONTEXT_CONTROL 				 1L
#define CONTEXT_FLOATING_POINT				 2L
#define CONTEXT_INTEGER 				 4L
#define CONTEXT_DEBUG_REGISTERS 			 8L
#define CONTEXT_FULL		(CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER)

typedef struct
{ double		Fpr0;
  double		Fpr1;
  double		Fpr2;
  double		Fpr3;
  double		Fpr4;
  double		Fpr5;
  double		Fpr6;
  double		Fpr7;
  double		Fpr8;
  double		Fpr9;
  double		Fpr10;
  double		Fpr11;
  double		Fpr12;
  double		Fpr13;
  double		Fpr14;
  double		Fpr15;
  double		Fpr16;
  double		Fpr17;
  double		Fpr18;
  double		Fpr19;
  double		Fpr20;
  double		Fpr21;
  double		Fpr22;
  double		Fpr23;
  double		Fpr24;
  double		Fpr25;
  double		Fpr26;
  double		Fpr27;
  double		Fpr28;
  double		Fpr29;
  double		Fpr30;
  double		Fpr31;
  double		Fpscr;
  DWORD 		Gpr0;
  DWORD 		Gpr1;
  DWORD 		Gpr2;
  DWORD 		Gpr3;
  DWORD 		Gpr4;
  DWORD 		Gpr5;
  DWORD 		Gpr6;
  DWORD 		Gpr7;
  DWORD 		Gpr8;
  DWORD 		Gpr9;
  DWORD 		Gpr10;
  DWORD 		Gpr11;
  DWORD 		Gpr12;
  DWORD 		Gpr13;
  DWORD 		Gpr14;
  DWORD 		Gpr15;
  DWORD 		Gpr16;
  DWORD 		Gpr17;
  DWORD 		Gpr18;
  DWORD 		Gpr19;
  DWORD 		Gpr20;
  DWORD 		Gpr21;
  DWORD 		Gpr22;
  DWORD 		Gpr23;
  DWORD 		Gpr24;
  DWORD 		Gpr25;
  DWORD 		Gpr26;
  DWORD 		Gpr27;
  DWORD 		Gpr28;
  DWORD 		Gpr29;
  DWORD 		Gpr30;
  DWORD 		Gpr31;
  DWORD 		Cr;
  DWORD 		Xer;
  DWORD 		Msr;
  DWORD 		Iar;
  DWORD 		Lr;
  DWORD 		Ctr;
  DWORD 		ContextFlags;
  DWORD 		Fill[3];
  DWORD 		Dr0;
  DWORD 		Dr1;
  DWORD 		Dr2;
  DWORD 		Dr3;
  DWORD 		Dr4;
  DWORD 		Dr5;
  DWORD 		Dr6;
  DWORD 		Dr7;
} CONTEXT;

#elif defined(_M_ALPHA)
#define CONTEXT_ALPHA				   0x20000
#define CONTEXT_CONTROL 		      (CONTEXT_ALPHA|1L)
#define CONTEXT_FLOATING_POINT		      (CONTEXT_ALPHA|2L)
#define CONTEXT_INTEGER 		      (CONTEXT_ALPHA|4L)
#define CONTEXT_FULL		(CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER)

typedef struct _CONTEXT
{ ULONGLONG		FltF0;
  ULONGLONG		FltF1;
  ULONGLONG		FltF2;
  ULONGLONG		FltF3;
  ULONGLONG		FltF4;
  ULONGLONG		FltF5;
  ULONGLONG		FltF6;
  ULONGLONG		FltF7;
  ULONGLONG		FltF8;
  ULONGLONG		FltF9;
  ULONGLONG		FltF10;
  ULONGLONG		FltF11;
  ULONGLONG		FltF12;
  ULONGLONG		FltF13;
  ULONGLONG		FltF14;
  ULONGLONG		FltF15;
  ULONGLONG		FltF16;
  ULONGLONG		FltF17;
  ULONGLONG		FltF18;
  ULONGLONG		FltF19;
  ULONGLONG		FltF20;
  ULONGLONG		FltF21;
  ULONGLONG		FltF22;
  ULONGLONG		FltF23;
  ULONGLONG		FltF24;
  ULONGLONG		FltF25;
  ULONGLONG		FltF26;
  ULONGLONG		FltF27;
  ULONGLONG		FltF28;
  ULONGLONG		FltF29;
  ULONGLONG		FltF30;
  ULONGLONG		FltF31;
  ULONGLONG		IntV0;
  ULONGLONG		IntT0;
  ULONGLONG		IntT1;
  ULONGLONG		IntT2;
  ULONGLONG		IntT3;
  ULONGLONG		IntT4;
  ULONGLONG		IntT5;
  ULONGLONG		IntT6;
  ULONGLONG		IntT7;
  ULONGLONG		IntS0;
  ULONGLONG		IntS1;
  ULONGLONG		IntS2;
  ULONGLONG		IntS3;
  ULONGLONG		IntS4;
  ULONGLONG		IntS5;
  ULONGLONG		IntFp;
  ULONGLONG		IntA0;
  ULONGLONG		IntA1;
  ULONGLONG		IntA2;
  ULONGLONG		IntA3;
  ULONGLONG		IntA4;
  ULONGLONG		IntA5;
  ULONGLONG		IntT8;
  ULONGLONG		IntT9;
  ULONGLONG		IntT10;
  ULONGLONG		IntT11;
  ULONGLONG		IntRa;
  ULONGLONG		IntT12;
  ULONGLONG		IntAt;
  ULONGLONG		IntGp;
  ULONGLONG		IntSp;
  ULONGLONG		IntZero;
  ULONGLONG		Fpcr;
  ULONGLONG		SoftFpcr;
  ULONGLONG		Fir;
  DWORD 		Psr;
  DWORD 		ContextFlags;
  DWORD 		Fill[4];
} CONTEXT;

#elif defined(SHx)
/* These are the debug or break registers on the SH3 */
typedef struct _DEBUG_REGISTERS
{ ULONG 		BarA;
  UCHAR 		BasrA;
  UCHAR 		BamrA;
  USHORT		BbrA;
  ULONG 		BarB;
  UCHAR 		BasrB;
  UCHAR 		BamrB;
  USHORT		BbrB;
  ULONG 		BdrB;
  ULONG 		BdmrB;
  USHORT		Brcr;
  USHORT		Align;
} DEBUG_REGISTERS, *PDEBUG_REGISTERS;

/* The following flags control the contents of the CONTEXT structure. */

#define CONTEXT_SH3				0x00000040
#define CONTEXT_SH4				0x000000c0	/* CONTEXT_SH3 | 0x80 - must contain the SH3 bits */

#ifdef SH3
#define CONTEXT_CONTROL 		(CONTEXT_SH3 | 0x00000001L)
#define CONTEXT_INTEGER 		(CONTEXT_SH3 | 0x00000002L)
#define CONTEXT_DEBUG_REGISTERS 	(CONTEXT_SH3 | 0x00000008L)
#define CONTEXT_FULL			(CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_DEBUG_REGISTERS)
#else	/* SH4 */
#define CONTEXT_CONTROL 		(CONTEXT_SH4 | 0x00000001L)
#define CONTEXT_INTEGER 		(CONTEXT_SH4 | 0x00000002L)
#define CONTEXT_DEBUG_REGISTERS 	(CONTEXT_SH4 | 0x00000008L)
#define CONTEXT_FLOATING_POINT		(CONTEXT_SH4 | 0x00000004L)
#define CONTEXT_FULL			(CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_DEBUG_REGISTERS | CONTEXT_FLOATING_POINT)
#endif

/* Context Frame
 * -------------
 *
 * This frame is used to store a limited processor context into the
 * thread structure for CPUs which have no floating point support.
 */
typedef struct _CONTEXT
{ /* The flags values within this structure control the contents
   * of a CONTEXT record.
   *
   * If the context record is used as an input parameter, then
   * for each portion of the context record controlled by a flag
   * whose value is set, it is assumed that that portion of the
   * context record contains valid context. If the context record
   * is being used to modify a thread's context, then only that
   * portion of the threads context will be modified.
   *
   * If the context record is used as an IN OUT parameter to
   * capture the context of a thread, then only those portions
   * of the thread's context corresponding to set flags will be
   * returned.
   *
   * The context record is never used as an OUT only parameter.
   */
  ULONG 		ContextFlags;
  /*
   * This section is specified/returned if the ContextFlags word
   * contains the flag CONTEXT_INTEGER.
   *
   * N.B. The registers RA and R15 are defined in this section,
   * but are considered part of the control context rather than
   * part of the integer context.
   */
  ULONG 		PR;
  ULONG 		MACH;
  ULONG 		MACL;
  ULONG 		GBR;
  ULONG 		R0;
  ULONG 		R1;
  ULONG 		R2;
  ULONG 		R3;
  ULONG 		R4;
  ULONG 		R5;
  ULONG 		R6;
  ULONG 		R7;
  ULONG 		R8;
  ULONG 		R9;
  ULONG 		R10;
  ULONG 		R11;
  ULONG 		R12;
  ULONG 		R13;
  ULONG 		R14;
  ULONG 		R15;
  /*
   * This section is specified/returned if the ContextFlags
   * word contains the flag CONTEXT_CONTROL.
   *
   * N.B. The registers r15 and ra are defined in the integer
   * section, but are considered part of the control context
   * rather than part of the integer context.
   */
  ULONG 		Fir;
  ULONG 		Psr;
#if !defined(SH3e) && !defined(SH4)
  ULONG 		OldStuff[2];
  DEBUG_REGISTERS	DebugRegisters;
#else
  ULONG 		Fpscr;
  ULONG 		Fpul;
  ULONG 		FRegs[16];
#if defined(SH4)
  ULONG 		xFRegs[16];
#endif
#endif
} CONTEXT;

#elif defined(_M_MRX000)	/* MIPS */

/* The following flags control the contents of the CONTEXT structure.
 */
#define CONTEXT_R4000				0x00010000    /* r4000 context */

#define CONTEXT_CONTROL 		(CONTEXT_R4000 | 0x00000001L)
#define CONTEXT_FLOATING_POINT		(CONTEXT_R4000 | 0x00000002L)
#define CONTEXT_INTEGER 		(CONTEXT_R4000 | 0x00000004L)

#define CONTEXT_FULL		(CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)

/* Context Frame
 * -------------
 *
 * N.B. This frame must be exactly a multiple of 16 bytes in
 * length; it has a several purposes:--
 *
 *   1) it is used as an argument to NtContinue;
 *   2) it is used to constuct a call frame for APC delivery;
 *   3) it is used to construct a call frame for exception
 *      dispatching in user mode;
 *   4) it is used in user level thread creation routines.
 *
 * The layout of the record conforms to a standard call frame.
 */
typedef struct _CONTEXT
{ /* This section is always present and is used as an argument
   * build area.
   */
  DWORD 		Argument[4];
  /*
   * This section is specified/returned if the ContextFlags word
   * contains the flag CONTEXT_FLOATING_POINT.
   */
  DWORD 		FltF0;
  DWORD 		FltF1;
  DWORD 		FltF2;
  DWORD 		FltF3;
  DWORD 		FltF4;
  DWORD 		FltF5;
  DWORD 		FltF6;
  DWORD 		FltF7;
  DWORD 		FltF8;
  DWORD 		FltF9;
  DWORD 		FltF10;
  DWORD 		FltF11;
  DWORD 		FltF12;
  DWORD 		FltF13;
  DWORD 		FltF14;
  DWORD 		FltF15;
  DWORD 		FltF16;
  DWORD 		FltF17;
  DWORD 		FltF18;
  DWORD 		FltF19;
  DWORD 		FltF20;
  DWORD 		FltF21;
  DWORD 		FltF22;
  DWORD 		FltF23;
  DWORD 		FltF24;
  DWORD 		FltF25;
  DWORD 		FltF26;
  DWORD 		FltF27;
  DWORD 		FltF28;
  DWORD 		FltF29;
  DWORD 		FltF30;
  DWORD 		FltF31;
  /*
   * This section is specified/returned if the ContextFlags word
   * contains the flag CONTEXT_INTEGER.
   *
   * N.B. The registers gp, sp, and ra are defined in this section,
   * but are considered part of the control context rather than part
   * of the integer context.
   *
   * N.B. Register zero is not stored in the frame.
   */
  DWORD 		IntZero;
  DWORD 		IntAt;
  DWORD 		IntV0;
  DWORD 		IntV1;
  DWORD 		IntA0;
  DWORD 		IntA1;
  DWORD 		IntA2;
  DWORD 		IntA3;
  DWORD 		IntT0;
  DWORD 		IntT1;
  DWORD 		IntT2;
  DWORD 		IntT3;
  DWORD 		IntT4;
  DWORD 		IntT5;
  DWORD 		IntT6;
  DWORD 		IntT7;
  DWORD 		IntS0;
  DWORD 		IntS1;
  DWORD 		IntS2;
  DWORD 		IntS3;
  DWORD 		IntS4;
  DWORD 		IntS5;
  DWORD 		IntS6;
  DWORD 		IntS7;
  DWORD 		IntT8;
  DWORD 		IntT9;
  DWORD 		IntK0;
  DWORD 		IntK1;
  DWORD 		IntGp;
  DWORD 		IntSp;
  DWORD 		IntS8;
  DWORD 		IntRa;
  DWORD 		IntLo;
  DWORD 		IntHi;
  /*
   * This section is specified/returned if the ContextFlags word
   * contains the flag CONTEXT_FLOATING_POINT.
   */
  DWORD 		Fsr;
  /*
   * This section is specified/returned if the ContextFlags word
   * contains the flag CONTEXT_CONTROL.
   *
   * N.B. The registers gp, sp, and ra are defined in the integer
   * section, but are considered part of the control context rather
   * than part of the integer context.
   */
  DWORD 		Fir;
  DWORD 		Psr;
  /*
   * The bits within the following flag control the contents of
   * a CONTEXT record.  If the context record is used as an input
   * parameter, then for each portion of the context record which is
   * controlled by a flag bit whose value is set, it is assumed that
   * the associated portion of the context record specifies valid
   * context.  If the context record is being used to modify a
   * thread's context, then only that portion of the thread's
   * context will be modified.
   *
   * If the context record is used as an IN OUT parameter, to
   * capture the context of a thread, then only those portions of
   * the thread's context corresponding to flag bits which have
   * been set will be returned.
   *
   * The context record is never used as an OUT only parameter.
   */
  DWORD 		ContextFlags;
  DWORD 		Fill[2];
} CONTEXT;

#elif defined(_M_ARM)
/* The following flags control the contents of the CONTEXT structure.
 */
#define CONTEXT_ARM				0x0000040
#define CONTEXT_CONTROL 		(CONTEXT_ARM | 0x00000001L)
#define CONTEXT_INTEGER 		(CONTEXT_ARM | 0x00000002L)

#define CONTEXT_FULL		    (CONTEXT_CONTROL | CONTEXT_INTEGER)

typedef struct _CONTEXT
{ /* The bit values within this flag control the contents of
   * a CONTEXT record.
   *
   * If the context record is used as an input parameter, then
   * for each portion of the context record controlled by a bit
   * flag which is set, it is assumed that the associated portion
   * of the context record contains valid context.  If the context
   * record is being used to modify a thread's context, then only
   * that portion of the thread's context will be modified.
   *
   * If the context record is used as an IN OUT parameter to,
   * capture the context of a thread, then only those portions
   * of the thread's context corresponding to flag bits which
   * have been set will be returned.
   *
   * The context record is never used as an OUT only parameter.
   */
  ULONG 		ContextFlags;
  /*
   * This section is specified/returned if the ContextFlags word
   * contains the flag CONTEXT_INTEGER.
   */
  ULONG 		R0;
  ULONG 		R1;
  ULONG 		R2;
  ULONG 		R3;
  ULONG 		R4;
  ULONG 		R5;
  ULONG 		R6;
  ULONG 		R7;
  ULONG 		R8;
  ULONG 		R9;
  ULONG 		R10;
  ULONG 		R11;
  ULONG 		R12;
  ULONG 		Sp;
  ULONG 		Lr;
  ULONG 		Pc;
  ULONG 		Psr;
} CONTEXT;

#else
#error "undefined processor type"
#endif
typedef CONTEXT *PCONTEXT, *LPCONTEXT;

typedef struct _EXCEPTION_RECORD
{ DWORD 			ExceptionCode;
  DWORD 			ExceptionFlags;
  struct _EXCEPTION_RECORD     *ExceptionRecord;
  PVOID 			ExceptionAddress;
  DWORD 			NumberParameters;
  DWORD 			ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD;

typedef struct _EXCEPTION_POINTERS
{ PEXCEPTION_RECORD		ExceptionRecord;
  PCONTEXT			ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS, *LPEXCEPTION_POINTERS;

typedef union _LARGE_INTEGER
{ struct
  { DWORD			  LowPart;
    LONG			  HighPart;
  }				u;
#if ! defined(NONAMELESSUNION) || defined(__cplusplus)
  _ANONYMOUS_STRUCT struct
  { DWORD			LowPart;
    LONG			HighPart;
  };
#endif /* NONAMELESSUNION */
  LONGLONG			QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;

typedef union _ULARGE_INTEGER
{ struct
  { DWORD			  LowPart;
    DWORD			  HighPart;
  }				u;
#if ! defined(NONAMELESSUNION) || defined(__cplusplus)
  _ANONYMOUS_STRUCT struct
  { DWORD			LowPart;
    DWORD			HighPart;
  };
#endif /* NONAMELESSUNION */
  ULONGLONG			QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;

typedef struct _LUID
{ DWORD 		LowPart;
  LONG			HighPart;
} LUID, *PLUID;
#pragma pack(push,4)

typedef struct _LUID_AND_ATTRIBUTES
{ LUID			Luid;
  DWORD 		Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
#pragma pack(pop)
typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;

typedef struct _PRIVILEGE_SET
{ DWORD 		PrivilegeCount;
  DWORD 		Control;
  LUID_AND_ATTRIBUTES	Privilege[ANYSIZE_ARRAY];
} PRIVILEGE_SET, *PPRIVILEGE_SET;

typedef struct _SECURITY_ATTRIBUTES
{ DWORD 		nLength;
  LPVOID		lpSecurityDescriptor;
  BOOL			bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;

typedef enum _SECURITY_IMPERSONATION_LEVEL
{ SecurityAnonymous,
  SecurityIdentification,
  SecurityImpersonation,
  SecurityDelegation
} SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;
typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;

typedef struct _SECURITY_QUALITY_OF_SERVICE
{ DWORD 				Length;
  SECURITY_IMPERSONATION_LEVEL		ImpersonationLevel;
  SECURITY_CONTEXT_TRACKING_MODE	ContextTrackingMode;
  BOOLEAN				EffectiveOnly;
} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
typedef PVOID PACCESS_TOKEN;

typedef struct _SE_IMPERSONATION_STATE
{ PACCESS_TOKEN 		Token;
  BOOLEAN			CopyOnOpen;
  BOOLEAN			EffectiveOnly;
  SECURITY_IMPERSONATION_LEVEL	Level;
} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;

typedef struct _SID_IDENTIFIER_AUTHORITY
{ BYTE				Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY, *LPSID_IDENTIFIER_AUTHORITY;
typedef PVOID PSID;

typedef struct _SID
{ BYTE				Revision;
  BYTE				SubAuthorityCount;
  SID_IDENTIFIER_AUTHORITY	IdentifierAuthority;
  DWORD 			SubAuthority[ANYSIZE_ARRAY];
} SID, *PISID;

typedef struct _SID_AND_ATTRIBUTES
{ PSID			Sid;
  DWORD 		Attributes;
} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES;
typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;

#if (_WIN32_WINNT >= 0x0600)
typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY;

typedef struct _SID_AND_ATTRIBUTES_HASH
{ DWORD 		SidCount;
  PSID_AND_ATTRIBUTES	SidAttr;
  SID_HASH_ENTRY	Hash[SID_HASH_SIZE];
} SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;
#endif

typedef struct _TOKEN_SOURCE
{ CHAR			SourceName[TOKEN_SOURCE_LENGTH];
  LUID			SourceIdentifier;
} TOKEN_SOURCE, *PTOKEN_SOURCE;

typedef struct _TOKEN_CONTROL
{ LUID			TokenId;
  LUID			AuthenticationId;
  LUID			ModifiedId;
  TOKEN_SOURCE		TokenSource;
} TOKEN_CONTROL, *PTOKEN_CONTROL;

typedef struct _TOKEN_DEFAULT_DACL
{ PACL			DefaultDacl;
} TOKEN_DEFAULT_DACL, *PTOKEN_DEFAULT_DACL;

typedef struct _TOKEN_GROUPS
{ DWORD 		GroupCount;
  SID_AND_ATTRIBUTES	Groups[ANYSIZE_ARRAY];
} TOKEN_GROUPS, *PTOKEN_GROUPS, *LPTOKEN_GROUPS;

typedef struct _TOKEN_OWNER
{ PSID			Owner;
} TOKEN_OWNER, *PTOKEN_OWNER;

typedef struct _TOKEN_PRIMARY_GROUP
{ PSID			PrimaryGroup;
} TOKEN_PRIMARY_GROUP, *PTOKEN_PRIMARY_GROUP;

typedef struct _TOKEN_PRIVILEGES
{ DWORD 		PrivilegeCount;
  LUID_AND_ATTRIBUTES	Privileges[ANYSIZE_ARRAY];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES, *LPTOKEN_PRIVILEGES;

typedef enum tagTOKEN_TYPE
{ TokenPrimary		=	1,
  TokenImpersonation
} TOKEN_TYPE, *PTOKEN_TYPE;

typedef struct _TOKEN_STATISTICS
{ LUID				TokenId;
  LUID				AuthenticationId;
  LARGE_INTEGER 		ExpirationTime;
  TOKEN_TYPE			TokenType;
  SECURITY_IMPERSONATION_LEVEL	ImpersonationLevel;
  DWORD 			DynamicCharged;
  DWORD 			DynamicAvailable;
  DWORD 			GroupCount;
  DWORD 			PrivilegeCount;
  LUID ModifiedId;
} TOKEN_STATISTICS, *PTOKEN_STATISTICS;

typedef struct _TOKEN_USER
{ SID_AND_ATTRIBUTES		User;
} TOKEN_USER, *PTOKEN_USER;
#if (_WIN32_WINNT >= 0x0600)

typedef struct _TOKEN_LINKED_TOKEN
{ HANDLE			LinkedToken;
} TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN;

typedef struct _TOKEN_MANDATORY_LABEL
{ SID_AND_ATTRIBUTES		Label;
} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;

typedef struct _TOKEN_MANDATORY_POLICY
{ DWORD 			Policy;
} TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY;

typedef struct _TOKEN_ELEVATION
{ DWORD 			TokenIsElevated;
} TOKEN_ELEVATION, *PTOKEN_ELEVATION;

typedef struct _TOKEN_ACCESS_INFORMATION
{ PSID_AND_ATTRIBUTES_HASH	SidHash;
  PSID_AND_ATTRIBUTES_HASH	RestrictedSidHash;
  PTOKEN_PRIVILEGES		Privileges;
  LUID				AuthenticationId;
  TOKEN_TYPE			TokenType;
  SECURITY_IMPERSONATION_LEVEL	ImpersonationLevel;
  TOKEN_MANDATORY_POLICY	MandatoryPolicy;
  DWORD 			Flags;
} TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION;
#endif
typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;

typedef struct _SECURITY_DESCRIPTOR
{ BYTE				Revision;
  BYTE				Sbz1;
  SECURITY_DESCRIPTOR_CONTROL	Control;
  PSID				Owner;
  PSID				Group;
  PACL				Sacl;
  PACL				Dacl;
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;

typedef enum _TOKEN_INFORMATION_CLASS
{ TokenUser		=	1,
  TokenGroups,
  TokenPrivileges,
  TokenOwner,
  TokenPrimaryGroup,
  TokenDefaultDacl,
  TokenSource,
  TokenType,
  TokenImpersonationLevel,
  TokenStatistics,
  TokenRestrictedSids,
  TokenSessionId,
  TokenGroupsAndPrivileges,
  TokenSessionReference,
  TokenSandBoxInert,
  TokenAuditPolicy,
  TokenOrigin,
#if (_WIN32_WINNT >= 0x0600)
  TokenElevationType,
  TokenLinkedToken,
  TokenElevation,
  TokenHasRestrictions,
  TokenAccessInformation,
  TokenVirtualizationAllowed,
  TokenVirtualizationEnabled,
  TokenIntegrityLevel,
  TokenUIAccess,
  TokenMandatoryPolicy,
  TokenLogonSid,
#endif
  MaxTokenInfoClass
} TOKEN_INFORMATION_CLASS;

typedef enum _SID_NAME_USE
{ SidTypeUser		=	1,
  SidTypeGroup,
  SidTypeDomain,
  SidTypeAlias,
  SidTypeWellKnownGroup,
  SidTypeDeletedAccount,
  SidTypeInvalid,
  SidTypeUnknown,
  SidTypeComputer
} SID_NAME_USE, *PSID_NAME_USE;

typedef struct _QUOTA_LIMITS
{ SIZE_T		PagedPoolLimit;
  SIZE_T		NonPagedPoolLimit;
  SIZE_T		MinimumWorkingSetSize;
  SIZE_T		MaximumWorkingSetSize;
  SIZE_T		PagefileLimit;
  LARGE_INTEGER 	TimeLimit;
} QUOTA_LIMITS, *PQUOTA_LIMITS;

typedef struct _IO_COUNTERS
{ ULONGLONG		ReadOperationCount;
  ULONGLONG		WriteOperationCount;
  ULONGLONG		OtherOperationCount;
  ULONGLONG		ReadTransferCount;
  ULONGLONG		WriteTransferCount;
  ULONGLONG		OtherTransferCount;
} IO_COUNTERS, *PIO_COUNTERS;

typedef struct _FILE_NOTIFY_INFORMATION
{ DWORD 		NextEntryOffset;
  DWORD 		Action;
  DWORD 		FileNameLength;
  WCHAR 		FileName[1];
} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;

typedef struct _TAPE_ERASE
{ DWORD 		Type;
  BOOLEAN		Immediate;
} TAPE_ERASE, *PTAPE_ERASE;

typedef struct _TAPE_GET_DRIVE_PARAMETERS
{ BOOLEAN		ECC;
  BOOLEAN		Compression;
  BOOLEAN		DataPadding;
  BOOLEAN		ReportSetmarks;
  DWORD 		DefaultBlockSize;
  DWORD 		MaximumBlockSize;
  DWORD 		MinimumBlockSize;
  DWORD 		MaximumPartitionCount;
  DWORD 		FeaturesLow;
  DWORD 		FeaturesHigh;
  DWORD 		EOTWarningZoneSize;
} TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;

typedef struct _TAPE_GET_MEDIA_PARAMETERS
{ LARGE_INTEGER 	Capacity;
  LARGE_INTEGER 	Remaining;
  DWORD 		BlockSize;
  DWORD 		PartitionCount;
  BOOLEAN		WriteProtected;
} TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;

typedef struct _TAPE_GET_POSITION
{ ULONG 		Type;
  ULONG 		Partition;
  ULONG 		OffsetLow;
  ULONG 		OffsetHigh;
} TAPE_GET_POSITION, *PTAPE_GET_POSITION;

typedef struct _TAPE_PREPARE
{ DWORD 		Operation;
  BOOLEAN		Immediate;
} TAPE_PREPARE, *PTAPE_PREPARE;

typedef struct _TAPE_SET_DRIVE_PARAMETERS
{ BOOLEAN		ECC;
  BOOLEAN		Compression;
  BOOLEAN		DataPadding;
  BOOLEAN		ReportSetmarks;
  ULONG 		EOTWarningZoneSize;
} TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;

typedef struct _TAPE_SET_MEDIA_PARAMETERS
{ ULONG 		BlockSize;
} TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;

typedef struct _TAPE_SET_POSITION
{ DWORD 		Method;
  DWORD 		Partition;
  LARGE_INTEGER 	Offset;
  BOOLEAN		Immediate;
} TAPE_SET_POSITION, *PTAPE_SET_POSITION;

typedef struct _TAPE_WRITE_MARKS
{ DWORD 		Type;
  DWORD 		Count;
  BOOLEAN		Immediate;
} TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;

typedef struct _TAPE_CREATE_PARTITION
{ DWORD 		Method;
  DWORD 		Count;
  DWORD 		Size;
} TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;

typedef struct _MEMORY_BASIC_INFORMATION
{ PVOID 		BaseAddress;
  PVOID 		AllocationBase;
  DWORD 		AllocationProtect;
  DWORD 		RegionSize;
  DWORD 		State;
  DWORD 		Protect;
  DWORD 		Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

typedef struct _MESSAGE_RESOURCE_ENTRY
{ WORD			Length;
  WORD			Flags;
  BYTE			Text[1];
} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;

typedef struct _MESSAGE_RESOURCE_BLOCK
{ DWORD 		LowId;
  DWORD 		HighId;
  DWORD 		OffsetToEntries;
} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;

typedef struct _MESSAGE_RESOURCE_DATA
{ DWORD 			NumberOfBlocks;
  MESSAGE_RESOURCE_BLOCK	Blocks[1];
} MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;

typedef struct _LIST_ENTRY
{ struct _LIST_ENTRY		*Flink;
  struct _LIST_ENTRY		*Blink;
} LIST_ENTRY, *PLIST_ENTRY;

typedef struct _SINGLE_LIST_ENTRY
{ struct _SINGLE_LIST_ENTRY	*Next;
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;

#ifndef _SLIST_HEADER_
#define _SLIST_HEADER_
#define SLIST_ENTRY		SINGLE_LIST_ENTRY
#define _SLIST_ENTRY	       _SINGLE_LIST_ENTRY
#define PSLIST_ENTRY		PSINGLE_LIST_ENTRY

typedef union _SLIST_HEADER
{ ULONGLONG			Alignment;
  _ANONYMOUS_STRUCT struct
  { SLIST_ENTRY 		  Next;
    WORD			  Depth;
    WORD			  Sequence;
  }				DUMMYSTRUCTNAME;
} SLIST_HEADER, *PSLIST_HEADER;
#endif /* !_SLIST_HEADER_ */

typedef struct _RTL_CRITICAL_SECTION_DEBUG
{ WORD				Type;
  WORD				CreatorBackTraceIndex;
  struct _RTL_CRITICAL_SECTION *CriticalSection;
  LIST_ENTRY			ProcessLocksList;
  DWORD 			EntryCount;
  DWORD 			ContentionCount;
  DWORD 			Spare[2];
} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG;

typedef struct _RTL_CRITICAL_SECTION
{ PRTL_CRITICAL_SECTION_DEBUG	DebugInfo;
  LONG				LockCount;
  LONG				RecursionCount;
  HANDLE			OwningThread;
  HANDLE			LockSemaphore;
  DWORD 			Reserved;
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

typedef struct _EVENTLOGRECORD
{ DWORD 		Length;
  DWORD 		Reserved;
  DWORD 		RecordNumber;
  DWORD 		TimeGenerated;
  DWORD 		TimeWritten;
  DWORD 		EventID;
  WORD			EventType;
  WORD			NumStrings;
  WORD			EventCategory;
  WORD			ReservedFlags;
  DWORD 		ClosingRecordNumber;
  DWORD 		StringOffset;
  DWORD 		UserSidLength;
  DWORD 		UserSidOffset;
  DWORD 		DataLength;
  DWORD 		DataOffset;
} EVENTLOGRECORD, *PEVENTLOGRECORD;

typedef struct _OSVERSIONINFOA
{ DWORD 		dwOSVersionInfoSize;
  DWORD 		dwMajorVersion;
  DWORD 		dwMinorVersion;
  DWORD 		dwBuildNumber;
  DWORD 		dwPlatformId;
  CHAR			szCSDVersion[128];
} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;

typedef struct _OSVERSIONINFOW
{ DWORD 		dwOSVersionInfoSize;
  DWORD 		dwMajorVersion;
  DWORD 		dwMinorVersion;
  DWORD 		dwBuildNumber;
  DWORD 		dwPlatformId;
  WCHAR 		szCSDVersion[128];
} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW;

typedef struct _OSVERSIONINFOEXA
{ DWORD 		dwOSVersionInfoSize;
  DWORD 		dwMajorVersion;
  DWORD 		dwMinorVersion;
  DWORD 		dwBuildNumber;
  DWORD 		dwPlatformId;
  CHAR			szCSDVersion[128];
  WORD			wServicePackMajor;
  WORD			wServicePackMinor;
  WORD			wSuiteMask;
  BYTE			wProductType;
  BYTE			wReserved;
} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;

typedef struct _OSVERSIONINFOEXW
{ DWORD 		dwOSVersionInfoSize;
  DWORD 		dwMajorVersion;
  DWORD 		dwMinorVersion;
  DWORD 		dwBuildNumber;
  DWORD 		dwPlatformId;
  WCHAR szCSDVersion[128];
  WORD			wServicePackMajor;
  WORD			wServicePackMinor;
  WORD			wSuiteMask;
  BYTE			wProductType;
  BYTE			wReserved;
} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW;

#pragma pack(push,2)
typedef struct _IMAGE_VXD_HEADER
{ WORD			e32_magic;
  BYTE			e32_border;
  BYTE			e32_worder;
  DWORD 		e32_level;
  WORD			e32_cpu;
  WORD			e32_os;
  DWORD 		e32_ver;
  DWORD 		e32_mflags;
  DWORD 		e32_mpages;
  DWORD 		e32_startobj;
  DWORD 		e32_eip;
  DWORD 		e32_stackobj;
  DWORD 		e32_esp;
  DWORD 		e32_pagesize;
  DWORD 		e32_lastpagesize;
  DWORD 		e32_fixupsize;
  DWORD 		e32_fixupsum;
  DWORD 		e32_ldrsize;
  DWORD 		e32_ldrsum;
  DWORD 		e32_objtab;
  DWORD 		e32_objcnt;
  DWORD 		e32_objmap;
  DWORD 		e32_itermap;
  DWORD 		e32_rsrctab;
  DWORD 		e32_rsrccnt;
  DWORD 		e32_restab;
  DWORD 		e32_enttab;
  DWORD 		e32_dirtab;
  DWORD 		e32_dircnt;
  DWORD 		e32_fpagetab;
  DWORD 		e32_frectab;
  DWORD 		e32_impmod;
  DWORD 		e32_impmodcnt;
  DWORD 		e32_impproc;
  DWORD 		e32_pagesum;
  DWORD 		e32_datapage;
  DWORD 		e32_preload;
  DWORD 		e32_nrestab;
  DWORD 		e32_cbnrestab;
  DWORD 		e32_nressum;
  DWORD 		e32_autodata;
  DWORD 		e32_debuginfo;
  DWORD 		e32_debuglen;
  DWORD 		e32_instpreload;
  DWORD 		e32_instdemand;
  DWORD 		e32_heapsize;
  BYTE			e32_res3[12];
  DWORD 		e32_winresoff;
  DWORD 		e32_winreslen;
  WORD			e32_devid;
  WORD			e32_ddkver;
} IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
#pragma pack(pop)

#pragma pack(push,4)
typedef struct _IMAGE_FILE_HEADER
{ WORD			Machine;
  WORD			NumberOfSections;
  DWORD 		TimeDateStamp;
  DWORD 		PointerToSymbolTable;
  DWORD 		NumberOfSymbols;
  WORD			SizeOfOptionalHeader;
  WORD			Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

typedef struct _IMAGE_DATA_DIRECTORY
{ DWORD 		VirtualAddress;
  DWORD 		Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

typedef struct _IMAGE_OPTIONAL_HEADER
{ WORD			Magic;
  BYTE			MajorLinkerVersion;
  BYTE			MinorLinkerVersion;
  DWORD 		SizeOfCode;
  DWORD 		SizeOfInitializedData;
  DWORD 		SizeOfUninitializedData;
  DWORD 		AddressOfEntryPoint;
  DWORD 		BaseOfCode;
  DWORD 		BaseOfData;
  DWORD 		ImageBase;
  DWORD 		SectionAlignment;
  DWORD 		FileAlignment;
  WORD			MajorOperatingSystemVersion;
  WORD			MinorOperatingSystemVersion;
  WORD			MajorImageVersion;
  WORD			MinorImageVersion;
  WORD			MajorSubsystemVersion;
  WORD			MinorSubsystemVersion;
  DWORD 		Win32VersionValue;
  DWORD 		SizeOfImage;
  DWORD 		SizeOfHeaders;
  DWORD 		CheckSum;
  WORD			Subsystem;
  WORD			DllCharacteristics;
  DWORD 		SizeOfStackReserve;
  DWORD 		SizeOfStackCommit;
  DWORD 		SizeOfHeapReserve;
  DWORD 		SizeOfHeapCommit;
  DWORD 		LoaderFlags;
  DWORD 		NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY	DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

typedef struct _IMAGE_OPTIONAL_HEADER64
{ WORD			Magic;
  BYTE			MajorLinkerVersion;
  BYTE			MinorLinkerVersion;
  DWORD 		SizeOfCode;
  DWORD 		SizeOfInitializedData;
  DWORD 		SizeOfUninitializedData;
  DWORD 		AddressOfEntryPoint;
  DWORD 		BaseOfCode;
  ULONGLONG		ImageBase;
  DWORD 		SectionAlignment;
  DWORD 		FileAlignment;
  WORD			MajorOperatingSystemVersion;
  WORD			MinorOperatingSystemVersion;
  WORD			MajorImageVersion;
  WORD			MinorImageVersion;
  WORD			MajorSubsystemVersion;
  WORD			MinorSubsystemVersion;
  DWORD 		Win32VersionValue;
  DWORD 		SizeOfImage;
  DWORD 		SizeOfHeaders;
  DWORD 		CheckSum;
  WORD			Subsystem;
  WORD			DllCharacteristics;
  ULONGLONG		SizeOfStackReserve;
  ULONGLONG		SizeOfStackCommit;
  ULONGLONG		SizeOfHeapReserve;
  ULONGLONG		SizeOfHeapCommit;
  DWORD 		LoaderFlags;
  DWORD 		NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY	DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
#ifdef _WIN64
typedef IMAGE_OPTIONAL_HEADER64		IMAGE_OPTIONAL_HEADER;
typedef PIMAGE_OPTIONAL_HEADER64	PIMAGE_OPTIONAL_HEADER;
#else
typedef IMAGE_OPTIONAL_HEADER32		IMAGE_OPTIONAL_HEADER;
typedef PIMAGE_OPTIONAL_HEADER32	PIMAGE_OPTIONAL_HEADER;
#endif

typedef struct _IMAGE_ROM_OPTIONAL_HEADER
{ WORD			Magic;
  BYTE			MajorLinkerVersion;
  BYTE			MinorLinkerVersion;
  DWORD 		SizeOfCode;
  DWORD 		SizeOfInitializedData;
  DWORD 		SizeOfUninitializedData;
  DWORD 		AddressOfEntryPoint;
  DWORD 		BaseOfCode;
  DWORD 		BaseOfData;
  DWORD 		BaseOfBss;
  DWORD 		GprMask;
  DWORD 		CprMask[4];
  DWORD 		GpValue;
} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
#pragma pack(pop)

#pragma pack(push,2)
typedef struct _IMAGE_DOS_HEADER
{ WORD			e_magic;
  WORD			e_cblp;
  WORD			e_cp;
  WORD			e_crlc;
  WORD			e_cparhdr;
  WORD			e_minalloc;
  WORD			e_maxalloc;
  WORD			e_ss;
  WORD			e_sp;
  WORD			e_csum;
  WORD			e_ip;
  WORD			e_cs;
  WORD			e_lfarlc;
  WORD			e_ovno;
  WORD			e_res[4];
  WORD			e_oemid;
  WORD			e_oeminfo;
  WORD			e_res2[10];
  LONG			e_lfanew;
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

typedef struct _IMAGE_OS2_HEADER
{ WORD			ne_magic;
  CHAR			ne_ver;
  CHAR			ne_rev;
  WORD			ne_enttab;
  WORD			ne_cbenttab;
  LONG			ne_crc;
  WORD			ne_flags;
  WORD			ne_autodata;
  WORD			ne_heap;
  WORD			ne_stack;
  LONG			ne_csip;
  LONG			ne_sssp;
  WORD			ne_cseg;
  WORD			ne_cmod;
  WORD			ne_cbnrestab;
  WORD			ne_segtab;
  WORD			ne_rsrctab;
  WORD			ne_restab;
  WORD			ne_modtab;
  WORD			ne_imptab;
  LONG			ne_nrestab;
  WORD			ne_cmovent;
  WORD			ne_align;
  WORD			ne_cres;
  BYTE			ne_exetyp;
  BYTE			ne_flagsothers;
  WORD			ne_pretthunks;
  WORD			ne_psegrefbytes;
  WORD			ne_swaparea;
  WORD			ne_expver;
} IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
#pragma pack(pop)

#pragma pack(push,4)
typedef struct _IMAGE_NT_HEADERS
{ DWORD 			Signature;
  IMAGE_FILE_HEADER		FileHeader;
  IMAGE_OPTIONAL_HEADER32	OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

typedef struct _IMAGE_NT_HEADERS64
{ DWORD 			Signature;
  IMAGE_FILE_HEADER		FileHeader;
  IMAGE_OPTIONAL_HEADER64	OptionalHeader;
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
#ifdef _WIN64
typedef IMAGE_NT_HEADERS64	IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS64	PIMAGE_NT_HEADERS;
#else
typedef IMAGE_NT_HEADERS32	IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS32	PIMAGE_NT_HEADERS;
#endif

typedef struct _IMAGE_ROM_HEADERS
{ IMAGE_FILE_HEADER		FileHeader;
  IMAGE_ROM_OPTIONAL_HEADER	OptionalHeader;
} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;

typedef struct _IMAGE_SECTION_HEADER
{ BYTE		Name[IMAGE_SIZEOF_SHORT_NAME];
  union
  { DWORD	  PhysicalAddress;
    DWORD	  VirtualSize;
  }		Misc;
  DWORD 	VirtualAddress;
  DWORD 	SizeOfRawData;
  DWORD 	PointerToRawData;
  DWORD 	PointerToRelocations;
  DWORD 	PointerToLinenumbers;
  WORD		NumberOfRelocations;
  WORD		NumberOfLinenumbers;
  DWORD 	Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
#pragma pack(pop)

#pragma pack(push,2)
typedef struct _IMAGE_SYMBOL
{ union
  { BYTE	  ShortName[8];
    struct
    { DWORD	    Short;
      DWORD	    Long;
    }		  Name;
    PBYTE	  LongName[2];
  }		N;
  DWORD 			Value;
  SHORT 	SectionNumber;
  WORD		Type;
  BYTE		StorageClass;
  BYTE		NumberOfAuxSymbols;
} IMAGE_SYMBOL, *PIMAGE_SYMBOL;

typedef union _IMAGE_AUX_SYMBOL
{ struct
  { DWORD	  TagIndex;
    union
    { struct
      { WORD	      Linenumber;
	WORD	      Size;
      } 	    LnSz;
      DWORD	    TotalSize;
    }		  Misc;
    union
    { struct
      { DWORD	      PointerToLinenumber;
	DWORD	      PointerToNextFunction;
      } 	    Function;
      struct
      { WORD	      Dimension[4];
      } 	    Array;
    }		  FcnAry;
    WORD	  TvIndex;
  }		Sym;
  struct
  { BYTE	  Name[IMAGE_SIZEOF_SYMBOL];
  }		File;
  struct
  { DWORD	  Length;
    WORD	  NumberOfRelocations;
    WORD	  NumberOfLinenumbers;
    DWORD	  CheckSum;
    SHORT	  Number;
    BYTE	  Selection;
  }		Section;
} IMAGE_AUX_SYMBOL, *PIMAGE_AUX_SYMBOL;

typedef struct _IMAGE_COFF_SYMBOLS_HEADER
{ DWORD 	NumberOfSymbols;
  DWORD 	LvaToFirstSymbol;
  DWORD 	NumberOfLinenumbers;
  DWORD 	LvaToFirstLinenumber;
  DWORD 	RvaToFirstByteOfCode;
  DWORD 	RvaToLastByteOfCode;
  DWORD 	RvaToFirstByteOfData;
  DWORD 	RvaToLastByteOfData;
} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;

typedef struct _IMAGE_RELOCATION
{ _ANONYMOUS_UNION union
  { DWORD		  VirtualAddress;
    DWORD		  RelocCount;
  }			DUMMYUNIONNAME;
  DWORD 		SymbolTableIndex;
  WORD			Type;
} IMAGE_RELOCATION, *PIMAGE_RELOCATION;
#pragma pack(pop)

#pragma pack(push,4)
typedef struct _IMAGE_BASE_RELOCATION
{ DWORD 	VirtualAddress;
  DWORD 	SizeOfBlock;
} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
#pragma pack(pop)

#pragma pack(push,2)
typedef struct _IMAGE_LINENUMBER
{ union
  { DWORD	  SymbolTableIndex;
    DWORD	  VirtualAddress;
  }		Type;
  WORD		Linenumber;
} IMAGE_LINENUMBER, *PIMAGE_LINENUMBER;
#pragma pack(pop)

#pragma pack(push,4)
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER
{ BYTE		Name[16];
  BYTE		Date[12];
  BYTE		UserID[6];
  BYTE		GroupID[6];
  BYTE		Mode[8];
  BYTE		Size[10];
  BYTE		EndHeader[2];
} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;

typedef struct _IMAGE_EXPORT_DIRECTORY
{ DWORD 	Characteristics;
  DWORD 	TimeDateStamp;
  WORD		MajorVersion;
  WORD		MinorVersion;
  DWORD 	Name;
  DWORD 	Base;
  DWORD 	NumberOfFunctions;
  DWORD 	NumberOfNames;
  DWORD 	AddressOfFunctions;
  DWORD 	AddressOfNames;
  DWORD 	AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

typedef struct _IMAGE_IMPORT_BY_NAME
{ WORD		Hint;
  BYTE		Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

typedef struct _IMAGE_THUNK_DATA32
{ union
  { DWORD	  ForwarderString;
    DWORD	  Function;
    DWORD	  Ordinal;
    DWORD	  AddressOfData;
  }		u1;
} IMAGE_THUNK_DATA32, *PIMAGE_THUNK_DATA32;

typedef struct _IMAGE_THUNK_DATA64
{ union
  { ULONGLONG	  ForwarderString;
    ULONGLONG	  Function;
    ULONGLONG	  Ordinal;
    ULONGLONG	  AddressOfData;
  }		u1;
} IMAGE_THUNK_DATA64, *PIMAGE_THUNK_DATA64;
#ifdef __WIN64
typedef IMAGE_THUNK_DATA64	IMAGE_THUNK_DATA;
typedef PIMAGE_THUNK_DATA64	PIMAGE_THUNK_DATA;
#else
typedef IMAGE_THUNK_DATA32	IMAGE_THUNK_DATA;
typedef PIMAGE_THUNK_DATA32	PIMAGE_THUNK_DATA;
#endif

typedef struct _IMAGE_IMPORT_DESCRIPTOR
{ _ANONYMOUS_UNION union
  { DWORD		  Characteristics;
    DWORD		  OriginalFirstThunk;
  }			DUMMYUNIONNAME;
  DWORD 		TimeDateStamp;
  DWORD 		ForwarderChain;
  DWORD 		Name;
  DWORD 		FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;

typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR
{ DWORD 	TimeDateStamp;
  WORD		OffsetModuleName;
  WORD		NumberOfModuleForwarderRefs;
} IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;

typedef struct _IMAGE_BOUND_FORWARDER_REF
{ DWORD 	TimeDateStamp;
  WORD		OffsetModuleName;
  WORD		Reserved;
} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
typedef void(NTAPI *PIMAGE_TLS_CALLBACK)(PVOID,DWORD,PVOID);

typedef struct _IMAGE_TLS_DIRECTORY32
{ DWORD 	StartAddressOfRawData;
  DWORD 	EndAddressOfRawData;
  DWORD 	AddressOfIndex;
  DWORD 	AddressOfCallBacks;
  DWORD 	SizeOfZeroFill;
  DWORD 	Characteristics;
} IMAGE_TLS_DIRECTORY32, *PIMAGE_TLS_DIRECTORY32;

typedef struct _IMAGE_TLS_DIRECTORY64
{ ULONGLONG	StartAddressOfRawData;
  ULONGLONG	EndAddressOfRawData;
  ULONGLONG	AddressOfIndex;
  ULONGLONG	AddressOfCallBacks;
  DWORD 	SizeOfZeroFill;
  DWORD 	Characteristics;
} IMAGE_TLS_DIRECTORY64, *PIMAGE_TLS_DIRECTORY64;
#ifdef __WIN64
typedef IMAGE_TLS_DIRECTORY64	IMAGE_TLS_DIRECTORY;
typedef PIMAGE_TLS_DIRECTORY64	PIMAGE_TLS_DIRECTORY;
#else
typedef IMAGE_TLS_DIRECTORY32	IMAGE_TLS_DIRECTORY;
typedef PIMAGE_TLS_DIRECTORY32	PIMAGE_TLS_DIRECTORY;
#endif

typedef struct _IMAGE_RESOURCE_DIRECTORY
{ DWORD 	Characteristics;
  DWORD 	TimeDateStamp;
  WORD		MajorVersion;
  WORD		MinorVersion;
  WORD		NumberOfNamedEntries;
  WORD		NumberOfIdEntries;
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;

_ANONYMOUS_STRUCT typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY
{ _ANONYMOUS_UNION union
  { _ANONYMOUS_STRUCT struct
    { DWORD			    NameOffset	  : 31;
      DWORD			    NameIsString  :  1;
    }				  DUMMYSTRUCTNAME;
    DWORD			  Name;
    WORD			  Id;
  }				DUMMYUNIONNAME;
  _ANONYMOUS_UNION union
  { DWORD			  OffsetToData;
    _ANONYMOUS_STRUCT struct
    { DWORD			    OffsetToDirectory:31;
      DWORD			    DataIsDirectory:1;
    }				  DUMMYSTRUCTNAME2;
  }				DUMMYUNIONNAME2;
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;

typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING
{ WORD		Length;
  CHAR		NameString[1];
} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;

typedef struct _IMAGE_RESOURCE_DIR_STRING_U
{ WORD		Length;
  WCHAR 	NameString[1];
} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;

typedef struct _IMAGE_RESOURCE_DATA_ENTRY
{ DWORD 	OffsetToData;
  DWORD 	Size;
  DWORD 	CodePage;
  DWORD 	Reserved;
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;

typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY
{ DWORD 	Characteristics;
  DWORD 	TimeDateStamp;
  WORD		MajorVersion;
  WORD		MinorVersion;
  DWORD 	GlobalFlagsClear;
  DWORD 	GlobalFlagsSet;
  DWORD 	CriticalSectionDefaultTimeout;
  DWORD 	DeCommitFreeBlockThreshold;
  DWORD 	DeCommitTotalFreeThreshold;
  PVOID 	LockPrefixTable;
  DWORD 	MaximumAllocationSize;
  DWORD 	VirtualMemoryThreshold;
  DWORD 	ProcessHeapFlags;
  DWORD 	Reserved[4];
} IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;

typedef struct
{ DWORD 	Characteristics;
  DWORD 	TimeDateStamp;
  WORD		MajorVersion;
  WORD		MinorVersion;
  DWORD 	GlobalFlagsClear;
  DWORD 	GlobalFlagsSet;
  DWORD 	CriticalSectionDefaultTimeout;
  ULONGLONG	DeCommitFreeBlockThreshold;
  ULONGLONG	DeCommitTotalFreeThreshold;
  ULONGLONG	LockPrefixTable;
  ULONGLONG	MaximumAllocationSize;
  ULONGLONG	VirtualMemoryThreshold;
  ULONGLONG	ProcessAffinityMask;
  DWORD 	ProcessHeapFlags;
  WORD		CSDFlags;
  WORD		Reserved1;
  ULONGLONG	EditList;
  DWORD 	Reserved[2];
} IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;

typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY
{ DWORD 	BeginAddress;
  DWORD 	EndAddress;
  PVOID 	ExceptionHandler;
  PVOID 	HandlerData;
  DWORD 	PrologEndAddress;
} IMAGE_RUNTIME_FUNCTION_ENTRY, *PIMAGE_RUNTIME_FUNCTION_ENTRY;

typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY
{ unsigned int	FuncStart:32;
  unsigned int	PrologLen:8;
  unsigned int	FuncLen:22;
  unsigned int	ThirtyTwoBit:1;
  unsigned int	ExceptionFlag:1;
} IMAGE_CE_RUNTIME_FUNCTION_ENTRY, *PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;

typedef struct _IMAGE_DEBUG_DIRECTORY
{ DWORD 	Characteristics;
  DWORD 	TimeDateStamp;
  WORD		MajorVersion;
  WORD		MinorVersion;
  DWORD 	Type;
  DWORD 	SizeOfData;
  DWORD 	AddressOfRawData;
  DWORD 	PointerToRawData;
} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;

typedef struct _FPO_DATA
{ DWORD 	ulOffStart;
  DWORD 	cbProcSize;
  DWORD 	cdwLocals;
  WORD		cdwParams;
  WORD		cbProlog:8;
  WORD		cbRegs:3;
  WORD		fHasSEH:1;
  WORD		fUseBP:1;
  WORD		reserved:1;
  WORD		cbFrame:2;
} FPO_DATA, *PFPO_DATA;

typedef struct _IMAGE_DEBUG_MISC
{ DWORD 	DataType;
  DWORD 	Length;
  BOOLEAN	Unicode;
  BYTE		Reserved[3];
  BYTE		Data[1];
} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;

typedef struct _IMAGE_FUNCTION_ENTRY
{ DWORD 	StartingAddress;
  DWORD 	EndingAddress;
  DWORD 	EndOfPrologue;
} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;

typedef struct _IMAGE_FUNCTION_ENTRY64
{ ULONGLONG		StartingAddress;
  ULONGLONG		EndingAddress;
  _ANONYMOUS_UNION union
  { ULONGLONG		  EndOfPrologue;
    ULONGLONG		  UnwindInfoAddress;
  }			DUMMYUNIONNAME;
} IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;

typedef struct _IMAGE_SEPARATE_DEBUG_HEADER
{ WORD		Signature;
  WORD		Flags;
  WORD		Machine;
  WORD		Characteristics;
  DWORD 	TimeDateStamp;
  DWORD 	CheckSum;
  DWORD 	ImageBase;
  DWORD 	SizeOfImage;
  DWORD 	NumberOfSections;
  DWORD 	ExportedNamesSize;
  DWORD 	DebugDirectorySize;
  DWORD 	SectionAlignment;
  DWORD 	Reserved[2];
} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
#pragma pack(pop)

typedef enum _CM_SERVICE_NODE_TYPE
{ DriverType			=	SERVICE_KERNEL_DRIVER,
  FileSystemType		=	SERVICE_FILE_SYSTEM_DRIVER,
  Win32ServiceOwnProcess	=	SERVICE_WIN32_OWN_PROCESS,
  Win32ServiceShareProcess	=	SERVICE_WIN32_SHARE_PROCESS,
  AdapterType			=	SERVICE_ADAPTER,
  RecognizerType		=	SERVICE_RECOGNIZER_DRIVER
} SERVICE_NODE_TYPE;

typedef enum _CM_SERVICE_LOAD_TYPE
{ BootLoad			=	SERVICE_BOOT_START,
  SystemLoad			=	SERVICE_SYSTEM_START,
  AutoLoad			=	SERVICE_AUTO_START,
  DemandLoad			=	SERVICE_DEMAND_START,
  DisableLoad			=	SERVICE_DISABLED
} SERVICE_LOAD_TYPE;

typedef enum _CM_ERROR_CONTROL_TYPE
{ IgnoreError			=	SERVICE_ERROR_IGNORE,
  NormalError			=	SERVICE_ERROR_NORMAL,
  SevereError			=	SERVICE_ERROR_SEVERE,
  CriticalError			=	SERVICE_ERROR_CRITICAL
} SERVICE_ERROR_TYPE;

typedef struct _NT_TIB
{ struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
  PVOID 				 StackBase;
  PVOID 				 StackLimit;
  PVOID 				 SubSystemTib;
  _ANONYMOUS_UNION union
  { PVOID		  		   FiberData;
    DWORD		  		   Version;
  }					 DUMMYUNIONNAME;
  PVOID 				 ArbitraryUserPointer;
  struct _NT_TIB			*Self;
} NT_TIB, *PNT_TIB;

typedef struct _REPARSE_DATA_BUFFER
{ DWORD 			ReparseTag;
  WORD				ReparseDataLength;
  WORD				Reserved;
  _ANONYMOUS_UNION union
  { struct
    { WORD			    SubstituteNameOffset;
      WORD			    SubstituteNameLength;
      WORD			    PrintNameOffset;
      WORD			    PrintNameLength;
      ULONG			    Flags;
      WCHAR			    PathBuffer[1];
    }				  SymbolicLinkReparseBuffer;
    struct
    { WORD			    SubstituteNameOffset;
      WORD			    SubstituteNameLength;
      WORD			    PrintNameOffset;
      WORD			    PrintNameLength;
      WCHAR			    PathBuffer[1];
    }				  MountPointReparseBuffer;
    struct
    { BYTE			    DataBuffer[1];
    }				  GenericReparseBuffer;
  }				DUMMYUNIONNAME;
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;

typedef struct _REPARSE_GUID_DATA_BUFFER
{ DWORD 	ReparseTag;
  WORD		ReparseDataLength;
  WORD		Reserved;
  GUID  	ReparseGuid;
  struct
  { BYTE	  DataBuffer[1];
  }		GenericReparseBuffer;
} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;

typedef struct _REPARSE_POINT_INFORMATION
{ WORD		ReparseDataLength;
  WORD		UnparsedNameLength;
} REPARSE_POINT_INFORMATION, *PREPARSE_POINT_INFORMATION;


typedef union _FILE_SEGMENT_ELEMENT
{ PVOID64	Buffer;
  ULONGLONG	Alignment;
} FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;

/* JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags constants:
 * https://msdn.microsoft.com/en-us/library/windows/desktop/ms684147(v=vs.85).aspx
 */
#define JOB_OBJECT_LIMIT_WORKINGSET			0x0001
#define JOB_OBJECT_LIMIT_PROCESS_TIME			0x0002
#define JOB_OBJECT_LIMIT_JOB_TIME			0x0004
#define JOB_OBJECT_LIMIT_ACTIVE_PROCESS 		0x0008
#define JOB_OBJECT_LIMIT_AFFINITY			0x0010
#define JOB_OBJECT_LIMIT_PRIORITY_CLASS 		0x0020
#define JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME		0x0040
#define JOB_OBJECT_LIMIT_SCHEDULING_CLASS		0x0080
#define JOB_OBJECT_LIMIT_PROCESS_MEMORY 		0x0100
#define JOB_OBJECT_LIMIT_JOB_MEMORY			0x0200
#define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION	0x0400
#define JOB_OBJECT_LIMIT_BREAKAWAY_OK			0x0800
#define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK		0x1000
#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE		0x2000

/* Wrong definitions, but keep for backward compatibility. */
#define JOB_OBJECT_BREAKAWAY_OK 	JOB_OBJECT_LIMIT_BREAKAWAY_OK
#define JOB_OBJECT_SILENT_BREAKAWAY	JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK

/* JOBOBJECT_BASIC_UI_RESTRICTIONS.UIRestrictionsClass constants */
#define JOB_OBJECT_UILIMIT_HANDLES			0x0001
#define JOB_OBJECT_UILIMIT_READCLIPBOARD		0x0002
#define JOB_OBJECT_UILIMIT_WRITECLIPBOARD		0x0004
#define JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS		0x0008
#define JOB_OBJECT_UILIMIT_DISPLAYSETTINGS		0x0010
#define JOB_OBJECT_UILIMIT_GLOBALATOMS			0x0020
#define JOB_OBJECT_UILIMIT_DESKTOP			0x0040
#define JOB_OBJECT_UILIMIT_EXITWINDOWS			0x0080

/* JOBOBJECT_SECURITY_LIMIT_INFORMATION.SecurityLimitFlags constants */
#define JOB_OBJECT_SECURITY_NO_ADMIN			0x0001
#define JOB_OBJECT_SECURITY_RESTRICTED_TOKEN		0x0002
#define JOB_OBJECT_SECURITY_ONLY_TOKEN			0x0004
#define JOB_OBJECT_SECURITY_FILTER_TOKENS		0x0008

/* JOBOBJECT_END_OF_JOB_TIME_INFORMATION.EndOfJobTimeAction constants */
#define JOB_OBJECT_TERMINATE_AT_END_OF_JOB		 0
#define JOB_OBJECT_POST_AT_END_OF_JOB			 1

#define JOB_OBJECT_MSG_END_OF_JOB_TIME			 1
#define JOB_OBJECT_MSG_END_OF_PROCESS_TIME		 2
#define JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT		 3
#define JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO		 4
#define JOB_OBJECT_MSG_NEW_PROCESS			 6
#define JOB_OBJECT_MSG_EXIT_PROCESS			 7
#define JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS		 8
#define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT		 9
#define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT 		10


typedef enum _JOBOBJECTINFOCLASS
{ JobObjectBasicAccountingInformation		=	 1,
  JobObjectBasicLimitInformation,
  JobObjectBasicProcessIdList,
  JobObjectBasicUIRestrictions,
  JobObjectSecurityLimitInformation,
  JobObjectEndOfJobTimeInformation,
  JobObjectAssociateCompletionPortInformation,
  JobObjectBasicAndIoAccountingInformation,
  JobObjectExtendedLimitInformation,
  JobObjectJobSetInformation,
  MaxJobObjectInfoClass
} JOBOBJECTINFOCLASS;

typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION
{ LARGE_INTEGER 	TotalUserTime;
  LARGE_INTEGER 	TotalKernelTime;
  LARGE_INTEGER 	ThisPeriodTotalUserTime;
  LARGE_INTEGER 	ThisPeriodTotalKernelTime;
  DWORD 		TotalPageFaultCount;
  DWORD 		TotalProcesses;
  DWORD 		ActiveProcesses;
  DWORD 		TotalTerminatedProcesses;
} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;

typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION
{ LARGE_INTEGER 	PerProcessUserTimeLimit;
  LARGE_INTEGER 	PerJobUserTimeLimit;
  DWORD 		LimitFlags;
  SIZE_T		MinimumWorkingSetSize;
  SIZE_T		MaximumWorkingSetSize;
  DWORD 		ActiveProcessLimit;
  ULONG_PTR		Affinity;
  DWORD 		PriorityClass;
  DWORD 		SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;

typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST
{ DWORD 		NumberOfAssignedProcesses;
  DWORD 		NumberOfProcessIdsInList;
  ULONG_PTR		ProcessIdList[1];
} JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;

typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS
{ DWORD 		UIRestrictionsClass;
} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;

typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION
{ DWORD 		SecurityLimitFlags;
  HANDLE		JobToken;
  PTOKEN_GROUPS 	SidsToDisable;
  PTOKEN_PRIVILEGES	PrivilegesToDelete;
  PTOKEN_GROUPS 	RestrictedSids;
} JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION;

typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION
{ DWORD 		EndOfJobTimeAction;
} JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;

typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT
{ PVOID 		CompletionKey;
  HANDLE		CompletionPort;
} JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;

typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION
{ JOBOBJECT_BASIC_ACCOUNTING_INFORMATION	BasicInfo;
  IO_COUNTERS					IoInfo;
} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;

typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{ JOBOBJECT_BASIC_LIMIT_INFORMATION		BasicLimitInformation;
  IO_COUNTERS					IoInfo;
  SIZE_T					ProcessMemoryLimit;
  SIZE_T					JobMemoryLimit;
  SIZE_T					PeakProcessMemoryUsed;
  SIZE_T					PeakJobMemoryUsed;
} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;

typedef struct _JOBOBJECT_JOBSET_INFORMATION
{ DWORD 		MemberLevel;
} JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;

/* Fixme: Making these defines conditional on WINVER will break ddk includes */
#if 1 /* (WINVER >= 0x0500) */
#include <pshpack4.h>

#define ES_SYSTEM_REQUIRED			0x00000001
#define ES_DISPLAY_REQUIRED			0x00000002
#define ES_USER_PRESENT 			0x00000004
#define ES_CONTINUOUS				0x80000000


typedef enum _LATENCY_TIME
{ LT_DONT_CARE,
  LT_LOWEST_LATENCY
} LATENCY_TIME, *PLATENCY_TIME;


typedef enum _SYSTEM_POWER_STATE
{ PowerSystemUnspecified,
  PowerSystemWorking,
  PowerSystemSleeping1,
  PowerSystemSleeping2,
  PowerSystemSleeping3,
  PowerSystemHibernate,
  PowerSystemShutdown,
  PowerSystemMaximum
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
#define POWER_SYSTEM_MAXIMUM  PowerSystemMaximum

typedef enum
{ PowerActionNone,
  PowerActionReserved,
  PowerActionSleep,
  PowerActionHibernate,
  PowerActionShutdown,
  PowerActionShutdownReset,
  PowerActionShutdownOff,
  PowerActionWarmEject
} POWER_ACTION, *PPOWER_ACTION;

#if (_WIN32_WINNT >= 0x0600)

typedef enum
{ PoAc			=	0,
  PoDc			=	1,
  PoHot 		=	2,
  PoConditionMaximum	=	3
} SYSTEM_POWER_CONDITION, *PSYSTEM_POWER_CONDITION;
#endif


typedef enum _DEVICE_POWER_STATE
{ PowerDeviceUnspecified,
  PowerDeviceD0,
  PowerDeviceD1,
  PowerDeviceD2,
  PowerDeviceD3,
  PowerDeviceMaximum
} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;


typedef struct
{ DWORD 		Granularity;
  DWORD 		Capacity;
} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;


typedef struct _POWER_ACTION_POLICY
{ POWER_ACTION		Action;
  ULONG 		Flags;
  ULONG 		EventCode;
} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;

/* POWER_ACTION_POLICY.Flags constants */
#define POWER_ACTION_QUERY_ALLOWED		0x00000001
#define POWER_ACTION_UI_ALLOWED 		0x00000002
#define POWER_ACTION_OVERRIDE_APPS		0x00000004
#define POWER_ACTION_LIGHTEST_FIRST		0x10000000
#define POWER_ACTION_LOCK_CONSOLE		0x20000000
#define POWER_ACTION_DISABLE_WAKES		0x40000000
#define POWER_ACTION_CRITICAL			0x80000000

/* POWER_ACTION_POLICY.EventCode constants */
#define POWER_LEVEL_USER_NOTIFY_TEXT		0x00000001
#define POWER_LEVEL_USER_NOTIFY_SOUND		0x00000002
#define POWER_LEVEL_USER_NOTIFY_EXEC		0x00000004
#define POWER_USER_NOTIFY_BUTTON		0x00000008
#define POWER_USER_NOTIFY_SHUTDOWN		0x00000010
#define POWER_FORCE_TRIGGER_RESET		0x80000000

#define DISCHARGE_POLICY_CRITICAL			 0
#define DISCHARGE_POLICY_LOW				 1
#define NUM_DISCHARGE_POLICIES				 4

#define PO_THROTTLE_NONE				 0
#define PO_THROTTLE_CONSTANT				 1
#define PO_THROTTLE_DEGRADE				 2
#define PO_THROTTLE_ADAPTIVE				 3
#define PO_THROTTLE_MAXIMUM				 4

typedef struct _SYSTEM_POWER_LEVEL
{ BOOLEAN		Enable;
  UCHAR 		Spare[3];
  ULONG 		BatteryLevel;
  POWER_ACTION_POLICY	PowerPolicy;
  SYSTEM_POWER_STATE	MinSystemState;
} SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;

typedef struct _SYSTEM_POWER_POLICY
{ ULONG 		Revision;
  POWER_ACTION_POLICY	PowerButton;
  POWER_ACTION_POLICY	SleepButton;
  POWER_ACTION_POLICY	LidClose;
  SYSTEM_POWER_STATE	LidOpenWake;
  ULONG 		Reserved;
  POWER_ACTION_POLICY	Idle;
  ULONG 		IdleTimeout;
  UCHAR 		IdleSensitivity;
  UCHAR 		DynamicThrottle;
  UCHAR 		Spare2[2];
  SYSTEM_POWER_STATE	MinSleep;
  SYSTEM_POWER_STATE	MaxSleep;
  SYSTEM_POWER_STATE	ReducedLatencySleep;
  ULONG 		WinLogonFlags;
  ULONG 		Spare3;
  ULONG 		DozeS4Timeout;
  ULONG 		BroadcastCapacityResolution;
  SYSTEM_POWER_LEVEL	DischargePolicy[NUM_DISCHARGE_POLICIES];
  ULONG 		VideoTimeout;
  BOOLEAN		VideoDimDisplay;
  ULONG 		VideoReserved[3];
  ULONG 		SpindownTimeout;
  BOOLEAN		OptimizeForPower;
  UCHAR 		FanThrottleTolerance;
  UCHAR 		ForcedThrottle;
  UCHAR 		MinThrottle;
  POWER_ACTION_POLICY	OverThrottled;
} SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;


typedef struct _SYSTEM_POWER_CAPABILITIES
{ BOOLEAN			PowerButtonPresent;
  BOOLEAN			SleepButtonPresent;
  BOOLEAN			LidPresent;
  BOOLEAN			SystemS1;
  BOOLEAN			SystemS2;
  BOOLEAN			SystemS3;
  BOOLEAN			SystemS4;
  BOOLEAN			SystemS5;
  BOOLEAN			HiberFilePresent;
  BOOLEAN			FullWake;
  BOOLEAN			VideoDimPresent;
  BOOLEAN			ApmPresent;
  BOOLEAN			UpsPresent;
  BOOLEAN			ThermalControl;
  BOOLEAN			ProcessorThrottle;
  UCHAR 			ProcessorMinThrottle;
  UCHAR 			ProcessorMaxThrottle;
  BOOLEAN			FastSystemS4;
  UCHAR 			spare2[3];
  BOOLEAN			DiskSpinDown;
  UCHAR 			spare3[8];
  BOOLEAN			SystemBatteriesPresent;
  BOOLEAN			BatteriesAreShortTerm;
  BATTERY_REPORTING_SCALE	BatteryScale[3];
  SYSTEM_POWER_STATE		AcOnLineWake;
  SYSTEM_POWER_STATE		SoftLidWake;
  SYSTEM_POWER_STATE		RtcWake;
  SYSTEM_POWER_STATE		MinDeviceWakeState;
  SYSTEM_POWER_STATE		DefaultLowLatencyWake;
} SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;


typedef struct _SYSTEM_BATTERY_STATE
{ BOOLEAN			AcOnLine;
  BOOLEAN			BatteryPresent;
  BOOLEAN			Charging;
  BOOLEAN			Discharging;
  BOOLEAN			Spare1[4];
  ULONG 			MaxCapacity;
  ULONG 			RemainingCapacity;
  ULONG 			Rate;
  ULONG 			EstimatedTime;
  ULONG 			DefaultAlert1;
  ULONG 			DefaultAlert2;
} SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;


typedef enum _POWER_INFORMATION_LEVEL
{ SystemPowerPolicyAc,
  SystemPowerPolicyDc,
  VerifySystemPolicyAc,
  VerifySystemPolicyDc,
  SystemPowerCapabilities,
  SystemBatteryState,
  SystemPowerStateHandler,
  ProcessorStateHandler,
  SystemPowerPolicyCurrent,
  AdministratorPowerPolicy,
  SystemReserveHiberFile,
  ProcessorInformation,
  SystemPowerInformation,
  ProcessorStateHandler2,
  LastWakeTime,
  LastSleepTime,
  SystemExecutionState,
  SystemPowerStateNotifyHandler,
  ProcessorPowerPolicyAc,
  ProcessorPowerPolicyDc,
  VerifyProcessorPowerPolicyAc,
  VerifyProcessorPowerPolicyDc,
  ProcessorPowerPolicyCurrent
} POWER_INFORMATION_LEVEL;

#if (_WIN32_WINNT >= 0x0500)
typedef LONG (WINAPI *PVECTORED_EXCEPTION_HANDLER)(PEXCEPTION_POINTERS);
#endif
#if 1 /* (WIN32_WINNT >= 0x0500) */

typedef struct _SYSTEM_POWER_INFORMATION
{ ULONG 	MaxIdlenessAllowed;
  ULONG 	Idleness;
  ULONG 	TimeRemaining;
  UCHAR 	CoolingMode;
} SYSTEM_POWER_INFORMATION, *PSYSTEM_POWER_INFORMATION;
#endif

#if (_WIN32_WINNT >= 0x0501)

typedef enum _HEAP_INFORMATION_CLASS
{ HeapCompatibilityInformation
} HEAP_INFORMATION_CLASS;

typedef enum _ACTIVATION_CONTEXT_INFO_CLASS
{ ActivationContextBasicInformation	=	1,
  ActivationContextDetailedInformation,
  AssemblyDetailedInformationInActivationContext,
  FileInformationInAssemblyOfAssemblyInActivationContext
} ACTIVATION_CONTEXT_INFO_CLASS;

typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION
{ DWORD 		ulFlags;
  DWORD 		ulEncodedAssemblyIdentityLength;
  DWORD 		ulManifestPathType;
  DWORD 		ulManifestPathLength;
  LARGE_INTEGER 	liManifestLastWriteTime;
  DWORD 		ulPolicyPathType;
  DWORD 		ulPolicyPathLength;
  LARGE_INTEGER 	liPolicyLastWriteTime;
  DWORD 		ulMetadataSatelliteRosterIndex;
  DWORD 		ulManifestVersionMajor;
  DWORD 		ulManifestVersionMinor;
  DWORD 		ulPolicyVersionMajor;
  DWORD 		ulPolicyVersionMinor;
  DWORD 		ulAssemblyDirectoryNameLength;
  PCWSTR		lpAssemblyEncodedAssemblyIdentity;
  PCWSTR		lpAssemblyManifestPath;
  PCWSTR		lpAssemblyPolicyPath;
  PCWSTR		lpAssemblyDirectoryName;
} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
typedef const ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;

typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION
{ DWORD 		dwFlags;
  DWORD 		ulFormatVersion;
  DWORD 		ulAssemblyCount;
  DWORD 		ulRootManifestPathType;
  DWORD 		ulRootManifestPathChars;
  DWORD 		ulRootConfigurationPathType;
  DWORD 		ulRootConfigurationPathChars;
  DWORD 		ulAppDirPathType;
  DWORD 		ulAppDirPathChars;
  PCWSTR 		lpRootManifestPath;
  PCWSTR 		lpRootConfigurationPath;
  PCWSTR 		lpAppDirPath;
} ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
typedef const ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;

typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX
{ ULONG 		ulAssemblyIndex;
  ULONG 		ulFileIndexInAssembly;
} ACTIVATION_CONTEXT_QUERY_INDEX, *PACTIVATION_CONTEXT_QUERY_INDEX;
typedef const ACTIVATION_CONTEXT_QUERY_INDEX *PCACTIVATION_CONTEXT_QUERY_INDEX;

typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION
{ DWORD 		ulFlags;
  DWORD 		ulFilenameLength;
  DWORD 		ulPathLength;
  PCWSTR		lpFileName;
  PCWSTR		lpFilePath;
} ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;
typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
#endif /* (WIN32_WINNT >= 0x0501) */

typedef struct _PROCESSOR_POWER_POLICY_INFO
{ ULONG 		TimeCheck;
  ULONG 		DemoteLimit;
  ULONG 		PromoteLimit;
  UCHAR 		DemotePercent;
  UCHAR 		PromotePercent;
  UCHAR 		Spare[2];
  ULONG 		AllowDemotion : 1;
  ULONG 		AllowPromotion : 1;
  ULONG 		Reserved : 30;
} PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;

typedef struct _PROCESSOR_POWER_POLICY
{ ULONG 			Revision;
  UCHAR 			DynamicThrottle;
  UCHAR 			Spare[3];
  ULONG 			Reserved;
  ULONG 			PolicyCount;
  PROCESSOR_POWER_POLICY_INFO	Policy[3];
} PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;

typedef struct _ADMINISTRATOR_POWER_POLICY
{ SYSTEM_POWER_STATE	MinSleep;
  SYSTEM_POWER_STATE	MaxSleep;
  ULONG 		MinVideoTimeout;
  ULONG 		MaxVideoTimeout;
  ULONG 		MinSpindownTimeout;
  ULONG 		MaxSpindownTimeout;
} ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;
#include <poppack.h>
#endif /* WINVER >= 0x0500 */

#if (_WIN32_WINNT >= 0x0500)
typedef VOID (NTAPI *WAITORTIMERCALLBACKFUNC)(PVOID,BOOLEAN);
#endif

#ifdef UNICODE
typedef OSVERSIONINFOW OSVERSIONINFO, *POSVERSIONINFO, *LPOSVERSIONINFO;
typedef OSVERSIONINFOEXW OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;
#else
typedef OSVERSIONINFOA OSVERSIONINFO, *POSVERSIONINFO, *LPOSVERSIONINFO;
typedef OSVERSIONINFOEXA OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;
#endif

#if (_WIN32_WINNT >= 0x0500)
ULONGLONG WINAPI VerSetConditionMask(ULONGLONG,DWORD,BYTE);
#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType)  \
	((ConditionMask) = VerSetConditionMask((ConditionMask), \
	(TypeBitMask), (ComparisonType)))
#endif

#if defined(__GNUC__)
#if defined(_M_IX86) || defined(_M_X64) || defined(_M_IA64)
/* On regular _WIN32 and _WIN64 hardware platforms, provide inline
 * assembler pseudo-intrinsics to access the thread information block,
 * and the fiber data referenced therein.
 */
#ifndef _WIN64  /* Not 64-bit, so assume 32-bit */
/* On 32-bit Windows, TIB data is located via the FS segment, with
 * offsets computed in terms of the size of 4-byte pointers; thus the
 * offset of FiberData, preceded by four pointer fields, is 0x10, and
 * Self, preceded by six pointers, is at offset 0x18...
 */
#define __tib_fiber_data__   "fs:0x10"
#define __tib_self_refptr__  "fs:0x18"

#else
/* ...whereas, on 64-bit, the pointer size is doubled to eight bytes,
 * so the offsets double to 0x20 for FiberData, and 0x30 for Self,
 * respectively.
 */
#define __tib_fiber_data__   "gs:0x20"
#define __tib_self_refptr__  "gs:0x30"
#endif

#if (__GNUC__ >= 3)
/* From GCC-3.x onwards, the user may specify -masm=intel, and so
 * generate assembly language intermediate output in Intel/Microsoft
 * syntax; we must specify dual mode inline assembly code to support
 * this, (in addition to the default AT&T syntax).
 */
static __inline__ PVOID GetCurrentFiber (void)
{
  void *ret;
  __asm__ __volatile__ (
      "mov{%z0}\t{%%" __tib_fiber_data__ ", %0|%0," __tib_fiber_data__ "}"
      : "=a" (ret) /* resultant pointer will be returned in eax/rax */
    );
  return ret;
}

static __inline__ PVOID GetFiberData (void)
{
  void *ret;
  __asm__ __volatile__ (
      "mov{%z0}\t{%%" __tib_fiber_data__ ", %0|%0, " __tib_fiber_data__ "}\n\t"
      "mov{%z0}\t{(%0), %0|%0, [%0]}"
      : "=r" (ret) /* likely eax/rax, but must support indexing */
    );
  return ret;
}

static __inline__ struct _TEB *NtCurrentTeb (void)
{
  struct _TEB *ret;
  __asm__ __volatile__ (
      "mov{%z0}\t{%%" __tib_self_refptr__ ", %0|%0, " __tib_self_refptr__ "}"
      : "=a" (ret) /* resultant pointer will be returned in eax/rax */
      : /* no inputs */
    );
  return ret;
}
#else /* __GNUC__ < 3 */
/* Older versions of GCC, predating GCC-3.x, did not support -masm=intel;
 * specify inline assembly code in AT&T syntax only.
 */
static __inline__ PVOID GetCurrentFiber (void)
{
  void *ret;
  __asm__ __volatile__ (
      "mov%z0\t%%" __tib_fiber_data__ ", %0"
      : "=a" (ret) /* resultant pointer will be returned in eax/rax */
    );
  return ret;
}

static __inline__ PVOID GetFiberData (void)
{
  void *ret;
  __asm__ __volatile__ (
      "mov%z0\t%%" __tib_fiber_data__ ", %0\n\t"
      "mov%z0\t(%0), %0"
      : "=r" (ret) /* likely eax/rax, but must support indexing */
    );
  return ret;
}

static __inline__ struct _TEB *NtCurrentTeb (void)
{
  struct _TEB *ret;
  __asm__ __volatile__ (
      "mov%z0\t%%" __tib_self_refptr__ ", %0"
      : "=a" (ret) /* resultant pointer will be returned in eax/rax */
      : /* no inputs */
    );
  return ret;
}
#endif	/* __GNUC__ < 3 */
#endif	/* _M_IX86 || _M_X64 || _M_IA64 */
#else	/* !__GNUC__ */
/* The (unidentified) compiler is not GCC.
 * FIXME: If it isn't GCC, what is it?  Given that what follows is
 * inline assembly code, it surely can't be generically suitable for
 * use with any non-GCC compiler?  Google suggests that this syntax
 * may be applicable for WATCOM compilers.  More to the point: given
 * that our mission is to deliver GCC for Windows, why is this here
 * at all?  Do we REALLY want to carry this maintenance burden?
 */
#if defined(_M_IX86)
PVOID GetCurrentFiber (void);
#pragma aux GetCurrentFiber = \
  "mov	eax, dword ptr fs:0x10" \
  value [eax] \
  modify [eax];

PVOID GetFiberData (void);
#pragma aux GetFiberData = \
  "mov	eax, dword ptr fs:0x10" \
  "mov	eax, [eax]" \
  value [eax] \
  modify [eax];

struct _TEB *NtCurrentTeb (void);
#pragma aux NtCurrentTeb = \
  "mov	eax, dword ptr fs:0x18" \
  value [eax] \
  modify [eax];

#endif	/* _M_IX86 */
#endif	/* !__GNUC__ */

/* MemoryBarrier() Implementation
 * ------------------------------
 * https://msdn.microsoft.com/en-us/library/windows/desktop/ms684208%28v=vs.85%29.aspx
 *
 * MSDN says that this requires one of Vista, or Windows Server-2003,
 * or later; I don't see why that should be, since neither Microsoft's
 * implementation, nor the following, actually exhibits any dependency
 * on any OS feature specific to these, or later versions.
 *
 * For this MinGW.org MemoryBarrier() implementation, we aim to rely,
 * to the maximum practicable extent, on the intrinsic implementations
 * provided by the GCC compiler itself; thus, for those recent versions
 * of GCC, (those which implement the sequentially consistent model for
 * atomic memory access)...
 */
#if defined(__ATOMIC_SEQ_CST)
 /* ...we implement barriers using the __atomic_thread_fence() intrinsic
  * function, in sequentially consistent mode.
  */
# define __mingw_fence_type__	__ATOMIC_SEQ_CST
# define __mingw_thread_fence	__atomic_thread_fence

 /* For earlier compiler versions, which lack __atomic_thread_fence(),
  * we fall back on legacy mechanisms; thus, from GCC-4.4 onward...
  */
#elif ((__GNUC__ << 8) + __GNUC_MINOR__) >= 0x404
 /* ...we fall back to the __sync_synchronize() intrinsic function; (this
  * was first mentioned in the documentation for GCC-4.1, but comments in
  * the GCC source code suggest that it did not achieve a robust state of
  * implementation, until GCC-4.4).
  */
# define __mingw_thread_fence	__sync_synchronize
# define __mingw_fence_type__

#else
 /* Finally, when there is no viable intrinsic implementation, we fall
  * back on inline assembly code.  This is CPU architecture dependent:
  * we choose the instructions, for each architecture, as best we can
  * to match the code emitted by __atomic_thread_fence(), in versions
  * of GCC which support it; thus...
  */
# define __mingw_thread_fence	__asm__ __volatile__
# define __mingw_fence_type__	__mingw_fence_insn__:::"memory"

# if defined(_M_X64) || defined(_M_AMD64) || (_M_IX86_FP >= 2)
  /* ...for X86-64, AMD-64, and 32-bit X86 processors with support for
   * SSE2 instructions, we may issue an "mfence" instruction directly...
   */
#  define __mingw_fence_insn__	"mfence"

# elif defined(_M_IA64)
  /* ...while for IA-64 (Itanium), the equivalent is "mf"...
   */
#  define __mingw_fence_insn__	"mf"

# elif defined(_M_IX86)
  /* ...and, for 32-bit X86 processors without support for the SSE2
   * instruction set, (nominally, our default supported architecture),
   * we perform a bus-locked memory fetch and store, (OR with zero).
   */
#  define __mingw_fence_insn__	"lock or{l}\t{$0, (%%esp)|DWORD PTR [esp], 0}"

  /* FIXME: To support other CPU architectures, any appropriate fall
   * back instructions must be identified here, (with an appropriate
   * "#elif defined(_M_ARCH)" clause for each)...
   */
# else
  /* ...and, as a last resort, we arrange to inject NOTHING into the
   * code stream; (notwthstanding, this may still suffice as a light
   * weight barrier, insofar as it should prevent reordering of code,
   * which might otherwise result from compiler optimizations, about
   * the barrier placement point).
   */
#  define __mingw_fence_insn__	""
# endif
#endif

/* Finally, the preceding implementation choices are encapsulated
 * into the actual MemoryBarrier() implementation; this is provided
 * in the form of a function, with static scope, and defined such
 * that it must always be expanded in-line...
 */
static FORCEINLINE void MemoryBarrier (void)
{ __mingw_thread_fence(__mingw_fence_type__); }

/* ...before purging the implementation choice macros, (which are
 * no longer needed), from the pre-processor namespace.
 */
#undef __mingw_fence_type__
#undef __mingw_thread_fence
#undef __mingw_fence_insn__

_END_C_DECLS

#endif	/* ! RC_INVOKED */
#endif	/* !_WINNT_H: internal recursion break */
#endif	/* !_WINNT_H: $RCSfile: winnt.h,v $: end of file */
