Moved most builtin controls structures into their respective C file.
[wine] / include / winnt.h
index a23df14..1ed24e2 100644 (file)
@@ -7,7 +7,160 @@
 #ifndef __WINE_WINNT_H
 #define __WINE_WINNT_H
 
-#include "wintypes.h"
+#include "basetsd.h"
+#include "windef.h"
+
+#ifndef RC_INVOKED
+#include <ctype.h>
+#include <string.h>
+#endif
+
+#include "pshpack1.h"
+/* Defines */
+
+/* Argument 1 passed to the DllEntryProc. */
+#define        DLL_PROCESS_DETACH      0       /* detach process (unload library) */
+#define        DLL_PROCESS_ATTACH      1       /* attach process (load library) */
+#define        DLL_THREAD_ATTACH       2       /* attach new thread */
+#define        DLL_THREAD_DETACH       3       /* detach thread */
+
+
+/* u.x.wProcessorArchitecture (NT) */
+#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_UNKNOWN 0xFFFF
+
+/* dwProcessorType */
+#define PROCESSOR_INTEL_386      386
+#define PROCESSOR_INTEL_486      486
+#define PROCESSOR_INTEL_PENTIUM  586
+#define PROCESSOR_INTEL_860      860
+#define PROCESSOR_MIPS_R2000     2000
+#define PROCESSOR_MIPS_R3000     3000
+#define PROCESSOR_MIPS_R4000     4000
+#define PROCESSOR_ALPHA_21064    21064
+#define PROCESSOR_PPC_601        601
+#define PROCESSOR_PPC_603        603
+#define PROCESSOR_PPC_604        604
+#define PROCESSOR_PPC_620        620
+#define PROCESSOR_HITACHI_SH3    10003
+#define PROCESSOR_HITACHI_SH3E   10004
+#define PROCESSOR_HITACHI_SH4    10005
+#define PROCESSOR_MOTOROLA_821   821
+#define PROCESSOR_SHx_SH3        103
+#define PROCESSOR_SHx_SH4        104
+#define PROCESSOR_STRONGARM      2577
+#define PROCESSOR_ARM720         1824    /* 0x720 */
+#define PROCESSOR_ARM820         2080    /* 0x820 */
+#define PROCESSOR_ARM920         2336    /* 0x920 */
+#define PROCESSOR_ARM_7TDMI      70001
+
+typedef struct _MEMORY_BASIC_INFORMATION
+{
+    LPVOID   BaseAddress;
+    LPVOID   AllocationBase;
+    DWORD    AllocationProtect;
+    DWORD    RegionSize;
+    DWORD    State;
+    DWORD    Protect;
+    DWORD    Type;
+} MEMORY_BASIC_INFORMATION,*LPMEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION;
+
+#define        PAGE_NOACCESS           0x01
+#define        PAGE_READONLY           0x02
+#define        PAGE_READWRITE          0x04
+#define        PAGE_WRITECOPY          0x08
+#define        PAGE_EXECUTE            0x10
+#define        PAGE_EXECUTE_READ       0x20
+#define        PAGE_EXECUTE_READWRITE  0x40
+#define        PAGE_EXECUTE_WRITECOPY  0x80
+#define        PAGE_GUARD              0x100
+#define        PAGE_NOCACHE            0x200
+
+#define MEM_COMMIT              0x00001000
+#define MEM_RESERVE             0x00002000
+#define MEM_DECOMMIT            0x00004000
+#define MEM_RELEASE             0x00008000
+#define MEM_FREE                0x00010000
+#define MEM_PRIVATE             0x00020000
+#define MEM_MAPPED              0x00040000
+#define MEM_RESET               0x00080000
+#define MEM_TOP_DOWN            0x00100000
+#ifdef __WINE__
+#define MEM_SYSTEM              0x80000000
+#endif
+
+#define SEC_FILE                0x00800000
+#define SEC_IMAGE               0x01000000
+#define SEC_RESERVE             0x04000000
+#define SEC_COMMIT              0x08000000
+#define SEC_NOCACHE             0x10000000
+#define MEM_IMAGE               SEC_IMAGE
+
+
+#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 FIELD_OFFSET(type, field) \
+  ((LONG)(INT)&(((type *)0)->field))
+
+#define CONTAINING_RECORD(address, type, field) \
+  ((type *)((PCHAR)(address) - (PCHAR)(&((type *)0)->field)))
+
+/* Types */
+
+/* TCHAR data types definitions for Winelib. */
+/* These types are _not_ defined for the emulator, because they */
+/* depend on the UNICODE macro that only exists in user's code. */
+
+#ifndef __WINE__
+# ifdef UNICODE
+typedef WCHAR TCHAR, *PTCHAR;
+typedef LPWSTR PTSTR, LPTSTR;
+typedef LPCWSTR PCTSTR, LPCTSTR;
+#define __TEXT(string) L##string /*probably wrong */
+# else  /* UNICODE */
+typedef char TCHAR, *PTCHAR;
+typedef LPSTR PTSTR, LPTSTR;
+typedef LPCSTR PCTSTR, LPCTSTR;
+#define __TEXT(string) string
+# endif /* UNICODE */
+#endif   /* __WINE__ */
+#define TEXT(quote) __TEXT(quote)
+
+typedef BYTE     BOOLEAN;
+typedef BOOLEAN *PBOOLEAN;
+
+#ifndef _DWORDLONG_
+#define _DWORDLONG_
+typedef __uint64 DWORDLONG, *PDWORDLONG;
+#endif
+
+#ifndef _ULONGLONG_
+#define _ULONGLONG_
+typedef __int64 LONGLONG, *PLONGLONG;
+typedef __uint64 ULONGLONG, *PULONGLONG;
+#endif
+
+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;
 
 /* Heap flags */
 
 #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
 #define HEAP_CREATE_ALIGN_16            0x00010000
 #define HEAP_CREATE_ENABLE_TRACING      0x00020000
-#define HEAP_WINE_SEGPTR                0x01000000  /* Not a Win32 flag */
-#define HEAP_WINE_CODESEG               0x02000000  /* Not a Win32 flag */
+
+/* This flag allows it to create heaps shared by all processes under win95,
+   FIXME: correct name */
+#define HEAP_SHARED                     0x04000000  
+
+#define HEAP_WINE_SEGPTR                0x10000000  /* Not a Win32 flag */
+#define HEAP_WINE_CODESEG               0x20000000  /* Not a Win32 flag */
+#define HEAP_WINE_CODE16SEG             0x40000000  /* Not a Win32 flag */
+
+/* Processor feature flags.  */
+#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
+
 
 /* The Win32 register context */
 
-#define CONTEXT_i386      0x00010000
-#define CONTEXT_i486      CONTEXT_i386
-#define CONTEXT_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
-#define CONTEXT_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
-#define CONTEXT_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
-#define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
+/* CONTEXT is the CPU-dependent context; it should be used        */
+/* wherever a platform-specific context is needed (e.g. exception */
+/* handling, Win32 register functions). */
+
+/* CONTEXT86 is the i386-specific context; it should be used     */
+/* wherever only a 386 context makes sense (e.g. DOS interrupts, */
+/* Win16 register functions), so that this code can be compiled  */
+/* on all platforms. */
 
 #define SIZE_OF_80387_REGISTERS      80
 
-typedef struct
+typedef struct _FLOATING_SAVE_AREA
 {
     DWORD   ControlWord;
     DWORD   StatusWord;
@@ -48,9 +216,9 @@ typedef struct
     DWORD   DataSelector;    
     BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
     DWORD   Cr0NpxState;
-} FLOATING_SAVE_AREA;
+} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
 
-typedef struct
+typedef struct _CONTEXT86
 {
     DWORD   ContextFlags;
 
@@ -86,77 +254,956 @@ typedef struct
     DWORD   EFlags;
     DWORD   Esp;
     DWORD   SegSs;
-} CONTEXT, *PCONTEXT;
+} CONTEXT86;
+
+#define CONTEXT_X86       0x00010000
+#define CONTEXT_i386      CONTEXT_X86
+#define CONTEXT_i486      CONTEXT_X86
+
+#define CONTEXT86_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
+#define CONTEXT86_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
+#define CONTEXT86_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
+#define CONTEXT86_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
+#define CONTEXT86_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
+#define CONTEXT86_FULL (CONTEXT86_CONTROL | CONTEXT86_INTEGER | CONTEXT86_SEGMENTS)
+
+/* i386 context definitions */
+#ifdef __i386__
+
+#define CONTEXT_CONTROL         CONTEXT86_CONTROL
+#define CONTEXT_INTEGER         CONTEXT86_INTEGER
+#define CONTEXT_SEGMENTS        CONTEXT86_SEGMENTS
+#define CONTEXT_FLOATING_POINT  CONTEXT86_FLOATING_POINT
+#define CONTEXT_DEBUG_REGISTERS CONTEXT86_DEBUG_REGISTERS
+#define CONTEXT_FULL            CONTEXT86_FULL
+
+typedef CONTEXT86 CONTEXT;
+
+#endif  /* __i386__ */
+
+/* Alpha context definitions */
+#ifdef _ALPHA_
+
+#define CONTEXT_ALPHA   0x00020000
+#define CONTEXT_CONTROL                (CONTEXT_ALPHA | 0x00000001L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA | 0x00000002L)
+#define CONTEXT_INTEGER                (CONTEXT_ALPHA | 0x00000004L)
+#define CONTEXT_FULL  (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
+
+typedef struct _CONTEXT
+{
+    /* selected by CONTEXT_FLOATING_POINT */
+    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;
+
+    /* selected by CONTEXT_INTEGER */
+    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;
+
+    /* selected by CONTEXT_FLOATING_POINT */
+    ULONGLONG Fpcr;
+    ULONGLONG SoftFpcr;
+
+    /* selected by CONTEXT_CONTROL */
+    ULONGLONG Fir;
+    DWORD Psr;
+    DWORD ContextFlags;
+    DWORD Fill[4];
+} CONTEXT;
+
+#define _QUAD_PSR_OFFSET   HighSoftFpcr
+#define _QUAD_FLAGS_OFFSET HighFir
+
+#endif  /* _ALPHA_ */
+
+/* Mips context definitions */
+#ifdef _MIPS_
+
+#define CONTEXT_R4000   0x00010000
+
+#define CONTEXT_CONTROL         (CONTEXT_R4000 | 0x00000001)
+#define CONTEXT_FLOATING_POINT  (CONTEXT_R4000 | 0x00000002)
+#define CONTEXT_INTEGER         (CONTEXT_R4000 | 0x00000004)
+
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
+
+typedef struct _CONTEXT
+{
+    DWORD Argument[4];
+    /* These are selected by 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;
+
+    /* These are selected by CONTEXT_INTEGER */
+    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;
+
+    /* These are selected by CONTEXT_FLOATING_POINT */
+    DWORD Fsr;
+
+    /* These are selected by CONTEXT_CONTROL */
+    DWORD Fir;
+    DWORD Psr;
+
+    DWORD ContextFlags;
+    DWORD Fill[2];
+} CONTEXT;
+
+#endif  /* _MIPS_ */
+
+/* PowerPC context definitions */
+#ifdef __PPC__
+
+#define CONTEXT_CONTROL         0x0001
+#define CONTEXT_FLOATING_POINT  0x0002
+#define CONTEXT_INTEGER         0x0004
+#define CONTEXT_DEBUG_REGISTERS 0x0008
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
 
+typedef struct
+{
+    /* These are selected by CONTEXT_FLOATING_POINT */
+    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;
+
+    /* These are selected by CONTEXT_INTEGER */
+    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;
+
+    /* These are selected by CONTEXT_CONTROL */
+    DWORD Msr;
+    DWORD Iar;
+    DWORD Lr;
+    DWORD Ctr;
+
+    DWORD ContextFlags;
+    DWORD Fill[3];
+
+    /* These are selected by CONTEXT_DEBUG_REGISTERS */
+    DWORD Dr0;
+    DWORD Dr1;
+    DWORD Dr2;
+    DWORD Dr3;
+    DWORD Dr4;
+    DWORD Dr5;
+    DWORD Dr6;
+    DWORD Dr7;
+} CONTEXT;
+
+typedef struct _STACK_FRAME_HEADER
+{
+    DWORD BackChain;
+    DWORD GlueSaved1;
+    DWORD GlueSaved2;
+    DWORD Reserved1;
+    DWORD Spare1;
+    DWORD Spare2;
+
+    DWORD Parameter0;
+    DWORD Parameter1;
+    DWORD Parameter2;
+    DWORD Parameter3;
+    DWORD Parameter4;
+    DWORD Parameter5;
+    DWORD Parameter6;
+    DWORD Parameter7;
+} STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER;
+
+#endif  /* __PPC__ */
+
+#ifdef __sparc__
+
+/* 
+ * FIXME:  
+ *
+ * There is no official CONTEXT structure defined for the SPARC 
+ * architecture, so I just made one up.
+ *
+ * This structure is valid only for 32-bit SPARC architectures,
+ * not for 64-bit SPARC.
+ *
+ * Note that this structure contains only the 'top-level' registers;
+ * the rest of the register window chain is not visible.
+ *
+ * The layout follows the Solaris 'prgregset_t' structure.
+ * 
+ */ 
+
+#define CONTEXT_SPARC            0x10000000
+
+#define CONTEXT_CONTROL         (CONTEXT_SPARC | 0x00000001)
+#define CONTEXT_FLOATING_POINT  (CONTEXT_SPARC | 0x00000002)
+#define CONTEXT_INTEGER         (CONTEXT_SPARC | 0x00000004)
+
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
+
+typedef struct _CONTEXT
+{
+    DWORD ContextFlags;
+
+    /* These are selected by CONTEXT_INTEGER */
+    DWORD g0;
+    DWORD g1;
+    DWORD g2;
+    DWORD g3;
+    DWORD g4;
+    DWORD g5;
+    DWORD g6;
+    DWORD g7;
+    DWORD o0;
+    DWORD o1;
+    DWORD o2;
+    DWORD o3;
+    DWORD o4;
+    DWORD o5;
+    DWORD o6;
+    DWORD o7;
+    DWORD l0;
+    DWORD l1;
+    DWORD l2;
+    DWORD l3;
+    DWORD l4;
+    DWORD l5;
+    DWORD l6;
+    DWORD l7;
+    DWORD i0;
+    DWORD i1;
+    DWORD i2;
+    DWORD i3;
+    DWORD i4;
+    DWORD i5;
+    DWORD i6;
+    DWORD i7;
+
+    /* These are selected by CONTEXT_CONTROL */
+    DWORD psr;
+    DWORD pc;
+    DWORD npc;
+    DWORD y;
+    DWORD wim;
+    DWORD tbr;
+
+    /* FIXME: floating point registers missing */
+
+} CONTEXT;
+
+#endif  /* __sparc__ */
+
+#if !defined(CONTEXT_FULL) && !defined(RC_INVOKED)
+#error You need to define a CONTEXT for your CPU
+#endif
+
+typedef CONTEXT *PCONTEXT;
+typedef HANDLE *PHANDLE;
 
 #ifdef __WINE__
 
-/* Macros for easier access to context registers */
-
-#define EAX_reg(context)     ((context)->Eax)
-#define EBX_reg(context)     ((context)->Ebx)
-#define ECX_reg(context)     ((context)->Ecx)
-#define EDX_reg(context)     ((context)->Edx)
-#define ESI_reg(context)     ((context)->Esi)
-#define EDI_reg(context)     ((context)->Edi)
-#define EBP_reg(context)     ((context)->Ebp)
-
-#define CS_reg(context)      ((context)->SegCs)
-#define DS_reg(context)      ((context)->SegDs)
-#define ES_reg(context)      ((context)->SegEs)
-#define FS_reg(context)      ((context)->SegFs)
-#define GS_reg(context)      ((context)->SegGs)
-#define SS_reg(context)      ((context)->SegSs)
-
-#define EFL_reg(context)     ((context)->EFlags)
-#define EIP_reg(context)     ((context)->Eip)
-#define ESP_reg(context)     ((context)->Esp)
-
-#define AX_reg(context)      (*(WORD*)&EAX_reg(context))
-#define BX_reg(context)      (*(WORD*)&EBX_reg(context))
-#define CX_reg(context)      (*(WORD*)&ECX_reg(context))
-#define DX_reg(context)      (*(WORD*)&EDX_reg(context))
-#define SI_reg(context)      (*(WORD*)&ESI_reg(context))
-#define DI_reg(context)      (*(WORD*)&EDI_reg(context))
-#define BP_reg(context)      (*(WORD*)&EBP_reg(context))
-
-#define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
-#define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
-#define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
-#define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
-#define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
-#define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
-#define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
-#define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
-                            
-#define IP_reg(context)      (*(WORD*)&EIP_reg(context))
-#define SP_reg(context)      (*(WORD*)&ESP_reg(context))
-                            
-#define FL_reg(context)      (*(WORD*)&EFL_reg(context))
-
-#define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
-#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
+/* Macros for easier access to i386 context registers */
+
+#define AX_reg(context)      (*(WORD*)&(context)->Eax)
+#define BX_reg(context)      (*(WORD*)&(context)->Ebx)
+#define CX_reg(context)      (*(WORD*)&(context)->Ecx)
+#define DX_reg(context)      (*(WORD*)&(context)->Edx)
+#define SI_reg(context)      (*(WORD*)&(context)->Esi)
+#define DI_reg(context)      (*(WORD*)&(context)->Edi)
+#define BP_reg(context)      (*(WORD*)&(context)->Ebp)
+
+#define AL_reg(context)      (*(BYTE*)&(context)->Eax)
+#define AH_reg(context)      (*((BYTE*)&(context)->Eax + 1))
+#define BL_reg(context)      (*(BYTE*)&(context)->Ebx)
+#define BH_reg(context)      (*((BYTE*)&(context)->Ebx + 1))
+#define CL_reg(context)      (*(BYTE*)&(context)->Ecx)
+#define CH_reg(context)      (*((BYTE*)&(context)->Ecx + 1))
+#define DL_reg(context)      (*(BYTE*)&(context)->Edx)
+#define DH_reg(context)      (*((BYTE*)&(context)->Edx + 1))
+
+#define SET_CFLAG(context)   ((context)->EFlags |= 0x0001)
+#define RESET_CFLAG(context) ((context)->EFlags &= ~0x0001)
+#define SET_ZFLAG(context)   ((context)->EFlags |= 0x0040)
+#define RESET_ZFLAG(context) ((context)->EFlags &= ~0x0040)
+#define ISV86(context)       ((context)->EFlags & 0x00020000)
+
+
+/* Macros to retrieve the current context */
+
+#ifdef __i386__
+
+#ifdef NEED_UNDERSCORE_PREFIX
+# define __ASM_NAME(name) "_" name
+#else
+# define __ASM_NAME(name) name
+#endif
+
+#ifdef NEED_TYPE_IN_DEF
+# define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"
+#else
+# define __ASM_FUNC(name) ".type " __ASM_NAME(name) ",@function"
+#endif
+
+#ifdef __GNUC__
+# define __ASM_GLOBAL_FUNC(name,code) \
+      __asm__( ".align 4\n\t" \
+               ".globl " __ASM_NAME(#name) "\n\t" \
+               __ASM_FUNC(#name) "\n" \
+               __ASM_NAME(#name) ":\n\t" \
+               code );
+#else  /* __GNUC__ */
+# define __ASM_GLOBAL_FUNC(name,code) \
+      void __asm_dummy_##name(void) { \
+          asm( ".align 4\n\t" \
+               ".globl " __ASM_NAME(#name) "\n\t" \
+               __ASM_FUNC(#name) "\n" \
+               __ASM_NAME(#name) ":\n\t" \
+               code ); \
+      }
+#endif  /* __GNUC__ */
+
+#define _DEFINE_REGS_ENTRYPOINT( name, fn, args ) \
+    __ASM_GLOBAL_FUNC( name, \
+                       "call " __ASM_NAME("CALL32_Regs") "\n\t" \
+                       ".long " __ASM_NAME(#fn) "\n\t" \
+                       ".byte " #args ", " #args )
+#define DEFINE_REGS_ENTRYPOINT_0( name, fn ) \
+  extern void WINAPI name(void); \
+  _DEFINE_REGS_ENTRYPOINT( name, fn, 0 )
+#define DEFINE_REGS_ENTRYPOINT_1( name, fn, t1 ) \
+  extern void WINAPI name( t1 a1 ); \
+  _DEFINE_REGS_ENTRYPOINT( name, fn, 4 )
+#define DEFINE_REGS_ENTRYPOINT_2( name, fn, t1, t2 ) \
+  extern void WINAPI name( t1 a1, t2 a2 ); \
+  _DEFINE_REGS_ENTRYPOINT( name, fn, 8 )
+#define DEFINE_REGS_ENTRYPOINT_3( name, fn, t1, t2, t3 ) \
+  extern void WINAPI name( t1 a1, t2 a2, t3 a3 ); \
+  _DEFINE_REGS_ENTRYPOINT( name, fn, 12 )
+#define DEFINE_REGS_ENTRYPOINT_4( name, fn, t1, t2, t3, t4 ) \
+  extern void WINAPI name( t1 a1, t2 a2, t3 a3, t4 a4 ); \
+  _DEFINE_REGS_ENTRYPOINT( name, fn, 16 )
+
+#endif  /* __i386__ */
+
+#ifdef __sparc__
+/* FIXME: use getcontext() to retrieve full context */
+#define _GET_CONTEXT \
+    CONTEXT context;   \
+    do { memset(&context, 0, sizeof(CONTEXT));            \
+         context.ContextFlags = CONTEXT_CONTROL;          \
+         context.pc = (DWORD)__builtin_return_address(0); \
+       } while (0)
+
+#define DEFINE_REGS_ENTRYPOINT_0( name, fn ) \
+  void WINAPI name ( void ) \
+  { _GET_CONTEXT; fn( &context ); }
+#define DEFINE_REGS_ENTRYPOINT_1( name, fn, t1 ) \
+  void WINAPI name ( t1 a1 ) \
+  { _GET_CONTEXT; fn( a1, &context ); }
+#define DEFINE_REGS_ENTRYPOINT_2( name, fn, t1, t2 ) \
+  void WINAPI name ( t1 a1, t2 a2 ) \
+  { _GET_CONTEXT; fn( a1, a2, &context ); }
+#define DEFINE_REGS_ENTRYPOINT_3( name, fn, t1, t2, t3 ) \
+  void WINAPI name ( t1 a1, t2 a2, t3 a3 ) \
+  { _GET_CONTEXT; fn( a1, a2, a3, &context ); }
+#define DEFINE_REGS_ENTRYPOINT_4( name, fn, t1, t2, t3, t4 ) \
+  void WINAPI name ( t1 a1, t2 a2, t3 a3, t4 a4 ) \
+  { _GET_CONTEXT; fn( a1, a2, a3, a4, &context ); }
+
+#endif /* __sparc__ */
+
+#ifndef DEFINE_REGS_ENTRYPOINT_0
+#error You need to define DEFINE_REGS_ENTRYPOINT macros for your CPU
+#endif
+
+/* Constructor functions */
+
+#ifdef __GNUC__
+# define DECL_GLOBAL_CONSTRUCTOR(func) \
+    static void func(void) __attribute__((constructor)); \
+    static void func(void)
+#else  /* __GNUC__ */
+# ifdef __i386__
+#  define DECL_GLOBAL_CONSTRUCTOR(func) \
+    static void __dummy_init_##func(void) { \
+        asm(".section .init,\"ax\"\n\t" \
+            "call " #func "\n\t" \
+            ".previous"); } \
+    static void func(void)
+# else  /* __i386__ */
+#  error You must define the DECL_GLOBAL_CONSTRUCTOR macro for your platform
+# endif
+#endif  /* __GNUC__ */
 
 #endif  /* __WINE__ */
 
+
+
+/*
+ * Language IDs
+ */
+
+#define MAKELCID(l, s)         (MAKELONG(l, s))
+
+#define MAKELANGID(p, s)        ((((WORD)(s))<<10) | (WORD)(p))
+#define PRIMARYLANGID(l)        ((WORD)(l) & 0x3ff)
+#define SUBLANGID(l)            ((WORD)(l) >> 10)
+
+#define LANGIDFROMLCID(lcid)   ((WORD)(lcid))
+#define SORTIDFROMLCID(lcid)   ((WORD)((((DWORD)(lcid)) >> 16) & 0x0f))
+
+#define LANG_SYSTEM_DEFAULT    (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
+#define LANG_USER_DEFAULT      (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
+#define LOCALE_SYSTEM_DEFAULT  (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))
+#define LOCALE_USER_DEFAULT    (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT)) 
+#define LOCALE_NEUTRAL         (MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT))
+
+/* FIXME: are the symbolic names correct for LIDs:  0x17, 0x20, 0x28,
+ *       0x2a, 0x2b, 0x2c, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+ *       0x37, 0x39, 0x3a, 0x3b, 0x3c, 0x3e, 0x3f, 0x41, 0x43, 0x44,
+ *       0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
+ *       0x4f, 0x57
+ */
+#define LANG_NEUTRAL                     0x00
+#define LANG_AFRIKAANS                  0x36
+#define LANG_ALBANIAN                   0x1c
+#define LANG_ARABIC                      0x01
+#define LANG_ARMENIAN                   0x2b
+#define LANG_ASSAMESE                   0x4d
+#define LANG_AZERI                      0x2c
+#define LANG_BASQUE                      0x2d
+#define LANG_BENGALI                    0x45
+#define LANG_BULGARIAN                   0x02
+#define LANG_BYELORUSSIAN                0x23
+#define LANG_CATALAN                     0x03
+#define LANG_CHINESE                     0x04
+#define LANG_SERBO_CROATIAN              0x1a
+#define LANG_CROATIAN    LANG_SERBO_CROATIAN
+#define LANG_SERBIAN     LANG_SERBO_CROATIAN
+#define LANG_CZECH                       0x05
+#define LANG_DANISH                      0x06
+#define LANG_DUTCH                       0x13
+#define LANG_ENGLISH                     0x09
+#define LANG_ESTONIAN                    0x25
+#define LANG_FAEROESE                    0x38
+#define LANG_FARSI                       0x29
+#define LANG_FINNISH                     0x0b
+#define LANG_FRENCH                      0x0c
+#define LANG_GAELIC                     0x3c
+#define LANG_GEORGIAN                   0x37
+#define LANG_GERMAN                      0x07
+#define LANG_GREEK                       0x08
+#define LANG_GUJARATI                   0x47
+#define LANG_HEBREW                      0x0D
+#define LANG_HINDI                      0x39
+#define LANG_HUNGARIAN                   0x0e
+#define LANG_ICELANDIC                   0x0f
+#define LANG_INDONESIAN                  0x21
+#define LANG_ITALIAN                     0x10
+#define LANG_JAPANESE                    0x11
+#define LANG_KANNADA                    0x4b
+#define LANG_KAZAKH                     0x3f
+#define LANG_KONKANI                    0x57
+#define LANG_KOREAN                      0x12
+#define LANG_LATVIAN                     0x26
+#define LANG_LITHUANIAN                  0x27
+#define LANG_MACEDONIAN                         0x2f
+#define LANG_MALAY                      0x3e
+#define LANG_MALAYALAM                  0x4c
+#define LANG_MALTESE                    0x3a
+#define LANG_MAORI                      0x28
+#define LANG_MARATHI                    0x4e
+#define LANG_NORWEGIAN                   0x14
+#define LANG_ORIYA                      0x48
+#define LANG_POLISH                      0x15
+#define LANG_PORTUGUESE                  0x16
+#define LANG_PUNJABI                    0x46
+#define LANG_RHAETO_ROMANCE             0x17
+#define LANG_ROMANIAN                    0x18
+#define LANG_RUSSIAN                     0x19
+#define LANG_SAAMI                      0x3b
+#define LANG_SANSKRIT                   0x4f
+#define LANG_SLOVAK                      0x1b
+#define LANG_SLOVENIAN                   0x24
+#define LANG_SORBIAN                     0x2e
+#define LANG_SPANISH                     0x0a
+#define LANG_SUTU                       0x30
+#define LANG_SWAHILI                    0x41
+#define LANG_SWEDISH                     0x1d
+#define LANG_TAMIL                      0x49
+#define LANG_TATAR                      0x44
+#define LANG_TELUGU                     0x4a
+#define LANG_THAI                        0x1e
+#define LANG_TSONGA                     0x31
+#define LANG_TSWANA                     0x32
+#define LANG_TURKISH                     0x1f
+#define LANG_UKRAINIAN                   0x22
+#define LANG_URDU                       0x20
+#define LANG_UZBEK                      0x43
+#define LANG_VENDA                      0x33
+#define LANG_VIETNAMESE                         0x2a
+#define LANG_XHOSA                      0x34
+#define LANG_ZULU                       0x35
+/* non standard; keep the number high enough (but < 0xff) */
+#define LANG_ESPERANTO                  0x8f
+#define LANG_WALON                      0x90
+#define LANG_CORNISH                     0x91
+#define LANG_WELSH                       0x92
+#define LANG_BRETON                      0x93
+
+/* Sublanguage definitions */
+#define SUBLANG_NEUTRAL                  0x00    /* language neutral */
+#define SUBLANG_DEFAULT                  0x01    /* user default */
+#define SUBLANG_SYS_DEFAULT              0x02    /* system default */
+
+#define SUBLANG_ARABIC                   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_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_DUTCH                    0x01
+#define SUBLANG_DUTCH_BELGIAN            0x02
+#define SUBLANG_DUTCH_SURINAM           0x03
+#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
+#define SUBLANG_ENGLISH_EIRE             0x06
+#define SUBLANG_ENGLISH_SAFRICA          0x07
+#define SUBLANG_ENGLISH_JAMAICA          0x08
+#define SUBLANG_ENGLISH_CARRIBEAN        0x09
+#define SUBLANG_ENGLISH_BELIZE           0x0a
+#define SUBLANG_ENGLISH_TRINIDAD         0x0b
+#define SUBLANG_ENGLISH_ZIMBABWE         0x0c
+#define SUBLANG_ENGLISH_PHILIPPINES      0x0d
+#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_GERMAN                   0x01
+#define SUBLANG_GERMAN_SWISS             0x02
+#define SUBLANG_GERMAN_AUSTRIAN          0x03
+#define SUBLANG_GERMAN_LUXEMBOURG        0x04
+#define SUBLANG_GERMAN_LIECHTENSTEIN     0x05
+#define SUBLANG_ITALIAN                  0x01
+#define SUBLANG_ITALIAN_SWISS            0x02
+#define SUBLANG_KOREAN                   0x01
+#define SUBLANG_KOREAN_JOHAB             0x02
+#define SUBLANG_NORWEGIAN_BOKMAL         0x01
+#define SUBLANG_NORWEGIAN_NYNORSK        0x02
+#define SUBLANG_PORTUGUESE               0x02
+#define SUBLANG_PORTUGUESE_BRAZILIAN     0x01
+#define SUBLANG_SPANISH                  0x01
+#define SUBLANG_SPANISH_MEXICAN          0x02
+#define SUBLANG_SPANISH_MODERN           0x03
+#define SUBLANG_SPANISH_GUATEMALA        0x04
+#define SUBLANG_SPANISH_COSTARICA        0x05
+#define SUBLANG_SPANISH_PANAMA           0x06
+#define SUBLANG_SPANISH_DOMINICAN        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
+/* FIXME: I don't know the symbolic names for those */
+#define SUBLANG_ROMANIAN                0x01
+#define SUBLANG_ROMANIAN_MOLDAVIA       0x02
+#define SUBLANG_RUSSIAN                         0x01
+#define SUBLANG_RUSSIAN_MOLDAVIA        0x02
+#define SUBLANG_CROATIAN                0x01
+#define SUBLANG_SERBIAN                         0x02
+#define SUBLANG_SERBIAN_LATIN           0x03
+#define SUBLANG_SWEDISH                         0x01
+#define SUBLANG_SWEDISH_FINLAND                 0x02
+#define SUBLANG_LITHUANIAN              0x01
+#define SUBLANG_LITHUANIAN_CLASSIC      0x02
+#define SUBLANG_AZERI                   0x01
+#define SUBLANG_AZERI_CYRILLIC          0x02
+#define SUBLANG_GAELIC                  0x01
+#define SUBLANG_GAELIC_SCOTTISH                 0x02
+#define SUBLANG_GAELIC_MANX              0x03
+#define SUBLANG_MALAY                   0x01
+#define SUBLANG_MALAY_BRUNEI_DARUSSALAM  0x02
+#define SUBLANG_UZBEK                   0x01
+#define SUBLANG_UZBEK_CYRILLIC          0x02
+#define SUBLANG_URDU_PAKISTAN            0x01
+
+
+
+/*
+ * Sort definitions
+ */
+
+#define SORT_DEFAULT                     0x0
+#define SORT_JAPANESE_XJIS               0x0
+#define SORT_JAPANESE_UNICODE            0x1
+#define SORT_CHINESE_BIG5                0x0
+#define SORT_CHINESE_UNICODE             0x1
+#define SORT_KOREAN_KSC                  0x0
+#define SORT_KOREAN_UNICODE              0x1
+
+
+
+/*
+ * Definitions for IsTextUnicode()
+ */
+
+#define IS_TEXT_UNICODE_ASCII16                   0x0001
+#define IS_TEXT_UNICODE_STATISTICS         0x0002
+#define IS_TEXT_UNICODE_CONTROLS           0x0004
+#define IS_TEXT_UNICODE_SIGNATURE         0x0008
+#define IS_TEXT_UNICODE_UNICODE_MASK       0x000F
+#define IS_TEXT_UNICODE_REVERSE_ASCII16           0x0010
+#define IS_TEXT_UNICODE_REVERSE_STATISTICS 0x0020
+#define IS_TEXT_UNICODE_REVERSE_CONTROLS   0x0040
+#define IS_TEXT_UNICODE_REVERSE_SIGNATURE  0x0080
+#define IS_TEXT_UNICODE_REVERSE_MASK       0x00F0
+#define IS_TEXT_UNICODE_ILLEGAL_CHARS     0x0100
+#define IS_TEXT_UNICODE_ODD_LENGTH        0x0200
+#define IS_TEXT_UNICODE_DBCS_LEADBYTE      0x0400
+#define IS_TEXT_UNICODE_NOT_UNICODE_MASK   0x0F00
+#define IS_TEXT_UNICODE_NULL_BYTES         0x1000
+#define IS_TEXT_UNICODE_NOT_ASCII_MASK     0xF000
+
+
+
 /*
  * Exception codes
  */
+
+#define STATUS_SUCCESS                   0x00000000
 #define STATUS_WAIT_0                    0x00000000
 #define STATUS_ABANDONED_WAIT_0          0x00000080
 #define STATUS_USER_APC                  0x000000C0
 #define STATUS_TIMEOUT                   0x00000102
 #define STATUS_PENDING                   0x00000103
+
+#define STATUS_GUARD_PAGE_VIOLATION      0x80000001    
 #define STATUS_DATATYPE_MISALIGNMENT     0x80000002
 #define STATUS_BREAKPOINT                0x80000003
 #define STATUS_SINGLE_STEP               0x80000004
+#define        STATUS_BUFFER_OVERFLOW           0x80000005
+#define STATUS_NO_MORE_FILES             0x80000006
+#define STATUS_WAKE_SYSTEM_DEBUGGER      0x80000007
+
+#define STATUS_HANDLES_CLOSED            0x8000000A
+#define STATUS_NO_INHERITANCE            0x8000000B
+#define STATUS_GUID_SUBSTITUTION_MADE    0x8000000C
+#define STATUS_PARTIAL_COPY              0x8000000D
+#define STATUS_DEVICE_PAPER_EMPTY        0x8000000E
+#define STATUS_DEVICE_POWERED_OFF        0x8000000F
+#define STATUS_DEVICE_OFF_LINE           0x80000010
+#define STATUS_DEVICE_BUSY               0x80000011
+#define STATUS_NO_MORE_EAS               0x80000012
+#define STATUS_INVALID_EA_NAME           0x80000013
+#define STATUS_EA_LIST_INCONSISTENT      0x80000014
+#define STATUS_INVALID_EA_FLAG           0x80000015
+#define STATUS_VERIFY_REQUIRED           0x80000016
+#define STATUS_EXTRANEOUS_INFORMATION    0x80000017
+#define STATUS_RXACT_COMMIT_NECESSARY    0x80000018
+#define STATUS_NO_MORE_ENTRIES           0x8000001A
+#define STATUS_FILEMARK_DETECTED         0x8000001B
+#define STATUS_MEDIA_CHANGED             0x8000001C
+#define STATUS_BUS_RESET                 0x8000001D
+#define STATUS_END_OF_MEDIA              0x8000001E
+#define STATUS_BEGINNING_OF_MEDIA        0x8000001F
+#define STATUS_MEDIA_CHECK               0x80000020
+#define STATUS_SETMARK_DETECTED          0x80000021
+#define STATUS_NO_DATA_DETECTED          0x80000022
+#define STATUS_REDIRECTOR_HAS_OPEN_HANDLES 0x80000023
+#define STATUS_SERVER_HAS_OPEN_HANDLES   0x80000024
+#define STATUS_ALREADY_DISCONNECTED      0x80000025
+#define STATUS_LONGJUMP                  0x80000026
+
+#define STATUS_UNSUCCESSFUL              0xC0000001
+#define STATUS_NOT_IMPLEMENTED           0xC0000002
+#define STATUS_INVALID_INFO_CLASS        0xC0000003
+#define STATUS_INFO_LENGTH_MISMATCH      0xC0000004
 #define STATUS_ACCESS_VIOLATION          0xC0000005
 #define STATUS_IN_PAGE_ERROR             0xC0000006
+#define STATUS_PAGEFILE_QUOTA            0xC0000007
+#define STATUS_INVALID_HANDLE            0xC0000008
+#define STATUS_BAD_INITIAL_STACK         0xC0000009
+#define STATUS_BAD_INITIAL_PC            0xC000000A
+#define STATUS_INVALID_CID               0xC000000B
+#define STATUS_TIMER_NOT_CANCELED        0xC000000C
+#define STATUS_INVALID_PARAMETER         0xC000000D
+#define STATUS_NO_SUCH_DEVICE            0xC000000E
+#define STATUS_NO_SUCH_FILE              0xC000000F
+#define STATUS_INVALID_DEVICE_REQUEST    0xC0000010
+#define STATUS_END_OF_FILE               0xC0000011
+#define STATUS_WRONG_VOLUME              0xC0000012
+#define STATUS_NO_MEDIA_IN_DEVICE        0xC0000013
+#define STATUS_UNRECOGNIZED_MEDIA        0xC0000014
+#define STATUS_NONEXISTENT_SECTOR        0xC0000015
+#define STATUS_MORE_PROCESSING_REQUIRED  0xC0000016
 #define STATUS_NO_MEMORY                 0xC0000017
+#define STATUS_CONFLICTING_ADDRESSES     0xC0000018
+#define STATUS_NOT_MAPPED_VIEW           0xC0000019
+#define STATUS_UNABLE_TO_FREE_VM         0xC000001A
+#define STATUS_UNABLE_TO_DELETE_SECTION  0xC000001B
+#define STATUS_INVALID_SYSTEM_SERVICE    0xC000001C
 #define STATUS_ILLEGAL_INSTRUCTION       0xC000001D
+#define STATUS_INVALID_LOCK_SEQUENCE     0xC000001E
+#define STATUS_INVALID_VIEW_SIZE         0xC000001F
+#define STATUS_INVALID_FILE_FOR_SECTION  0xC0000020
+#define STATUS_ALREADY_COMMITTED         0xC0000021
+#define STATUS_ACCESS_DENIED             0xC0000022
+#define        STATUS_BUFFER_TOO_SMALL          0xC0000023
+#define STATUS_OBJECT_TYPE_MISMATCH      0xC0000024
 #define STATUS_NONCONTINUABLE_EXCEPTION  0xC0000025
 #define STATUS_INVALID_DISPOSITION       0xC0000026
+#define STATUS_UNWIND                    0xC0000027
+#define STATUS_BAD_STACK                 0xC0000028
+#define STATUS_INVALID_UNWIND_TARGET     0xC0000029
+#define STATUS_NOT_LOCKED                0xC000002A
+#define STATUS_PARITY_ERROR              0xC000002B
+#define STATUS_UNABLE_TO_DECOMMIT_VM     0xC000002C
+#define STATUS_NOT_COMMITTED             0xC000002D
+#define STATUS_INVALID_PORT_ATTRIBUTES   0xC000002E
+#define STATUS_PORT_MESSAGE_TOO_LONG     0xC000002F
+#define STATUS_INVALID_PARAMETER_MIX     0xC0000030
+#define STATUS_INVALID_QUOTA_LOWER       0xC0000031
+#define STATUS_DISK_CORRUPT_ERROR        0xC0000032
+#define STATUS_OBJECT_NAME_INVALID       0xC0000033
+#define STATUS_OBJECT_NAME_NOT_FOUND     0xC0000034
+#define STATUS_OBJECT_NAME_COLLISION     0xC0000035
+#define STATUS_PORT_DISCONNECTED         0xC0000037
+#define STATUS_DEVICE_ALREADY_ATTACHED   0xC0000038
+#define STATUS_OBJECT_PATH_INVALID       0xC0000039
+#define STATUS_OBJECT_PATH_NOT_FOUND     0xC000003A
+#define STATUS_PATH_SYNTAX_BAD           0xC000003B
+#define STATUS_DATA_OVERRUN              0xC000003C
+#define STATUS_DATA_LATE_ERROR           0xC000003D
+#define STATUS_DATA_ERROR                0xC000003E
+#define STATUS_CRC_ERROR                 0xC000003F
+#define STATUS_SECTION_TOO_BIG           0xC0000040
+#define STATUS_PORT_CONNECTION_REFUSED   0xC0000041
+#define STATUS_INVALID_PORT_HANDLE       0xC0000042
+#define STATUS_SHARING_VIOLATION         0xC0000043
+#define STATUS_QUOTA_EXCEEDED            0xC0000044
+#define STATUS_INVALID_PAGE_PROTECTION   0xC0000045
+#define STATUS_MUTANT_NOT_OWNED          0xC0000046
+#define STATUS_SEMAPHORE_LIMIT_EXCEEDED  0xC0000047
+#define STATUS_PORT_ALREADY_SET          0xC0000048
+#define STATUS_SUSPEND_COUNT_EXCEEDED    0xC000004A
+#define STATUS_LOCK_NOT_GRANTED          0xC0000054  /* FIXME: not sure */
+#define STATUS_FILE_LOCK_CONFLICT        0xC0000055  /* FIXME: not sure */
+#define        STATUS_UNKNOWN_REVISION          0xC0000058
+#define        STATUS_INVALID_SECURITY_DESCR    0xC0000079
+#define STATUS_DISK_FULL                 0xC000007F 
+#define STATUS_SECTION_NOT_EXTENDED      0xC0000087
 #define STATUS_ARRAY_BOUNDS_EXCEEDED     0xC000008C
 #define STATUS_FLOAT_DENORMAL_OPERAND    0xC000008D
 #define STATUS_FLOAT_DIVIDE_BY_ZERO      0xC000008E
@@ -168,25 +1215,62 @@ typedef struct
 #define STATUS_INTEGER_DIVIDE_BY_ZERO    0xC0000094
 #define STATUS_INTEGER_OVERFLOW          0xC0000095
 #define STATUS_PRIVILEGED_INSTRUCTION    0xC0000096
+#define STATUS_MEDIA_WRITE_PROTECTED     0XC00000A2
+#define        STATUS_INVALID_PARAMETER_2       0xC00000F0
 #define STATUS_STACK_OVERFLOW            0xC00000FD
+#define STATUS_DIRECTORY_NOT_EMPTY       0xC0000101
+#define STATUS_TOO_MANY_OPENED_FILES     0xC000011F
 #define STATUS_CONTROL_C_EXIT            0xC000013A
+#define STATUS_PIPE_BROKEN               0xC000014B
+#define STATUS_NOT_REGISTRY_FILE         0xC000015C
+#define STATUS_PARTITION_FAILURE         0xC0000172
+#define STATUS_INVALID_BLOCK_LENGTH      0xC0000173
+#define STATUS_DEVICE_NOT_PARTITIONED    0xC0000174
+#define STATUS_UNABLE_TO_LOCK_MEDIA      0xC0000175
+#define STATUS_UNABLE_TO_UNLOAD_MEDIA    0xC0000176
+#define STATUS_EOM_OVERFLOW              0xC0000177
+#define STATUS_NO_MEDIA                  0xC0000178
+#define STATUS_NO_SUCH_MEMBER            0xC000017A
+#define STATUS_INVALID_MEMBER            0xC000017B
+#define STATUS_KEY_DELETED               0xC000017C
+#define STATUS_NO_LOG_SPACE              0xC000017D
+#define STATUS_TOO_MANY_SIDS             0xC000017E
+#define STATUS_LM_CROSS_ENCRYPTION_REQUIRED 0xC000017F
+#define STATUS_KEY_HAS_CHILDREN          0xC0000180
+#define STATUS_CHILD_MUST_BE_VOLATILE    0xC0000181
+#define STATUS_DEVICE_CONFIGURATION_ERROR0xC0000182
+#define STATUS_DRIVER_INTERNAL_ERROR     0xC0000183
+#define STATUS_INVALID_DEVICE_STATE      0xC0000184
+#define STATUS_IO_DEVICE_ERROR           0xC0000185
+#define STATUS_DEVICE_PROTOCOL_ERROR     0xC0000186
+#define STATUS_BACKUP_CONTROLLER         0xC0000187
+#define STATUS_LOG_FILE_FULL             0xC0000188
+#define STATUS_TOO_LATE                  0xC0000189
+#define STATUS_NO_TRUST_LSA_SECRET       0xC000018A
+#define STATUS_NO_TRUST_SAM_ACCOUNT      0xC000018B
+#define STATUS_TRUSTED_DOMAIN_FAILURE    0xC000018C
+#define STATUS_TRUSTED_RELATIONSHIP_FAILURE 0xC000018D
+#define STATUS_EVENTLOG_FILE_CORRUPT     0xC000018E
+#define STATUS_EVENTLOG_CANT_START       0xC000018F
+#define STATUS_TRUST_FAILURE             0xC0000190
+#define STATUS_MUTANT_LIMIT_EXCEEDED     0xC0000191
+#define STATUS_NETLOGON_NOT_STARTED      0xC0000192
+#define STATUS_ACCOUNT_EXPIRED           0xC0000193
+#define STATUS_POSSIBLE_DEADLOCK         0xC0000194
+#define STATUS_NETWORK_CREDENTIAL_CONFLICT 0xC0000195
+#define STATUS_REMOTE_SESSION_LIMIT      0xC0000196
+#define STATUS_EVENTLOG_FILE_CHANGED     0xC0000197
+#define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT 0xC0000198
+#define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT 0xC0000199
+#define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT 0xC000019A
+#define STATUS_DOMAIN_TRUST_INCONSISTENT 0xC000019B
+#define STATUS_FS_DRIVER_REQUIRED        0xC000019C
+
+#define STATUS_RESOURCE_LANG_NOT_FOUND   0xC0000204
+
+#define MAXIMUM_WAIT_OBJECTS 64
+#define MAXIMUM_SUSPEND_COUNT 127
 
-#define EXCEPTION_ACCESS_VIOLATION      STATUS_ACCESS_VIOLATION
-#define EXCEPTION_DATATYPE_MISALIGNMENT STATUS_DATATYPE_MISALIGNMENT
-#define EXCEPTION_BREAKPOINT            STATUS_BREAKPOINT
-#define EXCEPTION_SINGLE_STEP           STATUS_SINGLE_STEP
-#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED STATUS_ARRAY_BOUNDS_EXCEEDED
-#define EXCEPTION_FLT_DENORMAL_OPERAND  STATUS_FLOAT_DENORMAL_OPERAND
-#define EXCEPTION_FLT_DIVIDE_BY_ZERO    STATUS_FLOAT_DIVIDE_BY_ZERO
-#define EXCEPTION_FLT_INEXACT_RESULT    STATUS_FLOAT_INEXACT_RESULT
-#define EXCEPTION_FLT_INVALID_OPERATION STATUS_FLOAT_INVALID_OPERATION
-#define EXCEPTION_FLT_OVERFLOW          STATUS_FLOAT_OVERFLOW
-#define EXCEPTION_FLT_STACK_CHECK       STATUS_FLOAT_STACK_CHECK
-#define EXCEPTION_FLT_UNDERFLOW         STATUS_FLOAT_UNDERFLOW
-#define EXCEPTION_INT_DIVIDE_BY_ZERO    STATUS_INTEGER_DIVIDE_BY_ZERO
-#define EXCEPTION_INT_OVERFLOW          STATUS_INTEGER_OVERFLOW
-#define EXCEPTION_PRIV_INSTRUCTION      STATUS_PRIVILEGED_INSTRUCTION
-#define EXCEPTION_IN_PAGE_ERROR         STATUS_IN_PAGE_ERROR
 
 /*
  * Return values from the actual exception handlers
@@ -248,61 +1332,1777 @@ typedef struct _EXCEPTION_POINTERS
   PCONTEXT           ContextRecord;
 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
 
+
+/*
+ * The exception frame, used for registering exception handlers 
+ * Win32 cares only about this, but compilers generally emit 
+ * larger exception frames for their own use.
+ */
+
+struct __EXCEPTION_FRAME;
+
+typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct __EXCEPTION_FRAME*,
+                                    PCONTEXT,struct __EXCEPTION_FRAME **);
+
+typedef struct __EXCEPTION_FRAME
+{
+  struct __EXCEPTION_FRAME *Prev;
+  PEXCEPTION_HANDLER       Handler;
+} EXCEPTION_FRAME, *PEXCEPTION_FRAME;
+
+#include "poppack.h"
+
 /*
  * function pointer to a exception filter
  */
 
-typedef LONG (CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
+typedef LONG CALLBACK (*PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
 
 DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
 LPTOP_LEVEL_EXCEPTION_FILTER
 WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
 
-/* Language IDs */
+/* status values for ContinueDebugEvent */
+#define DBG_CONTINUE                0x00010002
+#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 LANG_NEUTRAL                     0x00
-#define LANG_ARABIC                      0x01
-#define LANG_AFRIKAANS                   0x36
-#define LANG_ALBANIAN                    0x1c
-#define LANG_BASQUE                      0x2d
-#define LANG_BULGARIAN                   0x02
-#define LANG_BYELORUSSIAN                0x23
-#define LANG_CATALAN                     0x03
-#define LANG_CHINESE                     0x04
-#define LANG_CROATIAN                    0x1a
-#define LANG_CZECH                       0x05
-#define LANG_DANISH                      0x06
-#define LANG_DUTCH                       0x13
-#define LANG_ENGLISH                     0x09
-#define LANG_ESTONIAN                    0x25
-#define LANG_FAEROESE                    0x38
-#define LANG_FARSI                       0x29
-#define LANG_FINNISH                     0x0b
-#define LANG_FRENCH                      0x0c
-#define LANG_GERMAN                      0x07
-#define LANG_GREEK                       0x08
-#define LANG_HEBREW                      0x0D
-#define LANG_HUNGARIAN                   0x0e
-#define LANG_ICELANDIC                   0x0f
-#define LANG_INDONESIAN                  0x21
-#define LANG_ITALIAN                     0x10
-#define LANG_JAPANESE                    0x11
-#define LANG_KOREAN                      0x12
-#define LANG_LATVIAN                     0x26
-#define LANG_LITHUANIAN                  0x27
-#define LANG_NORWEGIAN                   0x14
-#define LANG_POLISH                      0x15
-#define LANG_PORTUGUESE                  0x16
-#define LANG_ROMANIAN                    0x18
-#define LANG_RUSSIAN                     0x19
-#define LANG_SLOVAK                      0x1b
-#define LANG_SLOVENIAN                   0x24
-#define LANG_SORBIAN                     0x2e
-#define LANG_SPANISH                     0x0a
-#define LANG_SWEDISH                     0x1d
-#define LANG_THAI                        0x1e
-#define LANG_TURKISH                     0x1f
-#define LANG_UKRAINIAN                   0x22
+typedef struct _NT_TIB 
+{
+       struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
+       PVOID StackBase;
+       PVOID StackLimit;
+       PVOID SubSystemTib;
+       union {
+          PVOID FiberData;
+          DWORD Version;
+       } DUMMYUNIONNAME;
+       PVOID ArbitraryUserPointer;
+       struct _NT_TIB *Self;
+} NT_TIB, *PNT_TIB;
+
+struct _TEB;
+
+#if defined(__i386__) && defined(__GNUC__)
+extern inline struct _TEB WINAPI *NtCurrentTeb(void);
+extern inline struct _TEB WINAPI *NtCurrentTeb(void)
+{
+    struct _TEB *teb;
+    __asm__(".byte 0x64\n\tmovl (0x18),%0" : "=r" (teb));
+    return teb;
+}
+#else
+extern struct _TEB WINAPI *NtCurrentTeb(void);
+#endif
+
+
+/*
+ * File formats definitions
+ */
+
+typedef struct _IMAGE_DOS_HEADER {
+    WORD  e_magic;      /* 00: MZ Header signature */
+    WORD  e_cblp;       /* 02: Bytes on last page of file */
+    WORD  e_cp;         /* 04: Pages in file */
+    WORD  e_crlc;       /* 06: Relocations */
+    WORD  e_cparhdr;    /* 08: Size of header in paragraphs */
+    WORD  e_minalloc;   /* 0a: Minimum extra paragraphs needed */
+    WORD  e_maxalloc;   /* 0c: Maximum extra paragraphs needed */
+    WORD  e_ss;         /* 0e: Initial (relative) SS value */
+    WORD  e_sp;         /* 10: Initial SP value */
+    WORD  e_csum;       /* 12: Checksum */
+    WORD  e_ip;         /* 14: Initial IP value */
+    WORD  e_cs;         /* 16: Initial (relative) CS value */
+    WORD  e_lfarlc;     /* 18: File address of relocation table */
+    WORD  e_ovno;       /* 1a: Overlay number */
+    WORD  e_res[4];     /* 1c: Reserved words */
+    WORD  e_oemid;      /* 24: OEM identifier (for e_oeminfo) */
+    WORD  e_oeminfo;    /* 26: OEM information; e_oemid specific */
+    WORD  e_res2[10];   /* 28: Reserved words */
+    DWORD e_lfanew;     /* 3c: Offset to extended header */
+} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
+
+#define IMAGE_DOS_SIGNATURE    0x5A4D     /* MZ   */
+#define IMAGE_OS2_SIGNATURE    0x454E     /* NE   */
+#define IMAGE_OS2_SIGNATURE_LE 0x454C     /* LE   */
+#define IMAGE_OS2_SIGNATURE_LX 0x584C     /* LX */
+#define IMAGE_VXD_SIGNATURE    0x454C     /* LE   */
+#define IMAGE_NT_SIGNATURE     0x00004550 /* PE00 */
+
+/*
+ * This is the Windows executable (NE) header.
+ * the name IMAGE_OS2_HEADER is misleading, but in the SDK this way.
+ */
+typedef struct 
+{
+    WORD  ne_magic;             /* 00 NE signature 'NE' */
+    BYTE  ne_ver;               /* 02 Linker version number */
+    BYTE  ne_rev;               /* 03 Linker revision number */
+    WORD  ne_enttab;            /* 04 Offset to entry table relative to NE */
+    WORD  ne_cbenttab;          /* 06 Length of entry table in bytes */
+    LONG  ne_crc;               /* 08 Checksum */
+    WORD  ne_flags;             /* 0c Flags about segments in this file */
+    WORD  ne_autodata;          /* 0e Automatic data segment number */
+    WORD  ne_heap;              /* 10 Initial size of local heap */
+    WORD  ne_stack;             /* 12 Initial size of stack */
+    DWORD ne_csip;              /* 14 Initial CS:IP */
+    DWORD ne_sssp;              /* 18 Initial SS:SP */
+    WORD  ne_cseg;              /* 1c # of entries in segment table */
+    WORD  ne_cmod;              /* 1e # of entries in module reference tab. */
+    WORD  ne_cbnrestab;         /* 20 Length of nonresident-name table     */
+    WORD  ne_segtab;            /* 22 Offset to segment table */
+    WORD  ne_rsrctab;           /* 24 Offset to resource table */
+    WORD  ne_restab;            /* 26 Offset to resident-name table */
+    WORD  ne_modtab;            /* 28 Offset to module reference table */
+    WORD  ne_imptab;            /* 2a Offset to imported name table */
+    DWORD ne_nrestab;           /* 2c Offset to nonresident-name table */
+    WORD  ne_cmovent;           /* 30 # of movable entry points */
+    WORD  ne_align;             /* 32 Logical sector alignment shift count */
+    WORD  ne_cres;              /* 34 # of resource segments */
+    BYTE  ne_exetyp;            /* 36 Flags indicating target OS */
+    BYTE  ne_flagsothers;       /* 37 Additional information flags */
+    WORD  fastload_offset;      /* 38 Offset to fast load area (should be ne_pretthunks)*/
+    WORD  fastload_length;      /* 3a Length of fast load area (should be ne_psegrefbytes) */
+    WORD  ne_swaparea;          /* 3c Reserved by Microsoft */
+    WORD  ne_expver;            /* 3e Expected Windows version number */
+} IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;
+
+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;
+
+
+/* These defines describe the meanings of the bits in the Characteristics
+   field */
+
+#define IMAGE_FILE_RELOCS_STRIPPED     0x0001 /* No relocation info */
+#define IMAGE_FILE_EXECUTABLE_IMAGE    0x0002
+#define IMAGE_FILE_LINE_NUMS_STRIPPED   0x0004
+#define IMAGE_FILE_LOCAL_SYMS_STRIPPED  0x0008
+#define IMAGE_FILE_16BIT_MACHINE       0x0040
+#define IMAGE_FILE_BYTES_REVERSED_LO   0x0080
+#define IMAGE_FILE_32BIT_MACHINE       0x0100
+#define IMAGE_FILE_DEBUG_STRIPPED      0x0200
+#define IMAGE_FILE_SYSTEM              0x1000
+#define IMAGE_FILE_DLL                 0x2000
+#define IMAGE_FILE_BYTES_REVERSED_HI   0x8000
+
+/* These are the settings of the Machine field. */
+#define        IMAGE_FILE_MACHINE_UNKNOWN      0
+#define        IMAGE_FILE_MACHINE_I860         0x14d
+#define        IMAGE_FILE_MACHINE_I386         0x14c
+#define        IMAGE_FILE_MACHINE_R3000        0x162
+#define        IMAGE_FILE_MACHINE_R4000        0x166
+#define        IMAGE_FILE_MACHINE_R10000       0x168
+#define        IMAGE_FILE_MACHINE_ALPHA        0x184
+#define        IMAGE_FILE_MACHINE_POWERPC      0x1F0  
+
+#define        IMAGE_SIZEOF_FILE_HEADER        20
+
+/* Possible Magic values */
+#define IMAGE_NT_OPTIONAL_HDR_MAGIC        0x10b
+#define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
+
+/* These are indexes into the DataDirectory array */
+#define IMAGE_FILE_EXPORT_DIRECTORY            0
+#define IMAGE_FILE_IMPORT_DIRECTORY            1
+#define IMAGE_FILE_RESOURCE_DIRECTORY          2
+#define IMAGE_FILE_EXCEPTION_DIRECTORY         3
+#define IMAGE_FILE_SECURITY_DIRECTORY          4
+#define IMAGE_FILE_BASE_RELOCATION_TABLE       5
+#define IMAGE_FILE_DEBUG_DIRECTORY             6
+#define IMAGE_FILE_DESCRIPTION_STRING          7
+#define IMAGE_FILE_MACHINE_VALUE               8  /* Mips */
+#define IMAGE_FILE_THREAD_LOCAL_STORAGE                9
+#define IMAGE_FILE_CALLBACK_DIRECTORY          10
+
+/* Directory Entries, indices into the DataDirectory array */
+
+#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_GLOBALPTR         8   /* (MIPS GP) */
+#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  /* Import Address Table */
+#define        IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT      13
+#define        IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR    14
+
+/* Subsystem Values */
+
+#define        IMAGE_SUBSYSTEM_UNKNOWN         0
+#define        IMAGE_SUBSYSTEM_NATIVE          1
+#define        IMAGE_SUBSYSTEM_WINDOWS_GUI     2       /* Windows GUI subsystem */
+#define        IMAGE_SUBSYSTEM_WINDOWS_CUI     3       /* Windows character subsystem*/
+#define        IMAGE_SUBSYSTEM_OS2_CUI         5
+#define        IMAGE_SUBSYSTEM_POSIX_CUI       7
+
+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;
+
+#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
+
+typedef struct _IMAGE_OPTIONAL_HEADER {
+
+  /* Standard fields */
+
+  WORD  Magic;
+  BYTE  MajorLinkerVersion;
+  BYTE  MinorLinkerVersion;
+  DWORD SizeOfCode;
+  DWORD SizeOfInitializedData;
+  DWORD SizeOfUninitializedData;
+  DWORD AddressOfEntryPoint;
+  DWORD BaseOfCode;
+  DWORD BaseOfData;
+
+  /* NT additional fields */
+
+  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_HEADER, *PIMAGE_OPTIONAL_HEADER;
+
+typedef struct _IMAGE_NT_HEADERS {
+  DWORD Signature;
+  IMAGE_FILE_HEADER FileHeader;
+  IMAGE_OPTIONAL_HEADER OptionalHeader;
+} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
+
+#define IMAGE_SIZEOF_SHORT_NAME 8
+
+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;
+
+#define        IMAGE_SIZEOF_SECTION_HEADER 40
+
+#define IMAGE_FIRST_SECTION(ntheader) \
+  ((PIMAGE_SECTION_HEADER)((LPBYTE)&((PIMAGE_NT_HEADERS)(ntheader))->OptionalHeader + \
+                           ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader))
+
+/* These defines are for the Characteristics bitfield. */
+/* #define IMAGE_SCN_TYPE_REG                  0x00000000 - Reserved */
+/* #define IMAGE_SCN_TYPE_DSECT                        0x00000001 - Reserved */
+/* #define IMAGE_SCN_TYPE_NOLOAD               0x00000002 - Reserved */
+/* #define IMAGE_SCN_TYPE_GROUP                        0x00000004 - Reserved */
+/* #define IMAGE_SCN_TYPE_NO_PAD               0x00000008 - Reserved */
+/* #define IMAGE_SCN_TYPE_COPY                 0x00000010 - Reserved */
+
+#define IMAGE_SCN_CNT_CODE                     0x00000020
+#define IMAGE_SCN_CNT_INITIALIZED_DATA         0x00000040
+#define IMAGE_SCN_CNT_UNINITIALIZED_DATA       0x00000080
+
+#define        IMAGE_SCN_LNK_OTHER                     0x00000100 
+#define        IMAGE_SCN_LNK_INFO                      0x00000200  
+/* #define     IMAGE_SCN_TYPE_OVER             0x00000400 - Reserved */
+#define        IMAGE_SCN_LNK_REMOVE                    0x00000800
+#define        IMAGE_SCN_LNK_COMDAT                    0x00001000
+
+/*                                             0x00002000 - Reserved */
+/* #define IMAGE_SCN_MEM_PROTECTED             0x00004000 - Obsolete */
+#define        IMAGE_SCN_MEM_FARDATA                   0x00008000
+
+/* #define IMAGE_SCN_MEM_SYSHEAP               0x00010000 - Obsolete */
+#define        IMAGE_SCN_MEM_PURGEABLE                 0x00020000
+#define        IMAGE_SCN_MEM_16BIT                     0x00020000
+#define        IMAGE_SCN_MEM_LOCKED                    0x00040000
+#define        IMAGE_SCN_MEM_PRELOAD                   0x00080000
+
+#define        IMAGE_SCN_ALIGN_1BYTES                  0x00100000
+#define        IMAGE_SCN_ALIGN_2BYTES                  0x00200000
+#define        IMAGE_SCN_ALIGN_4BYTES                  0x00300000
+#define        IMAGE_SCN_ALIGN_8BYTES                  0x00400000
+#define        IMAGE_SCN_ALIGN_16BYTES                 0x00500000  /* Default */
+#define IMAGE_SCN_ALIGN_32BYTES                        0x00600000
+#define IMAGE_SCN_ALIGN_64BYTES                        0x00700000
+/*                                             0x00800000 - Unused */
+
+#define IMAGE_SCN_LNK_NRELOC_OVFL              0x01000000
+
+
+#define IMAGE_SCN_MEM_DISCARDABLE              0x02000000
+#define IMAGE_SCN_MEM_NOT_CACHED               0x04000000
+#define IMAGE_SCN_MEM_NOT_PAGED                        0x08000000
+#define IMAGE_SCN_MEM_SHARED                   0x10000000
+#define IMAGE_SCN_MEM_EXECUTE                  0x20000000
+#define IMAGE_SCN_MEM_READ                     0x40000000
+#define IMAGE_SCN_MEM_WRITE                    0x80000000
+
+#include "pshpack2.h"
+
+typedef struct _IMAGE_SYMBOL {
+    union {
+        BYTE    ShortName[8];
+        struct {
+            DWORD   Short;
+            DWORD   Long;
+        } Name;
+        DWORD   LongName[2];
+    } N;
+    DWORD   Value;
+    SHORT   SectionNumber;
+    WORD    Type;
+    BYTE    StorageClass;
+    BYTE    NumberOfAuxSymbols;
+} IMAGE_SYMBOL;
+typedef IMAGE_SYMBOL *PIMAGE_SYMBOL;
+
+#define IMAGE_SIZEOF_SYMBOL 18
+
+typedef struct _IMAGE_LINENUMBER {
+    union {
+        DWORD   SymbolTableIndex;
+        DWORD   VirtualAddress;
+    } Type;
+    WORD    Linenumber;
+} IMAGE_LINENUMBER;
+typedef IMAGE_LINENUMBER *PIMAGE_LINENUMBER;
+
+#define IMAGE_SIZEOF_LINENUMBER  6
+
+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;
+typedef IMAGE_AUX_SYMBOL *PIMAGE_AUX_SYMBOL;
+
+#define IMAGE_SIZEOF_AUX_SYMBOL 18
+
+#include "poppack.h"
+
+#define IMAGE_SYM_UNDEFINED           (SHORT)0
+#define IMAGE_SYM_ABSOLUTE            (SHORT)-1
+#define IMAGE_SYM_DEBUG               (SHORT)-2
+
+#define IMAGE_SYM_TYPE_NULL                 0x0000
+#define IMAGE_SYM_TYPE_VOID                 0x0001
+#define IMAGE_SYM_TYPE_CHAR                 0x0002
+#define IMAGE_SYM_TYPE_SHORT                0x0003
+#define IMAGE_SYM_TYPE_INT                  0x0004
+#define IMAGE_SYM_TYPE_LONG                 0x0005
+#define IMAGE_SYM_TYPE_FLOAT                0x0006
+#define IMAGE_SYM_TYPE_DOUBLE               0x0007
+#define IMAGE_SYM_TYPE_STRUCT               0x0008
+#define IMAGE_SYM_TYPE_UNION                0x0009
+#define IMAGE_SYM_TYPE_ENUM                 0x000A
+#define IMAGE_SYM_TYPE_MOE                  0x000B
+#define IMAGE_SYM_TYPE_BYTE                 0x000C
+#define IMAGE_SYM_TYPE_WORD                 0x000D
+#define IMAGE_SYM_TYPE_UINT                 0x000E
+#define IMAGE_SYM_TYPE_DWORD                0x000F
+#define IMAGE_SYM_TYPE_PCODE                0x8000
+
+#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     (BYTE )-1
+#define IMAGE_SYM_CLASS_NULL                0x0000
+#define IMAGE_SYM_CLASS_AUTOMATIC           0x0001
+#define IMAGE_SYM_CLASS_EXTERNAL            0x0002
+#define IMAGE_SYM_CLASS_STATIC              0x0003
+#define IMAGE_SYM_CLASS_REGISTER            0x0004
+#define IMAGE_SYM_CLASS_EXTERNAL_DEF        0x0005
+#define IMAGE_SYM_CLASS_LABEL               0x0006
+#define IMAGE_SYM_CLASS_UNDEFINED_LABEL     0x0007
+#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT    0x0008
+#define IMAGE_SYM_CLASS_ARGUMENT            0x0009
+#define IMAGE_SYM_CLASS_STRUCT_TAG          0x000A
+#define IMAGE_SYM_CLASS_MEMBER_OF_UNION     0x000B
+#define IMAGE_SYM_CLASS_UNION_TAG           0x000C
+#define IMAGE_SYM_CLASS_TYPE_DEFINITION     0x000D
+#define IMAGE_SYM_CLASS_UNDEFINED_STATIC    0x000E
+#define IMAGE_SYM_CLASS_ENUM_TAG            0x000F
+#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM      0x0010
+#define IMAGE_SYM_CLASS_REGISTER_PARAM      0x0011
+#define IMAGE_SYM_CLASS_BIT_FIELD           0x0012
+
+#define IMAGE_SYM_CLASS_FAR_EXTERNAL        0x0044
+#define IMAGE_SYM_CLASS_BLOCK               0x0064
+#define IMAGE_SYM_CLASS_FUNCTION            0x0065
+#define IMAGE_SYM_CLASS_END_OF_STRUCT       0x0066
+#define IMAGE_SYM_CLASS_FILE                0x0067
+#define IMAGE_SYM_CLASS_SECTION             0x0068
+#define IMAGE_SYM_CLASS_WEAK_EXTERNAL       0x0069
+
+#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 BTYPE(x) ((x) & N_BTMASK)
+
+#ifndef ISPTR
+#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
+#endif
+
+#ifndef ISFCN
+#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
+#endif
+
+#ifndef ISARY
+#define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))
+#endif
+
+#ifndef ISTAG
+#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)
+#endif
+
+#ifndef INCREF
+#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
+#endif
+#ifndef DECREF
+#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
+#endif
+
+#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
+
+#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1
+#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2
+#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3
+
+/* Export module directory */
+
+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;
+
+/* Import name entry */
+typedef struct _IMAGE_IMPORT_BY_NAME {
+       WORD    Hint;
+       BYTE    Name[1];
+} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
+
+/* Import thunk */
+typedef struct _IMAGE_THUNK_DATA {
+       union {
+               LPBYTE    ForwarderString;
+               FARPROC Function;
+               DWORD     Ordinal;
+               PIMAGE_IMPORT_BY_NAME   AddressOfData;
+       } u1;
+} IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;
+
+/* Import module directory */
+
+typedef struct _IMAGE_IMPORT_DESCRIPTOR {
+       union {
+               DWORD   Characteristics; /* 0 for terminating null import descriptor  */
+               PIMAGE_THUNK_DATA OriginalFirstThunk;   /* RVA to original unbound IAT */
+       } u;
+       DWORD   TimeDateStamp;  /* 0 if not bound,
+                                * -1 if bound, and real date\time stamp
+                                *    in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
+                                * (new BIND)
+                                * otherwise date/time stamp of DLL bound to
+                                * (Old BIND)
+                                */
+       DWORD   ForwarderChain; /* -1 if no forwarders */
+       DWORD   Name;
+       /* RVA to IAT (if bound this IAT has actual addresses) */
+       PIMAGE_THUNK_DATA FirstThunk;   
+} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
+
+#define        IMAGE_ORDINAL_FLAG              0x80000000
+#define        IMAGE_SNAP_BY_ORDINAL(Ordinal)  ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
+#define        IMAGE_ORDINAL(Ordinal)          (Ordinal & 0xffff)
+
+typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR
+{
+    DWORD   TimeDateStamp;
+    WORD    OffsetModuleName;
+    WORD    NumberOfModuleForwarderRefs;
+/* Array of zero or more IMAGE_BOUND_FORWARDER_REF follows */
+} 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 struct _IMAGE_BASE_RELOCATION
+{
+       DWORD   VirtualAddress;
+       DWORD   SizeOfBlock;
+       WORD    TypeOffset[1];
+} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
+
+typedef struct _IMAGE_RELOCATION
+{
+    union {
+        DWORD   VirtualAddress;
+        DWORD   RelocCount;
+    } u;
+    DWORD   SymbolTableIndex;
+    WORD    Type;
+} IMAGE_RELOCATION;
+typedef IMAGE_RELOCATION *PIMAGE_RELOCATION;
+
+#define IMAGE_SIZEOF_RELOCATION 10
+
+/* generic relocation types */
+#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_REL_BASED_SECTION                        6
+#define        IMAGE_REL_BASED_REL                     7
+#define IMAGE_REL_BASED_MIPS_JMPADDR16         9
+#define IMAGE_REL_BASED_IA64_IMM64             9 /* yes, 9 too */
+#define IMAGE_REL_BASED_DIR64                  10
+#define IMAGE_REL_BASED_HIGH3ADJ               11
+
+/* I386 relocation types */
+#define        IMAGE_REL_I386_ABSOLUTE                 0
+#define        IMAGE_REL_I386_DIR16                    1
+#define        IMAGE_REL_I386_REL16                    2
+#define        IMAGE_REL_I386_DIR32                    6
+#define        IMAGE_REL_I386_DIR32NB                  7
+#define        IMAGE_REL_I386_SEG12                    9
+#define        IMAGE_REL_I386_SECTION                  10
+#define        IMAGE_REL_I386_SECREL                   11
+#define        IMAGE_REL_I386_REL32                    20
+
+/* MIPS relocation types */
+#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
+
+/* ALPHA relocation types */
+#define IMAGE_REL_ALPHA_ABSOLUTE       0x0000
+#define IMAGE_REL_ALPHA_REFLONG                0x0001
+#define IMAGE_REL_ALPHA_REFQUAD                0x0002
+#define IMAGE_REL_ALPHA_GPREL          0x0003
+#define IMAGE_REL_ALPHA_LITERAL                0x0004
+#define IMAGE_REL_ALPHA_LITUSE         0x0005
+#define IMAGE_REL_ALPHA_GPDISP         0x0006
+#define IMAGE_REL_ALPHA_BRADDR         0x0007
+#define IMAGE_REL_ALPHA_HINT           0x0008
+#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009
+#define IMAGE_REL_ALPHA_REFHI          0x000A
+#define IMAGE_REL_ALPHA_REFLO          0x000B
+#define IMAGE_REL_ALPHA_PAIR           0x000C
+#define IMAGE_REL_ALPHA_MATCH          0x000D
+#define IMAGE_REL_ALPHA_SECTION                0x000E
+#define IMAGE_REL_ALPHA_SECREL         0x000F
+#define IMAGE_REL_ALPHA_REFLONGNB      0x0010
+#define IMAGE_REL_ALPHA_SECRELLO       0x0011
+#define IMAGE_REL_ALPHA_SECRELHI       0x0012
+#define IMAGE_REL_ALPHA_REFQ3          0x0013
+#define IMAGE_REL_ALPHA_REFQ2          0x0014
+#define IMAGE_REL_ALPHA_REFQ1          0x0015
+#define IMAGE_REL_ALPHA_GPRELLO                0x0016
+#define IMAGE_REL_ALPHA_GPRELHI                0x0017
+
+/* PowerPC relocation types */
+#define IMAGE_REL_PPC_ABSOLUTE          0x0000
+#define IMAGE_REL_PPC_ADDR64            0x0001
+#define IMAGE_REL_PPC_ADDR            0x0002
+#define IMAGE_REL_PPC_ADDR24            0x0003
+#define IMAGE_REL_PPC_ADDR16            0x0004
+#define IMAGE_REL_PPC_ADDR14            0x0005
+#define IMAGE_REL_PPC_REL24             0x0006
+#define IMAGE_REL_PPC_REL14             0x0007
+#define IMAGE_REL_PPC_TOCREL16          0x0008
+#define IMAGE_REL_PPC_TOCREL14          0x0009
+#define IMAGE_REL_PPC_ADDR32NB          0x000A
+#define IMAGE_REL_PPC_SECREL            0x000B
+#define IMAGE_REL_PPC_SECTION           0x000C
+#define IMAGE_REL_PPC_IFGLUE            0x000D
+#define IMAGE_REL_PPC_IMGLUE            0x000E
+#define IMAGE_REL_PPC_SECREL16          0x000F
+#define IMAGE_REL_PPC_REFHI             0x0010
+#define IMAGE_REL_PPC_REFLO             0x0011
+#define IMAGE_REL_PPC_PAIR              0x0012
+#define IMAGE_REL_PPC_SECRELLO          0x0013
+#define IMAGE_REL_PPC_SECRELHI          0x0014
+#define IMAGE_REL_PPC_GPREL            0x0015
+#define IMAGE_REL_PPC_TYPEMASK          0x00FF
+/* modifier bits */
+#define IMAGE_REL_PPC_NEG               0x0100
+#define IMAGE_REL_PPC_BRTAKEN           0x0200
+#define IMAGE_REL_PPC_BRNTAKEN          0x0400
+#define IMAGE_REL_PPC_TOCDEFN           0x0800
+
+/* SH3 ? relocation type */
+#define IMAGE_REL_SH3_ABSOLUTE          0x0000
+#define IMAGE_REL_SH3_DIRECT16          0x0001
+#define IMAGE_REL_SH3_DIRECT          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
+
+/* ARM (Archimedes?) relocation types */
+#define IMAGE_REL_ARM_ABSOLUTE         0x0000
+#define IMAGE_REL_ARM_ADDR             0x0001
+#define IMAGE_REL_ARM_ADDR32NB         0x0002
+#define IMAGE_REL_ARM_BRANCH24         0x0003
+#define IMAGE_REL_ARM_BRANCH11         0x0004
+#define IMAGE_REL_ARM_SECTION          0x000E
+#define IMAGE_REL_ARM_SECREL           0x000F
+
+/* IA64 relocation types */
+#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_DIR             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_SECREL          0x000E
+#define IMAGE_REL_IA64_LTOFF64         0x000F
+#define IMAGE_REL_IA64_DIR32NB         0x0010
+#define IMAGE_REL_IA64_RESERVED_11     0x0011
+#define IMAGE_REL_IA64_RESERVED_12     0x0012
+#define IMAGE_REL_IA64_RESERVED_13     0x0013
+#define IMAGE_REL_IA64_RESERVED_14     0x0014
+#define IMAGE_REL_IA64_RESERVED_15     0x0015
+#define IMAGE_REL_IA64_RESERVED_16     0x0016
+#define IMAGE_REL_IA64_ADDEND          0x001F
+
+/* archive format */
+
+#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       "//              "
+
+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;
+
+#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
+
+/*
+ * Resource directory stuff
+ */
+typedef struct _IMAGE_RESOURCE_DIRECTORY {
+       DWORD   Characteristics;
+       DWORD   TimeDateStamp;
+       WORD    MajorVersion;
+       WORD    MinorVersion;
+       WORD    NumberOfNamedEntries;
+       WORD    NumberOfIdEntries;
+       /*  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; */
+} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
+
+#define        IMAGE_RESOURCE_NAME_IS_STRING           0x80000000
+#define        IMAGE_RESOURCE_DATA_IS_DIRECTORY        0x80000000
+
+typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
+       union {
+               struct {
+                       unsigned NameOffset:31;
+                       unsigned NameIsString:1;
+               } DUMMYSTRUCTNAME1;
+               DWORD   Name;
+               WORD    Id;
+       } DUMMYUNIONNAME1;
+       union {
+               DWORD   OffsetToData;
+               struct {
+                       unsigned OffsetToDirectory:31;
+                       unsigned 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   ResourceHandle;
+} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
+
+
+typedef VOID CALLBACK (*PIMAGE_TLS_CALLBACK)(
+       LPVOID DllHandle,DWORD Reason,LPVOID Reserved
+);
+
+typedef struct _IMAGE_TLS_DIRECTORY {
+       DWORD   StartAddressOfRawData;
+       DWORD   EndAddressOfRawData;
+       LPDWORD AddressOfIndex;
+       PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
+       DWORD   SizeOfZeroFill;
+       DWORD   Characteristics;
+} IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY;
+
+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;
+
+#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 IMAGE_DEBUG_TYPE_RESERVED10    10
+
+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;
+
+#define FRAME_FPO       0
+#define FRAME_TRAP      1
+#define FRAME_TSS       2
+#define FRAME_NONFPO    3
+
+typedef struct _FPO_DATA {
+  DWORD ulOffStart;
+  DWORD cbProcSize;
+  DWORD cdwLocals;
+  WORD  cdwParams;
+  unsigned cbProlog : 8;
+  unsigned cbRegs   : 3;
+  unsigned fHasSEH  : 1;
+  unsigned fUseBP   : 1;
+  unsigned reserved : 1;
+  unsigned cbFrame  : 2;
+} FPO_DATA, *PFPO_DATA;
+
+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 ProcessAffinityMask;
+  WORD  CSDVersion;
+  WORD  Reserved1;
+  PVOID EditList;
+  DWORD Reserved[1];
+} IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;
+
+typedef struct _IMAGE_FUNCTION_ENTRY {
+  DWORD StartingAddress;
+  DWORD EndingAddress;
+  DWORD EndOfPrologue;
+} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
+
+#define IMAGE_DEBUG_MISC_EXENAME    1
+typedef struct _IMAGE_DEBUG_MISC {
+    DWORD       DataType;
+    DWORD       Length;
+    BYTE        Unicode;
+    BYTE        Reserved[ 3 ];
+    BYTE        Data[ 1 ];
+} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
+
+/* This is the structure that appears at the very start of a .DBG file. */
+
+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;
+
+#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
+
+
+typedef struct tagMESSAGE_RESOURCE_ENTRY {
+       WORD    Length;
+       WORD    Flags;
+       BYTE    Text[1];
+} MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY;
+#define        MESSAGE_RESOURCE_UNICODE        0x0001
+
+typedef struct tagMESSAGE_RESOURCE_BLOCK {
+       DWORD   LowId;
+       DWORD   HighId;
+       DWORD   OffsetToEntries;
+} MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK;
+
+typedef struct tagMESSAGE_RESOURCE_DATA {
+       DWORD                   NumberOfBlocks;
+       MESSAGE_RESOURCE_BLOCK  Blocks[ 1 ];
+} MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;
+
+/*
+ * Here follows typedefs for security and tokens.
+ */ 
+
+/*
+ * First a constant for the following typdefs.
+ */
+
+#define ANYSIZE_ARRAY   1
+
+/* FIXME:  Orphan.  What does it point to? */
+typedef PVOID PACCESS_TOKEN;
+
+/*
+ * TOKEN_INFORMATION_CLASS
+ */
+
+typedef enum _TOKEN_INFORMATION_CLASS {
+  TokenUser = 1, 
+  TokenGroups, 
+  TokenPrivileges, 
+  TokenOwner, 
+  TokenPrimaryGroup, 
+  TokenDefaultDacl, 
+  TokenSource, 
+  TokenType, 
+  TokenImpersonationLevel, 
+  TokenStatistics 
+} TOKEN_INFORMATION_CLASS; 
+
+#ifndef _SECURITY_DEFINED
+#define _SECURITY_DEFINED
+
+#include "pshpack1.h"
+
+typedef DWORD ACCESS_MASK, *PACCESS_MASK;
+
+typedef struct _GENERIC_MAPPING {
+    ACCESS_MASK GenericRead;
+    ACCESS_MASK GenericWrite;
+    ACCESS_MASK GenericExecute;
+    ACCESS_MASK GenericAll;
+} GENERIC_MAPPING, *PGENERIC_MAPPING;
+
+#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
+#define SID_IDENTIFIER_AUTHORITY_DEFINED
+typedef struct {
+    BYTE Value[6];
+} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
+#endif /* !defined(SID_IDENTIFIER_AUTHORITY_DEFINED) */
+
+#ifndef SID_DEFINED
+#define SID_DEFINED
+typedef struct _SID {
+    BYTE Revision;
+    BYTE SubAuthorityCount;
+    SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
+    DWORD SubAuthority[1];
+} SID,*PSID;
+#endif /* !defined(SID_DEFINED) */
+
+#define        SID_REVISION                    (1)     /* Current revision */
+#define        SID_MAX_SUB_AUTHORITIES         (15)    /* current max subauths */
+#define        SID_RECOMMENDED_SUB_AUTHORITIES (1)     /* recommended subauths */
+
+
+/* 
+ * ACL 
+ */
+
+#define ACL_REVISION1 1
+#define ACL_REVISION2 2
+#define ACL_REVISION3 3
+#define ACL_REVISION4 4
+
+#define MIN_ACL_REVISION ACL_REVISION2
+#define MAX_ACL_REVISION ACL_REVISION4
+
+typedef struct _ACL {
+    BYTE AclRevision;
+    BYTE Sbz1;
+    WORD AclSize;
+    WORD AceCount;
+    WORD Sbz2;
+} ACL, *PACL;
+
+/* SECURITY_DESCRIPTOR */
+#define        SECURITY_DESCRIPTOR_REVISION    1
+#define        SECURITY_DESCRIPTOR_REVISION1   1
+
+
+#define        SE_OWNER_DEFAULTED      0x0001
+#define        SE_GROUP_DEFAULTED      0x0002
+#define        SE_DACL_PRESENT         0x0004
+#define        SE_DACL_DEFAULTED       0x0008
+#define        SE_SACL_PRESENT         0x0010
+#define        SE_SACL_DEFAULTED       0x0020
+#define        SE_SELF_RELATIVE        0x8000
+
+typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
+typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
+
+/* The security descriptor structure */
+typedef struct {
+    BYTE Revision;
+    BYTE Sbz1;
+    SECURITY_DESCRIPTOR_CONTROL Control;
+    DWORD Owner;
+    DWORD Group;
+    DWORD Sacl;
+    DWORD Dacl;
+} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
+
+typedef struct {
+    BYTE Revision;
+    BYTE Sbz1;
+    SECURITY_DESCRIPTOR_CONTROL Control;
+    PSID Owner;
+    PSID Group;
+    PACL Sacl;
+    PACL Dacl;
+} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
+
+#define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR)) 
+
+#include "poppack.h"
+
+#endif /* _SECURITY_DEFINED */
+
+#include "pshpack1.h"
+
+/* 
+ * SID_AND_ATTRIBUTES
+ */
+
+typedef struct _SID_AND_ATTRIBUTES {
+  PSID  Sid; 
+  DWORD Attributes; 
+} SID_AND_ATTRIBUTES ; 
+/* security entities */
+#define SECURITY_NULL_RID                      (0x00000000L)
+#define SECURITY_WORLD_RID                     (0x00000000L)
+#define SECURITY_LOCAL_RID                     (0X00000000L)
+
+#define SECURITY_NULL_SID_AUTHORITY            {0,0,0,0,0,0}
+
+/* S-1-1 */
+#define SECURITY_WORLD_SID_AUTHORITY           {0,0,0,0,0,1}
+
+/* S-1-2 */
+#define SECURITY_LOCAL_SID_AUTHORITY           {0,0,0,0,0,2}
+
+/* S-1-3 */
+#define SECURITY_CREATOR_SID_AUTHORITY         {0,0,0,0,0,3}
+#define SECURITY_CREATOR_OWNER_RID             (0x00000000L) 
+#define SECURITY_CREATOR_GROUP_RID             (0x00000001L)
+#define SECURITY_CREATOR_OWNER_SERVER_RID      (0x00000002L)
+#define SECURITY_CREATOR_GROUP_SERVER_RID      (0x00000003L)
+
+/* S-1-4 */
+#define SECURITY_NON_UNIQUE_AUTHORITY          {0,0,0,0,0,4}
+
+/* S-1-5 */
+#define SECURITY_NT_AUTHORITY                  {0,0,0,0,0,5} 
+#define SECURITY_DIALUP_RID                     0x00000001L
+#define SECURITY_NETWORK_RID                    0x00000002L
+#define SECURITY_BATCH_RID                      0x00000003L
+#define SECURITY_INTERACTIVE_RID                0x00000004L
+#define SECURITY_LOGON_IDS_RID                  0x00000005L
+#define SECURITY_SERVICE_RID                    0x00000006L
+#define SECURITY_ANONYMOUS_LOGON_RID            0x00000007L
+#define SECURITY_PROXY_RID                      0x00000008L
+#define SECURITY_ENTERPRISE_CONTROLLERS_RID     0x00000009L
+#define SECURITY_PRINCIPAL_SELF_RID             0x0000000AL
+#define SECURITY_AUTHENTICATED_USER_RID         0x0000000BL
+#define SECURITY_RESTRICTED_CODE_RID            0x0000000CL
+#define SECURITY_TERMINAL_SERVER_RID            0x0000000DL
+#define SECURITY_LOCAL_SYSTEM_RID               0x00000012L
+#define SECURITY_NT_NON_UNIQUE                  0x00000015L
+#define SECURITY_BUILTIN_DOMAIN_RID             0x00000020L
+
+#define DOMAIN_GROUP_RID_ADMINS                 0x00000200L
+#define DOMAIN_GROUP_RID_USERS                  0x00000201L
+#define DOMAIN_GROUP_RID_GUESTS                 0x00000202L
+
+#define DOMAIN_ALIAS_RID_ADMINS                 0x00000220L
+#define DOMAIN_ALIAS_RID_USERS                  0x00000221L
+#define DOMAIN_ALIAS_RID_GUESTS                 0x00000222L
+
+#define SECURITY_SERVER_LOGON_RID              SECURITY_ENTERPRISE_CONTROLLERS_RID
+
+#define SECURITY_LOGON_IDS_RID_COUNT           (3L)
+
+/*
+ * TOKEN_USER
+ */
+
+typedef struct _TOKEN_USER {
+  SID_AND_ATTRIBUTES User; 
+} TOKEN_USER; 
+
+/*
+ * TOKEN_GROUPS
+ */
+
+typedef struct _TOKEN_GROUPS  {
+  DWORD GroupCount; 
+  SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; 
+} TOKEN_GROUPS; 
+
+/*
+ * LUID_AND_ATTRIBUTES
+ */
+
+typedef union _LARGE_INTEGER {
+    struct {
+        DWORD    LowPart;
+        LONG     HighPart;
+    } DUMMYSTRUCTNAME;
+    LONGLONG QuadPart;
+} LARGE_INTEGER, *LPLARGE_INTEGER, *PLARGE_INTEGER;
+
+typedef union _ULARGE_INTEGER {
+    struct {
+        DWORD    LowPart;
+        DWORD    HighPart;
+    } DUMMYSTRUCTNAME;
+    ULONGLONG QuadPart;
+} ULARGE_INTEGER, *LPULARGE_INTEGER, *PULARGE_INTEGER;
+
+/*
+ * Locally Unique Identifier
+ */
+
+typedef LARGE_INTEGER LUID,*PLUID;
+
+typedef struct _LUID_AND_ATTRIBUTES {
+  LUID   Luid; 
+  DWORD  Attributes; 
+} LUID_AND_ATTRIBUTES; 
+
+/*
+ * PRIVILEGE_SET
+ */
+
+typedef struct _PRIVILEGE_SET {
+    DWORD PrivilegeCount;
+    DWORD Control;
+    LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
+} PRIVILEGE_SET, *PPRIVILEGE_SET;
+
+/*
+ * TOKEN_PRIVILEGES
+ */
+
+typedef struct _TOKEN_PRIVILEGES {
+  DWORD PrivilegeCount; 
+  LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 
+} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 
+
+/*
+ * TOKEN_OWNER
+ */
+
+typedef struct _TOKEN_OWNER {
+  PSID Owner; 
+} TOKEN_OWNER; 
+
+/*
+ * TOKEN_PRIMARY_GROUP
+ */
+
+typedef struct _TOKEN_PRIMARY_GROUP {
+  PSID PrimaryGroup; 
+} TOKEN_PRIMARY_GROUP; 
+
+
+/*
+ * TOKEN_DEFAULT_DACL
+ */
+
+typedef struct _TOKEN_DEFAULT_DACL { 
+  PACL DefaultDacl; 
+} TOKEN_DEFAULT_DACL; 
+
+/*
+ * TOKEN_SOURCEL
+ */
+
+typedef struct _TOKEN_SOURCE {
+  char Sourcename[8]; 
+  LUID SourceIdentifier; 
+} TOKEN_SOURCE; 
+
+/*
+ * TOKEN_TYPE
+ */
+
+typedef enum tagTOKEN_TYPE {
+  TokenPrimary = 1, 
+  TokenImpersonation 
+} TOKEN_TYPE; 
+
+/*
+ * SECURITY_IMPERSONATION_LEVEL
+ */
+
+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;
+/*
+ *     Quality of Service
+ */
+
+typedef struct _SECURITY_QUALITY_OF_SERVICE {
+  DWORD                                Length;
+  SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+  SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
+  BOOL                         EffectiveOnly;
+} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
+
+/*
+ * TOKEN_STATISTICS
+ */
+
+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; 
+
+/* 
+ *     ACLs of NT 
+ */
+
+#define        ACL_REVISION    2
+
+#define        ACL_REVISION1   1
+#define        ACL_REVISION2   2
+
+/* ACEs, directly starting after an ACL */
+typedef struct _ACE_HEADER {
+       BYTE    AceType;
+       BYTE    AceFlags;
+       WORD    AceSize;
+} ACE_HEADER,*PACE_HEADER;
+
+/* AceType */
+#define        ACCESS_ALLOWED_ACE_TYPE         0
+#define        ACCESS_DENIED_ACE_TYPE          1
+#define        SYSTEM_AUDIT_ACE_TYPE           2
+#define        SYSTEM_ALARM_ACE_TYPE           3
+
+/* inherit AceFlags */
+#define        OBJECT_INHERIT_ACE              0x01
+#define        CONTAINER_INHERIT_ACE           0x02
+#define        NO_PROPAGATE_INHERIT_ACE        0x04
+#define        INHERIT_ONLY_ACE                0x08
+#define        VALID_INHERIT_FLAGS             0x0F
+
+/* AceFlags mask for what events we (should) audit */
+#define        SUCCESSFUL_ACCESS_ACE_FLAG      0x40
+#define        FAILED_ACCESS_ACE_FLAG          0x80
+
+/* different ACEs depending on AceType 
+ * SidStart marks the begin of a SID
+ * so the thing finally looks like this:
+ * 0: ACE_HEADER
+ * 4: ACCESS_MASK
+ * 8... : SID
+ */
+typedef struct _ACCESS_ALLOWED_ACE {
+       ACE_HEADER      Header;
+       DWORD           Mask;
+       DWORD           SidStart;
+} ACCESS_ALLOWED_ACE,*PACCESS_ALLOWED_ACE;
+
+typedef struct _ACCESS_DENIED_ACE {
+       ACE_HEADER      Header;
+       DWORD           Mask;
+       DWORD           SidStart;
+} ACCESS_DENIED_ACE,*PACCESS_DENIED_ACE;
+
+typedef struct _SYSTEM_AUDIT_ACE {
+       ACE_HEADER      Header;
+       DWORD           Mask;
+       DWORD           SidStart;
+} SYSTEM_AUDIT_ACE,*PSYSTEM_AUDIT_ACE;
+
+typedef struct _SYSTEM_ALARM_ACE {
+       ACE_HEADER      Header;
+       DWORD           Mask;
+       DWORD           SidStart;
+} SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;
+
+typedef enum tagSID_NAME_USE {
+       SidTypeUser = 1,
+       SidTypeGroup,
+       SidTypeDomain,
+       SidTypeAlias,
+       SidTypeWellKnownGroup,
+       SidTypeDeletedAccount,
+       SidTypeInvalid,
+       SidTypeUnknown
+} SID_NAME_USE,*PSID_NAME_USE;
+
+/* Access rights */
+
+/* DELETE may be already defined via /usr/include/arpa/nameser_compat.h */
+#undef  DELETE
+#define DELETE                     0x00010000
+#define READ_CONTROL               0x00020000
+#define WRITE_DAC                  0x00040000
+#define WRITE_OWNER                0x00080000
+#define SYNCHRONIZE                0x00100000
+#define STANDARD_RIGHTS_REQUIRED   0x000f0000
+
+#define STANDARD_RIGHTS_READ       READ_CONTROL
+#define STANDARD_RIGHTS_WRITE      READ_CONTROL
+#define STANDARD_RIGHTS_EXECUTE    READ_CONTROL
+
+#define STANDARD_RIGHTS_ALL        0x001f0000
+
+#define SPECIFIC_RIGHTS_ALL        0x0000ffff
+
+#define GENERIC_READ               0x80000000
+#define GENERIC_WRITE              0x40000000
+#define GENERIC_EXECUTE            0x20000000
+#define GENERIC_ALL                0x10000000
+
+#define MAXIMUM_ALLOWED            0x02000000
+#define ACCESS_SYSTEM_SECURITY     0x01000000
+
+#define EVENT_MODIFY_STATE         0x0002
+#define EVENT_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
+
+#define SEMAPHORE_MODIFY_STATE     0x0002
+#define SEMAPHORE_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
+
+#define MUTEX_MODIFY_STATE         0x0001
+#define MUTEX_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1)
+
+#define TIMER_QUERY_STATE          0x0001
+#define TIMER_MODIFY_STATE         0x0002
+#define TIMER_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
+
+#define PROCESS_TERMINATE          0x0001
+#define PROCESS_CREATE_THREAD      0x0002
+#define PROCESS_VM_OPERATION       0x0008
+#define PROCESS_VM_READ            0x0010
+#define PROCESS_VM_WRITE           0x0020
+#define PROCESS_DUP_HANDLE         0x0040
+#define PROCESS_CREATE_PROCESS     0x0080
+#define PROCESS_SET_QUOTA          0x0100
+#define PROCESS_SET_INFORMATION    0x0200
+#define PROCESS_QUERY_INFORMATION  0x0400
+#define PROCESS_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xfff)
+
+#define THREAD_TERMINATE           0x0001
+#define THREAD_SUSPEND_RESUME      0x0002
+#define THREAD_GET_CONTEXT         0x0008
+#define THREAD_SET_CONTEXT         0x0010
+#define THREAD_SET_INFORMATION     0x0020
+#define THREAD_QUERY_INFORMATION   0x0040
+#define THREAD_SET_THREAD_TOKEN    0x0080
+#define THREAD_IMPERSONATE         0x0100
+#define THREAD_DIRECT_IMPERSONATION 0x0200
+#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 FILE_READ_DATA            0x0001    /* file & pipe */
+#define FILE_LIST_DIRECTORY       0x0001    /* directory */
+#define FILE_WRITE_DATA           0x0002    /* file & pipe */
+#define FILE_ADD_FILE             0x0002    /* directory */
+#define FILE_APPEND_DATA          0x0004    /* file */
+#define FILE_ADD_SUBDIRECTORY     0x0004    /* directory */
+#define FILE_CREATE_PIPE_INSTANCE 0x0004    /* named pipe */
+#define FILE_READ_EA              0x0008    /* file & directory */
+#define FILE_READ_PROPERTIES      FILE_READ_EA
+#define FILE_WRITE_EA             0x0010    /* file & directory */
+#define FILE_WRITE_PROPERTIES     FILE_WRITE_EA
+#define FILE_EXECUTE              0x0020    /* file */
+#define FILE_TRAVERSE             0x0020    /* directory */
+#define FILE_DELETE_CHILD         0x0040    /* directory */
+#define FILE_READ_ATTRIBUTES      0x0080    /* all */
+#define FILE_WRITE_ATTRIBUTES     0x0100    /* all */
+#define FILE_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1ff)
+
+#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)
+#define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE | FILE_EXECUTE | \
+                                   FILE_READ_ATTRIBUTES | SYNCHRONIZE)
+
+
+/* File attribute flags */
+#define FILE_SHARE_READ                        0x00000001L
+#define FILE_SHARE_WRITE               0x00000002L
+#define FILE_SHARE_DELETE              0x00000004L
+#define FILE_ATTRIBUTE_READONLY         0x00000001L
+#define FILE_ATTRIBUTE_HIDDEN           0x00000002L
+#define FILE_ATTRIBUTE_SYSTEM           0x00000004L
+#define FILE_ATTRIBUTE_LABEL            0x00000008L  /* Not in Windows API */
+#define FILE_ATTRIBUTE_DIRECTORY        0x00000010L
+#define FILE_ATTRIBUTE_ARCHIVE          0x00000020L
+#define FILE_ATTRIBUTE_NORMAL           0x00000080L
+#define FILE_ATTRIBUTE_TEMPORARY        0x00000100L
+#define FILE_ATTRIBUTE_ATOMIC_WRITE     0x00000200L
+#define FILE_ATTRIBUTE_XACTION_WRITE    0x00000400L
+#define FILE_ATTRIBUTE_COMPRESSED       0x00000800L
+#define FILE_ATTRIBUTE_OFFLINE         0x00001000L
+#define FILE_ATTRIBUTE_SYMLINK         0x80000000L  /* Not in Windows API */
+
+/* File notification flags */
+#define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
+#define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
+#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_SECURITY     0x00000100
+
+#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_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_IS_COMPRESSED       0x00008000
+
+/* File alignments (NT) */
+#define        FILE_BYTE_ALIGNMENT             0x00000000
+#define        FILE_WORD_ALIGNMENT             0x00000001
+#define        FILE_LONG_ALIGNMENT             0x00000003
+#define        FILE_QUAD_ALIGNMENT             0x00000007
+#define        FILE_OCTA_ALIGNMENT             0x0000000f
+#define        FILE_32_BYTE_ALIGNMENT          0x0000001f
+#define        FILE_64_BYTE_ALIGNMENT          0x0000003f
+#define        FILE_128_BYTE_ALIGNMENT         0x0000007f
+#define        FILE_256_BYTE_ALIGNMENT         0x000000ff
+#define        FILE_512_BYTE_ALIGNMENT         0x000001ff
+
+#define REG_NONE               0       /* no type */
+#define REG_SZ                 1       /* string type (ASCII) */
+#define REG_EXPAND_SZ          2       /* string, includes %ENVVAR% (expanded by caller) (ASCII) */
+#define REG_BINARY             3       /* binary format, callerspecific */
+/* YES, REG_DWORD == REG_DWORD_LITTLE_ENDIAN */
+#define REG_DWORD              4       /* DWORD in little endian format */
+#define REG_DWORD_LITTLE_ENDIAN        4       /* DWORD in little endian format */
+#define REG_DWORD_BIG_ENDIAN   5       /* DWORD in big endian format  */
+#define REG_LINK               6       /* symbolic link (UNICODE) */
+#define REG_MULTI_SZ           7       /* multiple strings, delimited by \0, terminated by \0\0 (ASCII) */
+#define REG_RESOURCE_LIST      8       /* resource list? huh? */
+#define REG_FULL_RESOURCE_DESCRIPTOR   9       /* full resource descriptor? huh? */
+#define REG_RESOURCE_REQUIREMENTS_LIST 10
+
+/* ----------------------------- begin registry ----------------------------- */
+
+/* Registry security values */
+#define OWNER_SECURITY_INFORMATION     0x00000001
+#define GROUP_SECURITY_INFORMATION     0x00000002
+#define DACL_SECURITY_INFORMATION      0x00000004
+#define SACL_SECURITY_INFORMATION      0x00000008
+
+#define REG_OPTION_RESERVED            0x00000000
+#define REG_OPTION_NON_VOLATILE                0x00000000
+#define REG_OPTION_VOLATILE            0x00000001
+#define REG_OPTION_CREATE_LINK         0x00000002
+#define REG_OPTION_BACKUP_RESTORE      0x00000004 /* FIXME */
+#define REG_OPTION_OPEN_LINK           0x00000008
+#define REG_LEGAL_OPTION              (REG_OPTION_RESERVED|  \
+                                       REG_OPTION_NON_VOLATILE|  \
+                                       REG_OPTION_VOLATILE|  \
+                                       REG_OPTION_CREATE_LINK|  \
+                                       REG_OPTION_BACKUP_RESTORE|  \
+                                       REG_OPTION_OPEN_LINK)
+
+
+#define REG_CREATED_NEW_KEY    0x00000001
+#define REG_OPENED_EXISTING_KEY        0x00000002
+
+/* For RegNotifyChangeKeyValue */
+#define REG_NOTIFY_CHANGE_NAME 0x1
+
+#define KEY_QUERY_VALUE                0x00000001
+#define KEY_SET_VALUE          0x00000002
+#define KEY_CREATE_SUB_KEY     0x00000004
+#define KEY_ENUMERATE_SUB_KEYS 0x00000008
+#define KEY_NOTIFY             0x00000010
+#define KEY_CREATE_LINK                0x00000020
+
+#define KEY_READ             ((STANDARD_RIGHTS_READ|  \
+                               KEY_QUERY_VALUE|  \
+                               KEY_ENUMERATE_SUB_KEYS|  \
+                               KEY_NOTIFY)  \
+                               & (~SYNCHRONIZE)  \
+                             )
+#define KEY_WRITE            ((STANDARD_RIGHTS_WRITE|  \
+                               KEY_SET_VALUE|  \
+                               KEY_CREATE_SUB_KEY)  \
+                               & (~SYNCHRONIZE)  \
+                             )
+#define KEY_EXECUTE          ((KEY_READ)  \
+                               & (~SYNCHRONIZE))  \
+                             )
+#define KEY_ALL_ACCESS        ((STANDARD_RIGHTS_ALL|  \
+                               KEY_QUERY_VALUE|  \
+                               KEY_SET_VALUE|  \
+                               KEY_CREATE_SUB_KEY|  \
+                               KEY_ENUMERATE_SUB_KEYS|  \
+                               KEY_NOTIFY|  \
+                               KEY_CREATE_LINK)  \
+                               & (~SYNCHRONIZE)  \
+                             )
+/* ------------------------------ end registry ------------------------------ */
+
+
+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, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
+
+typedef struct _RTL_CRITICAL_SECTION {
+    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
+    LONG LockCount;
+    LONG RecursionCount;
+    HANDLE OwningThread;
+    HANDLE LockSemaphore;
+    ULONG_PTR SpinCount;
+} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
+
+
+#define EVENTLOG_SUCCESS                0x0000
+#define EVENTLOG_ERROR_TYPE             0x0001
+#define EVENTLOG_WARNING_TYPE           0x0002
+#define EVENTLOG_INFORMATION_TYPE       0x0004
+#define EVENTLOG_AUDIT_SUCCESS          0x0008
+#define EVENTLOG_AUDIT_FAILURE          0x0010
+
+#define SERVICE_BOOT_START   0x00000000
+#define SERVICE_SYSTEM_START 0x00000001
+#define SERVICE_AUTO_START   0x00000002
+#define SERVICE_DEMAND_START 0x00000003
+#define SERVICE_DISABLED     0x00000004
+
+#define SERVICE_ERROR_IGNORE   0x00000000
+#define SERVICE_ERROR_NORMAL   0x00000001
+#define SERVICE_ERROR_SEVERE   0x00000002
+#define SERVICE_ERROR_CRITICAL 0x00000003
+
+/* Service types */
+#define SERVICE_KERNEL_DRIVER      0x00000001
+#define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
+#define SERVICE_ADAPTER            0x00000004
+#define SERVICE_RECOGNIZER_DRIVER  0x00000008
+
+#define SERVICE_DRIVER ( SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | \
+                         SERVICE_RECOGNIZER_DRIVER )
+
+#define SERVICE_WIN32_OWN_PROCESS   0x00000010
+#define SERVICE_WIN32_SHARE_PROCESS 0x00000020
+#define SERVICE_WIN32  (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS)
+
+#define SERVICE_INTERACTIVE_PROCESS 0x00000100
+
+#define SERVICE_TYPE_ALL ( SERVICE_WIN32 | SERVICE_ADAPTER | \
+                           SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS )
+
+
+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;
+
+
+
+#define RtlEqualMemory(Destination, Source, Length) (!memcmp((Destination),(Source),(Length)))
+#define RtlMoveMemory(Destination, Source, Length) memmove((Destination),(Source),(Length))
+#define RtlCopyMemory(Destination, Source, Length) memcpy((Destination),(Source),(Length))
+#define RtlFillMemory(Destination, Length, Fill) memset((Destination),(Fill),(Length))
+#define RtlZeroMemory(Destination, Length) memset((Destination),0,(Length))
+
+#include "guiddef.h"
+
+#include "poppack.h"
 
 #endif  /* __WINE_WINNT_H */