winnt.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:80k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*
  2.  * Win32 definitions for Windows NT
  3.  *
  4.  * Copyright 1996 Alexandre Julliard
  5.  */
  6. #ifndef __WINE_WINNT_H
  7. #define __WINE_WINNT_H
  8. #include "windef.h"
  9. #ifndef RC_INVOKED
  10. #include <string.h>
  11. #endif
  12. #include "pshpack1.h"
  13. /* Defines */
  14. /* Argument 1 passed to the DllEntryProc. */
  15. #define DLL_PROCESS_DETACH 0 /* detach process (unload library) */
  16. #define DLL_PROCESS_ATTACH 1 /* attach process (load library) */
  17. #define DLL_THREAD_ATTACH 2 /* attach new thread */
  18. #define DLL_THREAD_DETACH 3 /* detach thread */
  19. /* u.x.wProcessorArchitecture (NT) */
  20. #define PROCESSOR_ARCHITECTURE_INTEL 0
  21. #define PROCESSOR_ARCHITECTURE_MIPS 1
  22. #define PROCESSOR_ARCHITECTURE_ALPHA 2
  23. #define PROCESSOR_ARCHITECTURE_PPC 3
  24. #define PROCESSOR_ARCHITECTURE_SHX 4
  25. #define PROCESSOR_ARCHITECTURE_ARM 5
  26. #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
  27. /* dwProcessorType */
  28. #define PROCESSOR_INTEL_386      386
  29. #define PROCESSOR_INTEL_486      486
  30. #define PROCESSOR_INTEL_PENTIUM  586
  31. #define PROCESSOR_INTEL_860      860
  32. #define PROCESSOR_MIPS_R2000     2000
  33. #define PROCESSOR_MIPS_R3000     3000
  34. #define PROCESSOR_MIPS_R4000     4000
  35. #define PROCESSOR_ALPHA_21064    21064
  36. #define PROCESSOR_PPC_601        601
  37. #define PROCESSOR_PPC_603        603
  38. #define PROCESSOR_PPC_604        604
  39. #define PROCESSOR_PPC_620        620
  40. #define PROCESSOR_HITACHI_SH3    10003
  41. #define PROCESSOR_HITACHI_SH3E   10004
  42. #define PROCESSOR_HITACHI_SH4    10005
  43. #define PROCESSOR_MOTOROLA_821   821
  44. #define PROCESSOR_SHx_SH3        103
  45. #define PROCESSOR_SHx_SH4        104
  46. #define PROCESSOR_STRONGARM      2577
  47. #define PROCESSOR_ARM720         1824    /* 0x720 */
  48. #define PROCESSOR_ARM820         2080    /* 0x820 */
  49. #define PROCESSOR_ARM920         2336    /* 0x920 */
  50. #define PROCESSOR_ARM_7TDMI      70001
  51. #define ANYSIZE_ARRAY 1
  52. #define MINCHAR       0x80
  53. #define MAXCHAR       0x7f
  54. #define MINSHORT      0x8000
  55. #define MAXSHORT      0x7fff
  56. #define MINLONG       0x80000000
  57. #define MAXLONG       0x7fffffff
  58. #define MAXBYTE       0xff
  59. #define MAXWORD       0xffff
  60. #define MAXDWORD      0xffffffff
  61. #define FIELD_OFFSET(type, field) 
  62.   ((LONG)(INT)&(((type *)0)->field))
  63. #define CONTAINING_RECORD(address, type, field) 
  64.   ((type *)((PCHAR)(address) - (PCHAR)(&((type *)0)->field)))
  65. /* Types */
  66. /* TCHAR data types definitions for Winelib. */
  67. /* These types are _not_ defined for the emulator, because they */
  68. /* depend on the UNICODE macro that only exists in user's code. */
  69. //#ifndef __WINE__
  70. # ifdef UNICODE
  71. typedef WCHAR TCHAR, *PTCHAR;
  72. typedef LPWSTR PTSTR, LPTSTR;
  73. typedef LPCWSTR PCTSTR, LPCTSTR;
  74. #define __TEXT(string) L##string /*probably wrong */
  75. # else  /* UNICODE */
  76. typedef char TCHAR, *PTCHAR;
  77. typedef LPSTR PTSTR, LPTSTR;
  78. typedef LPCSTR PCTSTR, LPCTSTR;
  79. #define __TEXT(string) string
  80. # endif /* UNICODE */
  81. //#endif   /* __WINE__ */
  82. #define TEXT(quote) __TEXT(quote)
  83. typedef BYTE     BOOLEAN;
  84. typedef BOOLEAN *PBOOLEAN;
  85. typedef struct _LIST_ENTRY {
  86.   struct _LIST_ENTRY *Flink;
  87.   struct _LIST_ENTRY *Blink;
  88. } LIST_ENTRY, *PLIST_ENTRY;
  89. typedef struct _SINGLE_LIST_ENTRY {
  90.   struct _SINGLE_LIST_ENTRY *Next;
  91. } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
  92. /* Heap flags */
  93. #define HEAP_NO_SERIALIZE               0x00000001
  94. #define HEAP_GROWABLE                   0x00000002
  95. #define HEAP_GENERATE_EXCEPTIONS        0x00000004
  96. #define HEAP_ZERO_MEMORY                0x00000008
  97. #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010
  98. #define HEAP_TAIL_CHECKING_ENABLED      0x00000020
  99. #define HEAP_FREE_CHECKING_ENABLED      0x00000040
  100. #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
  101. #define HEAP_CREATE_ALIGN_16            0x00010000
  102. #define HEAP_CREATE_ENABLE_TRACING      0x00020000
  103. #define HEAP_WINE_SEGPTR                0x01000000  /* Not a Win32 flag */
  104. #define HEAP_WINE_CODESEG               0x02000000  /* Not a Win32 flag */
  105. #define HEAP_WINE_CODE16SEG             0x04000000  /* Not a Win32 flag */
  106. #define HEAP_WINE_SHARED                0x08000000  /* Not a Win32 flag */
  107. /* Processor feature flags.  */
  108. #define PF_FLOATING_POINT_PRECISION_ERRATA 0
  109. #define PF_FLOATING_POINT_EMULATED 1
  110. #define PF_COMPARE_EXCHANGE_DOUBLE 2
  111. #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
  112. #define PF_PPC_MOVEMEM_64BIT_OK 4
  113. #define PF_ALPHA_BYTE_INSTRUCTIONS 5
  114. /* based on wine-20010510 -- alex */
  115. #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
  116. #define PF_AMD3D_INSTRUCTIONS_AVAILABLE 7
  117. #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
  118. /* The Win32 register context */
  119. /* CONTEXT is the CPU-dependent context; it should be used        */
  120. /* wherever a platform-specific context is needed (e.g. exception */
  121. /* handling, Win32 register functions). */
  122. /* CONTEXT86 is the i386-specific context; it should be used     */
  123. /* wherever only a 386 context makes sense (e.g. DOS interrupts, */
  124. /* Win16 register functions), so that this code can be compiled  */
  125. /* on all platforms. */
  126. #define SIZE_OF_80387_REGISTERS      80
  127. typedef struct _FLOATING_SAVE_AREA
  128. {
  129.     DWORD   ControlWord;
  130.     DWORD   StatusWord;
  131.     DWORD   TagWord;    
  132.     DWORD   ErrorOffset;
  133.     DWORD   ErrorSelector;
  134.     DWORD   DataOffset;
  135.     DWORD   DataSelector;    
  136.     BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
  137.     DWORD   Cr0NpxState;
  138. } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
  139. typedef struct _CONTEXT86
  140. {
  141.     DWORD   ContextFlags;
  142.     /* These are selected by CONTEXT_DEBUG_REGISTERS */
  143.     DWORD   Dr0;
  144.     DWORD   Dr1;
  145.     DWORD   Dr2;
  146.     DWORD   Dr3;
  147.     DWORD   Dr6;
  148.     DWORD   Dr7;
  149.     /* These are selected by CONTEXT_FLOATING_POINT */
  150.     FLOATING_SAVE_AREA FloatSave;
  151.     /* These are selected by CONTEXT_SEGMENTS */
  152.     DWORD   SegGs;
  153.     DWORD   SegFs;
  154.     DWORD   SegEs;
  155.     DWORD   SegDs;    
  156.     /* These are selected by CONTEXT_INTEGER */
  157.     DWORD   Edi;
  158.     DWORD   Esi;
  159.     DWORD   Ebx;
  160.     DWORD   Edx;    
  161.     DWORD   Ecx;
  162.     DWORD   Eax;
  163.     /* These are selected by CONTEXT_CONTROL */
  164.     DWORD   Ebp;    
  165.     DWORD   Eip;
  166.     DWORD   SegCs;
  167.     DWORD   EFlags;
  168.     DWORD   Esp;
  169.     DWORD   SegSs;
  170. } CONTEXT86;
  171. #define CONTEXT_X86       0x00010000
  172. #define CONTEXT_i386      CONTEXT_X86
  173. #define CONTEXT_i486      CONTEXT_X86
  174. #define CONTEXT86_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
  175. #define CONTEXT86_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
  176. #define CONTEXT86_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
  177. #define CONTEXT86_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
  178. #define CONTEXT86_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
  179. #define CONTEXT86_FULL (CONTEXT86_CONTROL | CONTEXT86_INTEGER | CONTEXT86_SEGMENTS)
  180. /* i386 context definitions */
  181. #ifdef __i386__
  182. #define CONTEXT_CONTROL         CONTEXT86_CONTROL
  183. #define CONTEXT_INTEGER         CONTEXT86_INTEGER
  184. #define CONTEXT_SEGMENTS        CONTEXT86_SEGMENTS
  185. #define CONTEXT_FLOATING_POINT  CONTEXT86_FLOATING_POINT
  186. #define CONTEXT_DEBUG_REGISTERS CONTEXT86_DEBUG_REGISTERS
  187. #define CONTEXT_FULL            CONTEXT86_FULL
  188. typedef CONTEXT86 CONTEXT;
  189. #endif  /* __i386__ */
  190. /* Alpha context definitions */
  191. #if defined(_ALPHA_) || defined(__alpha__)
  192. #define CONTEXT_ALPHA   0x00020000
  193.  
  194. #define CONTEXT_CONTROL (CONTEXT_ALPHA | 0x00000001L)
  195. #define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA | 0x00000002L)
  196. #define CONTEXT_INTEGER (CONTEXT_ALPHA | 0x00000004L)
  197. #define CONTEXT_FULL  (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
  198. typedef struct _CONTEXT
  199. {
  200.     /* selected by CONTEXT_FLOATING_POINT */
  201.     ULONGLONG FltF0;
  202.     ULONGLONG FltF1;
  203.     ULONGLONG FltF2;
  204.     ULONGLONG FltF3;
  205.     ULONGLONG FltF4;
  206.     ULONGLONG FltF5;
  207.     ULONGLONG FltF6;
  208.     ULONGLONG FltF7;
  209.     ULONGLONG FltF8;
  210.     ULONGLONG FltF9;
  211.     ULONGLONG FltF10;
  212.     ULONGLONG FltF11;
  213.     ULONGLONG FltF12;
  214.     ULONGLONG FltF13;
  215.     ULONGLONG FltF14;
  216.     ULONGLONG FltF15;
  217.     ULONGLONG FltF16;
  218.     ULONGLONG FltF17;
  219.     ULONGLONG FltF18;
  220.     ULONGLONG FltF19;
  221.     ULONGLONG FltF20;
  222.     ULONGLONG FltF21;
  223.     ULONGLONG FltF22;
  224.     ULONGLONG FltF23;
  225.     ULONGLONG FltF24;
  226.     ULONGLONG FltF25;
  227.     ULONGLONG FltF26;
  228.     ULONGLONG FltF27;
  229.     ULONGLONG FltF28;
  230.     ULONGLONG FltF29;
  231.     ULONGLONG FltF30;
  232.     ULONGLONG FltF31;
  233.     /* selected by CONTEXT_INTEGER */
  234.     ULONGLONG IntV0;
  235.     ULONGLONG IntT0;
  236.     ULONGLONG IntT1;
  237.     ULONGLONG IntT2;
  238.     ULONGLONG IntT3;
  239.     ULONGLONG IntT4;
  240.     ULONGLONG IntT5;
  241.     ULONGLONG IntT6;
  242.     ULONGLONG IntT7;
  243.     ULONGLONG IntS0;
  244.     ULONGLONG IntS1;
  245.     ULONGLONG IntS2;
  246.     ULONGLONG IntS3;
  247.     ULONGLONG IntS4;
  248.     ULONGLONG IntS5;
  249.     ULONGLONG IntFp;
  250.     ULONGLONG IntA0;
  251.     ULONGLONG IntA1;
  252.     ULONGLONG IntA2;
  253.     ULONGLONG IntA3;
  254.     ULONGLONG IntA4;
  255.     ULONGLONG IntA5;
  256.     ULONGLONG IntT8;
  257.     ULONGLONG IntT9;
  258.     ULONGLONG IntT10;
  259.     ULONGLONG IntT11;
  260.     ULONGLONG IntRa;
  261.     ULONGLONG IntT12;
  262.     ULONGLONG IntAt;
  263.     ULONGLONG IntGp;
  264.     ULONGLONG IntSp;
  265.     ULONGLONG IntZero;
  266.     /* selected by CONTEXT_FLOATING_POINT */
  267.     ULONGLONG Fpcr;
  268.     ULONGLONG SoftFpcr;
  269.     /* selected by CONTEXT_CONTROL */
  270.     ULONGLONG Fir;
  271.     DWORD Psr;
  272.     DWORD ContextFlags;
  273.     DWORD Fill[4];
  274. } CONTEXT;
  275. #define _QUAD_PSR_OFFSET   HighSoftFpcr
  276. #define _QUAD_FLAGS_OFFSET HighFir
  277. #endif  /* _ALPHA_ */
  278. /* Mips context definitions */
  279. #ifdef _MIPS_
  280. #define CONTEXT_R4000   0x00010000
  281. #define CONTEXT_CONTROL         (CONTEXT_R4000 | 0x00000001)
  282. #define CONTEXT_FLOATING_POINT  (CONTEXT_R4000 | 0x00000002)
  283. #define CONTEXT_INTEGER         (CONTEXT_R4000 | 0x00000004)
  284. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
  285. typedef struct _CONTEXT
  286. {
  287.     DWORD Argument[4];
  288.     /* These are selected by CONTEXT_FLOATING_POINT */
  289.     DWORD FltF0;
  290.     DWORD FltF1;
  291.     DWORD FltF2;
  292.     DWORD FltF3;
  293.     DWORD FltF4;
  294.     DWORD FltF5;
  295.     DWORD FltF6;
  296.     DWORD FltF7;
  297.     DWORD FltF8;
  298.     DWORD FltF9;
  299.     DWORD FltF10;
  300.     DWORD FltF11;
  301.     DWORD FltF12;
  302.     DWORD FltF13;
  303.     DWORD FltF14;
  304.     DWORD FltF15;
  305.     DWORD FltF16;
  306.     DWORD FltF17;
  307.     DWORD FltF18;
  308.     DWORD FltF19;
  309.     DWORD FltF20;
  310.     DWORD FltF21;
  311.     DWORD FltF22;
  312.     DWORD FltF23;
  313.     DWORD FltF24;
  314.     DWORD FltF25;
  315.     DWORD FltF26;
  316.     DWORD FltF27;
  317.     DWORD FltF28;
  318.     DWORD FltF29;
  319.     DWORD FltF30;
  320.     DWORD FltF31;
  321.     /* These are selected by CONTEXT_INTEGER */
  322.     DWORD IntZero;
  323.     DWORD IntAt;
  324.     DWORD IntV0;
  325.     DWORD IntV1;
  326.     DWORD IntA0;
  327.     DWORD IntA1;
  328.     DWORD IntA2;
  329.     DWORD IntA3;
  330.     DWORD IntT0;
  331.     DWORD IntT1;
  332.     DWORD IntT2;
  333.     DWORD IntT3;
  334.     DWORD IntT4;
  335.     DWORD IntT5;
  336.     DWORD IntT6;
  337.     DWORD IntT7;
  338.     DWORD IntS0;
  339.     DWORD IntS1;
  340.     DWORD IntS2;
  341.     DWORD IntS3;
  342.     DWORD IntS4;
  343.     DWORD IntS5;
  344.     DWORD IntS6;
  345.     DWORD IntS7;
  346.     DWORD IntT8;
  347.     DWORD IntT9;
  348.     DWORD IntK0;
  349.     DWORD IntK1;
  350.     DWORD IntGp;
  351.     DWORD IntSp;
  352.     DWORD IntS8;
  353.     DWORD IntRa;
  354.     DWORD IntLo;
  355.     DWORD IntHi;
  356.     /* These are selected by CONTEXT_FLOATING_POINT */
  357.     DWORD Fsr;
  358.     /* These are selected by CONTEXT_CONTROL */
  359.     DWORD Fir;
  360.     DWORD Psr;
  361.     DWORD ContextFlags;
  362.     DWORD Fill[2];
  363. } CONTEXT;
  364. #endif  /* _MIPS_ */
  365. /* PowerPC context definitions */
  366. #ifdef __PPC__
  367. #define CONTEXT_CONTROL         0x0001
  368. #define CONTEXT_FLOATING_POINT  0x0002
  369. #define CONTEXT_INTEGER         0x0004
  370. #define CONTEXT_DEBUG_REGISTERS 0x0008
  371. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
  372. typedef struct
  373. {
  374.     /* These are selected by CONTEXT_FLOATING_POINT */
  375.     double Fpr0;
  376.     double Fpr1;
  377.     double Fpr2;
  378.     double Fpr3;
  379.     double Fpr4;
  380.     double Fpr5;
  381.     double Fpr6;
  382.     double Fpr7;
  383.     double Fpr8;
  384.     double Fpr9;
  385.     double Fpr10;
  386.     double Fpr11;
  387.     double Fpr12;
  388.     double Fpr13;
  389.     double Fpr14;
  390.     double Fpr15;
  391.     double Fpr16;
  392.     double Fpr17;
  393.     double Fpr18;
  394.     double Fpr19;
  395.     double Fpr20;
  396.     double Fpr21;
  397.     double Fpr22;
  398.     double Fpr23;
  399.     double Fpr24;
  400.     double Fpr25;
  401.     double Fpr26;
  402.     double Fpr27;
  403.     double Fpr28;
  404.     double Fpr29;
  405.     double Fpr30;
  406.     double Fpr31;
  407.     double Fpscr;
  408.     /* These are selected by CONTEXT_INTEGER */
  409.     DWORD Gpr0;
  410.     DWORD Gpr1;
  411.     DWORD Gpr2;
  412.     DWORD Gpr3;
  413.     DWORD Gpr4;
  414.     DWORD Gpr5;
  415.     DWORD Gpr6;
  416.     DWORD Gpr7;
  417.     DWORD Gpr8;
  418.     DWORD Gpr9;
  419.     DWORD Gpr10;
  420.     DWORD Gpr11;
  421.     DWORD Gpr12;
  422.     DWORD Gpr13;
  423.     DWORD Gpr14;
  424.     DWORD Gpr15;
  425.     DWORD Gpr16;
  426.     DWORD Gpr17;
  427.     DWORD Gpr18;
  428.     DWORD Gpr19;
  429.     DWORD Gpr20;
  430.     DWORD Gpr21;
  431.     DWORD Gpr22;
  432.     DWORD Gpr23;
  433.     DWORD Gpr24;
  434.     DWORD Gpr25;
  435.     DWORD Gpr26;
  436.     DWORD Gpr27;
  437.     DWORD Gpr28;
  438.     DWORD Gpr29;
  439.     DWORD Gpr30;
  440.     DWORD Gpr31;
  441.     DWORD Cr;
  442.     DWORD Xer;
  443.     /* These are selected by CONTEXT_CONTROL */
  444.     DWORD Msr;
  445.     DWORD Iar;
  446.     DWORD Lr;
  447.     DWORD Ctr;
  448.     DWORD ContextFlags;
  449.     DWORD Fill[3];
  450.     /* These are selected by CONTEXT_DEBUG_REGISTERS */
  451.     DWORD Dr0;
  452.     DWORD Dr1;
  453.     DWORD Dr2;
  454.     DWORD Dr3;
  455.     DWORD Dr4;
  456.     DWORD Dr5;
  457.     DWORD Dr6;
  458.     DWORD Dr7;
  459. } CONTEXT;
  460. typedef struct _STACK_FRAME_HEADER
  461. {
  462.     DWORD BackChain;
  463.     DWORD GlueSaved1;
  464.     DWORD GlueSaved2;
  465.     DWORD Reserved1;
  466.     DWORD Spare1;
  467.     DWORD Spare2;
  468.     DWORD Parameter0;
  469.     DWORD Parameter1;
  470.     DWORD Parameter2;
  471.     DWORD Parameter3;
  472.     DWORD Parameter4;
  473.     DWORD Parameter5;
  474.     DWORD Parameter6;
  475.     DWORD Parameter7;
  476. } STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER;
  477. #endif  /* __PPC__ */
  478. #ifdef __sparc__
  479. /* 
  480.  * FIXME:  
  481.  *
  482.  * There is no official CONTEXT structure defined for the SPARC 
  483.  * architecture, so I just made one up.
  484.  *
  485.  * This structure is valid only for 32-bit SPARC architectures,
  486.  * not for 64-bit SPARC.
  487.  *
  488.  * Note that this structure contains only the 'top-level' registers;
  489.  * the rest of the register window chain is not visible.
  490.  *
  491.  * The layout follows the Solaris 'prgregset_t' structure.
  492.  * 
  493.  */ 
  494. #define CONTEXT_SPARC            0x10000000
  495. #define CONTEXT_CONTROL         (CONTEXT_SPARC | 0x00000001)
  496. #define CONTEXT_FLOATING_POINT  (CONTEXT_SPARC | 0x00000002)
  497. #define CONTEXT_INTEGER         (CONTEXT_SPARC | 0x00000004)
  498. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
  499. typedef struct _CONTEXT
  500. {
  501.     DWORD ContextFlags;
  502.     /* These are selected by CONTEXT_INTEGER */
  503.     DWORD g0;
  504.     DWORD g1;
  505.     DWORD g2;
  506.     DWORD g3;
  507.     DWORD g4;
  508.     DWORD g5;
  509.     DWORD g6;
  510.     DWORD g7;
  511.     DWORD o0;
  512.     DWORD o1;
  513.     DWORD o2;
  514.     DWORD o3;
  515.     DWORD o4;
  516.     DWORD o5;
  517.     DWORD o6;
  518.     DWORD o7;
  519.     DWORD l0;
  520.     DWORD l1;
  521.     DWORD l2;
  522.     DWORD l3;
  523.     DWORD l4;
  524.     DWORD l5;
  525.     DWORD l6;
  526.     DWORD l7;
  527.     DWORD i0;
  528.     DWORD i1;
  529.     DWORD i2;
  530.     DWORD i3;
  531.     DWORD i4;
  532.     DWORD i5;
  533.     DWORD i6;
  534.     DWORD i7;
  535.     /* These are selected by CONTEXT_CONTROL */
  536.     DWORD psr;
  537.     DWORD pc;
  538.     DWORD npc;
  539.     DWORD y;
  540.     DWORD wim;
  541.     DWORD tbr;
  542.     /* FIXME: floating point registers missing */
  543. } CONTEXT;
  544. #endif  /* __sparc__ */
  545. #if !defined(CONTEXT_FULL) && !defined(RC_INVOKED)
  546. #error You need to define a CONTEXT for your CPU
  547. #endif
  548. typedef CONTEXT *PCONTEXT;
  549. typedef HANDLE *PHANDLE;
  550. #ifdef __WINE__
  551. /* Macros for easier access to i386 context registers */
  552. #define EAX_reg(context)     ((context)->Eax)
  553. #define EBX_reg(context)     ((context)->Ebx)
  554. #define ECX_reg(context)     ((context)->Ecx)
  555. #define EDX_reg(context)     ((context)->Edx)
  556. #define ESI_reg(context)     ((context)->Esi)
  557. #define EDI_reg(context)     ((context)->Edi)
  558. #define EBP_reg(context)     ((context)->Ebp)
  559. #define CS_reg(context)      ((context)->SegCs)
  560. #define DS_reg(context)      ((context)->SegDs)
  561. #define ES_reg(context)      ((context)->SegEs)
  562. #define FS_reg(context)      ((context)->SegFs)
  563. #define GS_reg(context)      ((context)->SegGs)
  564. #define SS_reg(context)      ((context)->SegSs)
  565. #define EFL_reg(context)     ((context)->EFlags)
  566. #define EIP_reg(context)     ((context)->Eip)
  567. #define ESP_reg(context)     ((context)->Esp)
  568. #define AX_reg(context)      (*(WORD*)&EAX_reg(context))
  569. #define BX_reg(context)      (*(WORD*)&EBX_reg(context))
  570. #define CX_reg(context)      (*(WORD*)&ECX_reg(context))
  571. #define DX_reg(context)      (*(WORD*)&EDX_reg(context))
  572. #define SI_reg(context)      (*(WORD*)&ESI_reg(context))
  573. #define DI_reg(context)      (*(WORD*)&EDI_reg(context))
  574. #define BP_reg(context)      (*(WORD*)&EBP_reg(context))
  575. #define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
  576. #define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
  577. #define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
  578. #define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
  579. #define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
  580. #define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
  581. #define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
  582. #define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
  583.                             
  584. #define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
  585. #define RESET_CFLAG(context) (EFL_reg(context) &= ~0x0001)
  586. #define SET_ZFLAG(context)   (EFL_reg(context) |= 0x0040)
  587. #define RESET_ZFLAG(context) (EFL_reg(context) &= ~0x0040)
  588. #define ISV86(context)       (EFL_reg(context) & 0x00020000)
  589. #define V86BASE(context)     ((context)->Dr7) /* ugly */
  590. /* Macros to retrieve the current context */
  591. #ifdef __i386__
  592. #ifdef NEED_UNDERSCORE_PREFIX
  593. # define __ASM_NAME(name) "_" name
  594. #else
  595. # define __ASM_NAME(name) name
  596. #endif
  597. #ifdef __GNUC__
  598. # define __ASM_GLOBAL_FUNC(name,code) 
  599.       __asm__( ".align 4nt" 
  600.                ".globl " __ASM_NAME(#name) "nt" 
  601.                ".type " __ASM_NAME(#name) ",@functionn" 
  602.                __ASM_NAME(#name) ":nt" 
  603.                code );
  604. #else  /* __GNUC__ */
  605. # define __ASM_GLOBAL_FUNC(name,code) 
  606.       void __asm_dummy_##name(void) { 
  607.           asm( ".align 4nt" 
  608.                ".globl " __ASM_NAME(#name) "nt" 
  609.                ".type " __ASM_NAME(#name) ",@functionn" 
  610.                __ASM_NAME(#name) ":nt" 
  611.                code ); 
  612.       }
  613. #endif  /* __GNUC__ */
  614. #define _DEFINE_REGS_ENTRYPOINT( name, fn, args ) 
  615.     __ASM_GLOBAL_FUNC( name, 
  616.                        "call " __ASM_NAME("CALL32_Regs") "nt" 
  617.                        ".long " __ASM_NAME(#fn) "nt" 
  618.                        ".byte " #args ", " #args )
  619. #define DEFINE_REGS_ENTRYPOINT_0( name, fn ) 
  620.   _DEFINE_REGS_ENTRYPOINT( name, fn, 0 )
  621. #define DEFINE_REGS_ENTRYPOINT_1( name, fn, t1 ) 
  622.   _DEFINE_REGS_ENTRYPOINT( name, fn, 4 )
  623. #define DEFINE_REGS_ENTRYPOINT_2( name, fn, t1, t2 ) 
  624.   _DEFINE_REGS_ENTRYPOINT( name, fn, 8 )
  625. #define DEFINE_REGS_ENTRYPOINT_3( name, fn, t1, t2, t3 ) 
  626.   _DEFINE_REGS_ENTRYPOINT( name, fn, 12 )
  627. #define DEFINE_REGS_ENTRYPOINT_4( name, fn, t1, t2, t3, t4 ) 
  628.   _DEFINE_REGS_ENTRYPOINT( name, fn, 16 )
  629. #endif  /* __i386__ */
  630. #ifdef __sparc__
  631. /* FIXME: use getcontext() to retrieve full context */
  632. #define _GET_CONTEXT 
  633.     CONTEXT context;   
  634.     do { memset(&context, 0, sizeof(CONTEXT));            
  635.          context.ContextFlags = CONTEXT_CONTROL;          
  636.          context.pc = (DWORD)__builtin_return_address(0); 
  637.        } while (0)
  638. #define DEFINE_REGS_ENTRYPOINT_0( name, fn ) 
  639.   void WINAPI name ( void ) 
  640.   { _GET_CONTEXT; fn( &context ); }
  641. #define DEFINE_REGS_ENTRYPOINT_1( name, fn, t1 ) 
  642.   void WINAPI name ( t1 a1 ) 
  643.   { _GET_CONTEXT; fn( a1, &context ); }
  644. #define DEFINE_REGS_ENTRYPOINT_2( name, fn, t1, t2 ) 
  645.   void WINAPI name ( t1 a1, t2 a2 ) 
  646.   { _GET_CONTEXT; fn( a1, a2, &context ); }
  647. #define DEFINE_REGS_ENTRYPOINT_3( name, fn, t1, t2, t3 ) 
  648.   void WINAPI name ( t1 a1, t2 a2, t3 a3 ) 
  649.   { _GET_CONTEXT; fn( a1, a2, a3, &context ); }
  650. #define DEFINE_REGS_ENTRYPOINT_4( name, fn, t1, t2, t3, t4 ) 
  651.   void WINAPI name ( t1 a1, t2 a2, t3 a3, t4 a4 ) 
  652.   { _GET_CONTEXT; fn( a1, a2, a3, a4, &context ); }
  653. #endif /* __sparc__ */
  654. #ifndef DEFINE_REGS_ENTRYPOINT_0
  655. #error You need to define DEFINE_REGS_ENTRYPOINT macros for your CPU
  656. #endif
  657. #ifdef __i386__
  658. # define GET_IP(context) ((LPVOID)(context)->Eip)
  659. #endif
  660. #ifdef __sparc__
  661. # define GET_IP(context) ((LPVOID)(context)->pc)
  662. #endif
  663.  
  664. #if !defined(GET_IP) && !defined(RC_INVOKED)
  665. # error You must define GET_IP for this CPU
  666. #endif
  667. #endif  /* __WINE__ */
  668. /*
  669.  * Exception codes
  670.  */
  671. #define STATUS_SUCCESS                   0x00000000
  672. #define STATUS_WAIT_0                    0x00000000
  673. #define STATUS_ABANDONED_WAIT_0          0x00000080
  674. #define STATUS_USER_APC                  0x000000C0
  675. #define STATUS_TIMEOUT                   0x00000102
  676. #define STATUS_PENDING                   0x00000103
  677. #define STATUS_GUARD_PAGE_VIOLATION      0x80000001    
  678. #define STATUS_DATATYPE_MISALIGNMENT     0x80000002
  679. #define STATUS_BREAKPOINT                0x80000003
  680. #define STATUS_SINGLE_STEP               0x80000004
  681. #define STATUS_BUFFER_OVERFLOW           0x80000005
  682. #define STATUS_NO_MORE_FILES             0x80000006
  683. #define STATUS_WAKE_SYSTEM_DEBUGGER      0x80000007
  684. #define STATUS_HANDLES_CLOSED            0x8000000A
  685. #define STATUS_NO_INHERITANCE            0x8000000B
  686. #define STATUS_GUID_SUBSTITUTION_MADE    0x8000000C
  687. #define STATUS_PARTIAL_COPY              0x8000000D
  688. #define STATUS_DEVICE_PAPER_EMPTY        0x8000000E
  689. #define STATUS_DEVICE_POWERED_OFF        0x8000000F
  690. #define STATUS_DEVICE_OFF_LINE           0x80000010
  691. #define STATUS_DEVICE_BUSY               0x80000011
  692. #define STATUS_NO_MORE_EAS               0x80000012
  693. #define STATUS_INVALID_EA_NAME           0x80000013
  694. #define STATUS_EA_LIST_INCONSISTENT      0x80000014
  695. #define STATUS_INVALID_EA_FLAG           0x80000015
  696. #define STATUS_VERIFY_REQUIRED           0x80000016
  697. #define STATUS_EXTRANEOUS_INFORMATION    0x80000017
  698. #define STATUS_RXACT_COMMIT_NECESSARY    0x80000018
  699. #define STATUS_NO_MORE_ENTRIES           0x8000001A
  700. #define STATUS_FILEMARK_DETECTED         0x8000001B
  701. #define STATUS_MEDIA_CHANGED             0x8000001C
  702. #define STATUS_BUS_RESET                 0x8000001D
  703. #define STATUS_END_OF_MEDIA              0x8000001E
  704. #define STATUS_BEGINNING_OF_MEDIA        0x8000001F
  705. #define STATUS_MEDIA_CHECK               0x80000020
  706. #define STATUS_SETMARK_DETECTED          0x80000021
  707. #define STATUS_NO_DATA_DETECTED          0x80000022
  708. #define STATUS_REDIRECTOR_HAS_OPEN_HANDLES 0x80000023
  709. #define STATUS_SERVER_HAS_OPEN_HANDLES   0x80000024
  710. #define STATUS_ALREADY_DISCONNECTED      0x80000025
  711. #define STATUS_LONGJUMP                  0x80000026
  712. #define STATUS_UNSUCCESSFUL              0xC0000001
  713. #define STATUS_NOT_IMPLEMENTED           0xC0000002
  714. #define STATUS_INVALID_INFO_CLASS        0xC0000003
  715. #define STATUS_INFO_LENGTH_MISMATCH      0xC0000004
  716. #define STATUS_ACCESS_VIOLATION          0xC0000005
  717. #define STATUS_IN_PAGE_ERROR             0xC0000006
  718. #define STATUS_PAGEFILE_QUOTA            0xC0000007
  719. #define STATUS_INVALID_HANDLE            0xC0000008
  720. #define STATUS_BAD_INITIAL_STACK         0xC0000009
  721. #define STATUS_BAD_INITIAL_PC            0xC000000A
  722. #define STATUS_INVALID_CID               0xC000000B
  723. #define STATUS_TIMER_NOT_CANCELED        0xC000000C
  724. #define STATUS_INVALID_PARAMETER         0xC000000D
  725. #define STATUS_NO_SUCH_DEVICE            0xC000000E
  726. #define STATUS_NO_SUCH_FILE              0xC000000F
  727. #define STATUS_INVALID_DEVICE_REQUEST    0xC0000010
  728. #define STATUS_END_OF_FILE               0xC0000011
  729. #define STATUS_WRONG_VOLUME              0xC0000012
  730. #define STATUS_NO_MEDIA_IN_DEVICE        0xC0000013
  731. #define STATUS_UNRECOGNIZED_MEDIA        0xC0000014
  732. #define STATUS_NONEXISTENT_SECTOR        0xC0000015
  733. #define STATUS_MORE_PROCESSING_REQUIRED  0xC0000016
  734. #define STATUS_NO_MEMORY                 0xC0000017
  735. #define STATUS_CONFLICTING_ADDRESSES     0xC0000018
  736. #define STATUS_NOT_MAPPED_VIEW           0xC0000019
  737. #define STATUS_UNABLE_TO_FREE_VM         0xC000001A
  738. #define STATUS_UNABLE_TO_DELETE_SECTION  0xC000001B
  739. #define STATUS_INVALID_SYSTEM_SERVICE    0xC000001C
  740. #define STATUS_ILLEGAL_INSTRUCTION       0xC000001D
  741. #define STATUS_INVALID_LOCK_SEQUENCE     0xC000001E
  742. #define STATUS_INVALID_VIEW_SIZE         0xC000001F
  743. #define STATUS_INVALID_FILE_FOR_SECTION  0xC0000020
  744. #define STATUS_ALREADY_COMMITTED         0xC0000021
  745. #define STATUS_ACCESS_DENIED             0xC0000022
  746. #define STATUS_BUFFER_TOO_SMALL          0xC0000023
  747. #define STATUS_OBJECT_TYPE_MISMATCH      0xC0000024
  748. #define STATUS_NONCONTINUABLE_EXCEPTION  0xC0000025
  749. #define STATUS_INVALID_DISPOSITION       0xC0000026
  750. #define STATUS_UNWIND                    0xC0000027
  751. #define STATUS_BAD_STACK                 0xC0000028
  752. #define STATUS_INVALID_UNWIND_TARGET     0xC0000029
  753. #define STATUS_NOT_LOCKED                0xC000002A
  754. #define STATUS_PARITY_ERROR              0xC000002B
  755. #define STATUS_UNABLE_TO_DECOMMIT_VM     0xC000002C
  756. #define STATUS_NOT_COMMITTED             0xC000002D
  757. #define STATUS_INVALID_PORT_ATTRIBUTES   0xC000002E
  758. #define STATUS_PORT_MESSAGE_TOO_LONG     0xC000002F
  759. #define STATUS_INVALID_PARAMETER_MIX     0xC0000030
  760. #define STATUS_INVALID_QUOTA_LOWER       0xC0000031
  761. #define STATUS_DISK_CORRUPT_ERROR        0xC0000032
  762. #define STATUS_OBJECT_NAME_INVALID       0xC0000033
  763. #define STATUS_OBJECT_NAME_NOT_FOUND     0xC0000034
  764. #define STATUS_OBJECT_NAME_COLLISION     0xC0000035
  765. #define STATUS_PORT_DISCONNECTED         0xC0000037
  766. #define STATUS_DEVICE_ALREADY_ATTACHED   0xC0000038
  767. #define STATUS_OBJECT_PATH_INVALID       0xC0000039
  768. #define STATUS_OBJECT_PATH_NOT_FOUND     0xC000003A
  769. #define STATUS_PATH_SYNTAX_BAD           0xC000003B
  770. #define STATUS_DATA_OVERRUN              0xC000003C
  771. #define STATUS_DATA_LATE_ERROR           0xC000003D
  772. #define STATUS_DATA_ERROR                0xC000003E
  773. #define STATUS_CRC_ERROR                 0xC000003F
  774. #define STATUS_SECTION_TOO_BIG           0xC0000040
  775. #define STATUS_PORT_CONNECTION_REFUSED   0xC0000041
  776. #define STATUS_INVALID_PORT_HANDLE       0xC0000042
  777. #define STATUS_SHARING_VIOLATION         0xC0000043
  778. #define STATUS_QUOTA_EXCEEDED            0xC0000044
  779. #define STATUS_INVALID_PAGE_PROTECTION   0xC0000045
  780. #define STATUS_MUTANT_NOT_OWNED          0xC0000046
  781. #define STATUS_SEMAPHORE_LIMIT_EXCEEDED  0xC0000047
  782. #define STATUS_PORT_ALREADY_SET          0xC0000048
  783. #define STATUS_SUSPEND_COUNT_EXCEEDED    0xC000004A
  784. #define STATUS_LOCK_NOT_GRANTED          0xC0000054  /* FIXME: not sure */
  785. #define STATUS_FILE_LOCK_CONFLICT        0xC0000055  /* FIXME: not sure */
  786. #define STATUS_UNKNOWN_REVISION          0xC0000058
  787. #define STATUS_INVALID_SECURITY_DESCR    0xC0000079
  788. #define STATUS_DISK_FULL                 0xC000007F 
  789. #define STATUS_SECTION_NOT_EXTENDED      0xC0000087
  790. #define STATUS_ARRAY_BOUNDS_EXCEEDED     0xC000008C
  791. #define STATUS_FLOAT_DENORMAL_OPERAND    0xC000008D
  792. #define STATUS_FLOAT_DIVIDE_BY_ZERO      0xC000008E
  793. #define STATUS_FLOAT_INEXACT_RESULT      0xC000008F
  794. #define STATUS_FLOAT_INVALID_OPERATION   0xC0000090
  795. #define STATUS_FLOAT_OVERFLOW            0xC0000091
  796. #define STATUS_FLOAT_STACK_CHECK         0xC0000092
  797. #define STATUS_FLOAT_UNDERFLOW           0xC0000093
  798. #define STATUS_INTEGER_DIVIDE_BY_ZERO    0xC0000094
  799. #define STATUS_INTEGER_OVERFLOW          0xC0000095
  800. #define STATUS_PRIVILEGED_INSTRUCTION    0xC0000096
  801. #define STATUS_MEDIA_WRITE_PROTECTED     0XC00000A2
  802. #define STATUS_INVALID_PARAMETER_2       0xC00000F0
  803. #define STATUS_STACK_OVERFLOW            0xC00000FD
  804. #define STATUS_DIRECTORY_NOT_EMPTY       0xC0000101
  805. #define STATUS_TOO_MANY_OPENED_FILES     0xC000011F
  806. #define STATUS_CONTROL_C_EXIT            0xC000013A
  807. #define STATUS_PIPE_BROKEN               0xC000014B
  808. #define STATUS_NOT_REGISTRY_FILE         0xC000015C
  809. #define STATUS_PARTITION_FAILURE         0xC0000172
  810. #define STATUS_INVALID_BLOCK_LENGTH      0xC0000173
  811. #define STATUS_DEVICE_NOT_PARTITIONED    0xC0000174
  812. #define STATUS_UNABLE_TO_LOCK_MEDIA      0xC0000175
  813. #define STATUS_UNABLE_TO_UNLOAD_MEDIA    0xC0000176
  814. #define STATUS_EOM_OVERFLOW              0xC0000177
  815. #define STATUS_NO_MEDIA                  0xC0000178
  816. #define STATUS_NO_SUCH_MEMBER            0xC000017A
  817. #define STATUS_INVALID_MEMBER            0xC000017B
  818. #define STATUS_KEY_DELETED               0xC000017C
  819. #define STATUS_NO_LOG_SPACE              0xC000017D
  820. #define STATUS_TOO_MANY_SIDS             0xC000017E
  821. #define STATUS_LM_CROSS_ENCRYPTION_REQUIRED 0xC000017F
  822. #define STATUS_KEY_HAS_CHILDREN          0xC0000180
  823. #define STATUS_CHILD_MUST_BE_VOLATILE    0xC0000181
  824. #define STATUS_DEVICE_CONFIGURATION_ERROR0xC0000182
  825. #define STATUS_DRIVER_INTERNAL_ERROR     0xC0000183
  826. #define STATUS_INVALID_DEVICE_STATE      0xC0000184
  827. #define STATUS_IO_DEVICE_ERROR           0xC0000185
  828. #define STATUS_DEVICE_PROTOCOL_ERROR     0xC0000186
  829. #define STATUS_BACKUP_CONTROLLER         0xC0000187
  830. #define STATUS_LOG_FILE_FULL             0xC0000188
  831. #define STATUS_TOO_LATE                  0xC0000189
  832. #define STATUS_NO_TRUST_LSA_SECRET       0xC000018A
  833. #define STATUS_NO_TRUST_SAM_ACCOUNT      0xC000018B
  834. #define STATUS_TRUSTED_DOMAIN_FAILURE    0xC000018C
  835. #define STATUS_TRUSTED_RELATIONSHIP_FAILURE 0xC000018D
  836. #define STATUS_EVENTLOG_FILE_CORRUPT     0xC000018E
  837. #define STATUS_EVENTLOG_CANT_START       0xC000018F
  838. #define STATUS_TRUST_FAILURE             0xC0000190
  839. #define STATUS_MUTANT_LIMIT_EXCEEDED     0xC0000191
  840. #define STATUS_NETLOGON_NOT_STARTED      0xC0000192
  841. #define STATUS_ACCOUNT_EXPIRED           0xC0000193
  842. #define STATUS_POSSIBLE_DEADLOCK         0xC0000194
  843. #define STATUS_NETWORK_CREDENTIAL_CONFLICT 0xC0000195
  844. #define STATUS_REMOTE_SESSION_LIMIT      0xC0000196
  845. #define STATUS_EVENTLOG_FILE_CHANGED     0xC0000197
  846. #define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT 0xC0000198
  847. #define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT 0xC0000199
  848. #define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT 0xC000019A
  849. #define STATUS_DOMAIN_TRUST_INCONSISTENT 0xC000019B
  850. #define STATUS_FS_DRIVER_REQUIRED        0xC000019C
  851. #define STATUS_RESOURCE_LANG_NOT_FOUND   0xC0000204
  852. #define MAXIMUM_WAIT_OBJECTS 64
  853. #define MAXIMUM_SUSPEND_COUNT 127
  854. /*
  855.  * Return values from the actual exception handlers
  856.  */
  857. #define ExceptionContinueExecution 0
  858. #define ExceptionContinueSearch    1
  859. #define ExceptionNestedException   2
  860. #define ExceptionCollidedUnwind    3
  861.  
  862. /*
  863.  * Return values from filters in except() and from UnhandledExceptionFilter
  864.  */
  865.  
  866. #define EXCEPTION_EXECUTE_HANDLER        1
  867. #define EXCEPTION_CONTINUE_SEARCH        0
  868. #define EXCEPTION_CONTINUE_EXECUTION    -1
  869. /*
  870.  * From OS/2 2.0 exception handling
  871.  * Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD
  872.  */
  873. #define EH_NONCONTINUABLE   0x01
  874. #define EH_UNWINDING        0x02
  875. #define EH_EXIT_UNWIND      0x04
  876. #define EH_STACK_INVALID    0x08
  877. #define EH_NESTED_CALL      0x10
  878. #define EXCEPTION_CONTINUABLE        0
  879. #define EXCEPTION_NONCONTINUABLE     EH_NONCONTINUABLE
  880.  
  881. /*
  882.  * The exception record used by Win32 to give additional information 
  883.  * about exception to exception handlers.
  884.  */
  885. #define EXCEPTION_MAXIMUM_PARAMETERS 15
  886. typedef struct __EXCEPTION_RECORD
  887. {
  888.     DWORD    ExceptionCode;
  889.     DWORD    ExceptionFlags;
  890.     struct __EXCEPTION_RECORD *ExceptionRecord;
  891.     LPVOID   ExceptionAddress;
  892.     DWORD    NumberParameters;
  893.     DWORD    ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  894. } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
  895. /*
  896.  * The exception pointers structure passed to exception filters
  897.  * in except() and the UnhandledExceptionFilter().
  898.  */
  899.  
  900. typedef struct _EXCEPTION_POINTERS 
  901. {
  902.   PEXCEPTION_RECORD  ExceptionRecord;
  903.   PCONTEXT           ContextRecord;
  904. } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
  905. /*
  906.  * The exception frame, used for registering exception handlers 
  907.  * Win32 cares only about this, but compilers generally emit 
  908.  * larger exception frames for their own use.
  909.  */
  910. struct __EXCEPTION_FRAME;
  911. typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct __EXCEPTION_FRAME*,
  912.                                     PCONTEXT,struct __EXCEPTION_FRAME **);
  913. typedef struct __EXCEPTION_FRAME
  914. {
  915.   struct __EXCEPTION_FRAME *Prev;
  916.   PEXCEPTION_HANDLER       Handler;
  917. } EXCEPTION_FRAME, *PEXCEPTION_FRAME;
  918. #include "poppack.h"
  919. /*
  920.  * function pointer to a exception filter
  921.  */
  922. typedef LONG CALLBACK (*PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
  923. typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
  924. DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
  925. LPTOP_LEVEL_EXCEPTION_FILTER
  926. WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
  927. /* status values for ContinueDebugEvent */
  928. #define DBG_CONTINUE                0x00010002
  929. #define DBG_TERMINATE_THREAD        0x40010003
  930. #define DBG_TERMINATE_PROCESS       0x40010004
  931. #define DBG_CONTROL_C               0x40010005
  932. #define DBG_CONTROL_BREAK           0x40010008
  933. #define DBG_EXCEPTION_NOT_HANDLED   0x80010001
  934. typedef struct _NT_TIB 
  935. {
  936. struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
  937. PVOID StackBase;
  938. PVOID StackLimit;
  939. PVOID SubSystemTib;
  940. union {
  941.           PVOID FiberData;
  942.           DWORD Version;
  943. } DUMMYUNIONNAME;
  944. PVOID ArbitraryUserPointer;
  945. struct _NT_TIB *Self;
  946. } NT_TIB, *PNT_TIB;
  947. struct _TEB;
  948. /*
  949. #if defined(__i386__) && defined(__GNUC__)
  950. extern inline struct _TEB * WINAPI NtCurrentTeb(void);
  951. extern inline struct _TEB * WINAPI NtCurrentTeb(void)
  952. {
  953.     struct _TEB *teb;
  954.     __asm__(".byte 0x64ntmovl (0x18),%0" : "=r" (teb));
  955.     return teb;
  956. }
  957. #else
  958. extern struct _TEB * WINAPI NtCurrentTeb(void);
  959. #endif
  960. */
  961. /*
  962.  * File formats definitions
  963.  */
  964. typedef struct _IMAGE_DOS_HEADER {
  965.     WORD  e_magic;      /* 00: MZ Header signature */
  966.     WORD  e_cblp;       /* 02: Bytes on last page of file */
  967.     WORD  e_cp;         /* 04: Pages in file */
  968.     WORD  e_crlc;       /* 06: Relocations */
  969.     WORD  e_cparhdr;    /* 08: Size of header in paragraphs */
  970.     WORD  e_minalloc;   /* 0a: Minimum extra paragraphs needed */
  971.     WORD  e_maxalloc;   /* 0c: Maximum extra paragraphs needed */
  972.     WORD  e_ss;         /* 0e: Initial (relative) SS value */
  973.     WORD  e_sp;         /* 10: Initial SP value */
  974.     WORD  e_csum;       /* 12: Checksum */
  975.     WORD  e_ip;         /* 14: Initial IP value */
  976.     WORD  e_cs;         /* 16: Initial (relative) CS value */
  977.     WORD  e_lfarlc;     /* 18: File address of relocation table */
  978.     WORD  e_ovno;       /* 1a: Overlay number */
  979.     WORD  e_res[4];     /* 1c: Reserved words */
  980.     WORD  e_oemid;      /* 24: OEM identifier (for e_oeminfo) */
  981.     WORD  e_oeminfo;    /* 26: OEM information; e_oemid specific */
  982.     WORD  e_res2[10];   /* 28: Reserved words */
  983.     DWORD e_lfanew;     /* 3c: Offset to extended header */
  984. } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
  985. #define IMAGE_DOS_SIGNATURE    0x5A4D     /* MZ   */
  986. #define IMAGE_OS2_SIGNATURE    0x454E     /* NE   */
  987. #define IMAGE_OS2_SIGNATURE_LE 0x454C     /* LE   */
  988. #define IMAGE_OS2_SIGNATURE_LX 0x584C     /* LX */
  989. #define IMAGE_VXD_SIGNATURE    0x454C     /* LE   */
  990. #define IMAGE_NT_SIGNATURE     0x00004550 /* PE00 */
  991. /*
  992.  * This is the Windows executable (NE) header.
  993.  * the name IMAGE_OS2_HEADER is misleading, but in the SDK this way.
  994.  */
  995. typedef struct 
  996. {
  997.     WORD  ne_magic;             /* 00 NE signature 'NE' */
  998.     BYTE  ne_ver;               /* 02 Linker version number */
  999.     BYTE  ne_rev;               /* 03 Linker revision number */
  1000.     WORD  ne_enttab;            /* 04 Offset to entry table relative to NE */
  1001.     WORD  ne_cbenttab;          /* 06 Length of entry table in bytes */
  1002.     LONG  ne_crc;               /* 08 Checksum */
  1003.     WORD  ne_flags;             /* 0c Flags about segments in this file */
  1004.     WORD  ne_autodata;          /* 0e Automatic data segment number */
  1005.     WORD  ne_heap;              /* 10 Initial size of local heap */
  1006.     WORD  ne_stack;             /* 12 Initial size of stack */
  1007.     DWORD ne_csip;              /* 14 Initial CS:IP */
  1008.     DWORD ne_sssp;              /* 18 Initial SS:SP */
  1009.     WORD  ne_cseg;              /* 1c # of entries in segment table */
  1010.     WORD  ne_cmod;              /* 1e # of entries in module reference tab. */
  1011.     WORD  ne_cbnrestab;         /* 20 Length of nonresident-name table     */
  1012.     WORD  ne_segtab;            /* 22 Offset to segment table */
  1013.     WORD  ne_rsrctab;           /* 24 Offset to resource table */
  1014.     WORD  ne_restab;            /* 26 Offset to resident-name table */
  1015.     WORD  ne_modtab;            /* 28 Offset to module reference table */
  1016.     WORD  ne_imptab;            /* 2a Offset to imported name table */
  1017.     DWORD ne_nrestab;           /* 2c Offset to nonresident-name table */
  1018.     WORD  ne_cmovent;           /* 30 # of movable entry points */
  1019.     WORD  ne_align;             /* 32 Logical sector alignment shift count */
  1020.     WORD  ne_cres;              /* 34 # of resource segments */
  1021.     BYTE  ne_exetyp;            /* 36 Flags indicating target OS */
  1022.     BYTE  ne_flagsothers;       /* 37 Additional information flags */
  1023.     WORD  fastload_offset;      /* 38 Offset to fast load area (should be ne_pretthunks)*/
  1024.     WORD  fastload_length;      /* 3a Length of fast load area (should be ne_psegrefbytes) */
  1025.     WORD  ne_swaparea;          /* 3c Reserved by Microsoft */
  1026.     WORD  ne_expver;            /* 3e Expected Windows version number */
  1027. } IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;
  1028. typedef struct _IMAGE_VXD_HEADER {
  1029.   WORD  e32_magic;
  1030.   BYTE  e32_border;
  1031.   BYTE  e32_worder;
  1032.   DWORD e32_level;
  1033.   WORD  e32_cpu;
  1034.   WORD  e32_os;
  1035.   DWORD e32_ver;
  1036.   DWORD e32_mflags;
  1037.   DWORD e32_mpages;
  1038.   DWORD e32_startobj;
  1039.   DWORD e32_eip;
  1040.   DWORD e32_stackobj;
  1041.   DWORD e32_esp;
  1042.   DWORD e32_pagesize;
  1043.   DWORD e32_lastpagesize;
  1044.   DWORD e32_fixupsize;
  1045.   DWORD e32_fixupsum;
  1046.   DWORD e32_ldrsize;
  1047.   DWORD e32_ldrsum;
  1048.   DWORD e32_objtab;
  1049.   DWORD e32_objcnt;
  1050.   DWORD e32_objmap;
  1051.   DWORD e32_itermap;
  1052.   DWORD e32_rsrctab;
  1053.   DWORD e32_rsrccnt;
  1054.   DWORD e32_restab;
  1055.   DWORD e32_enttab;
  1056.   DWORD e32_dirtab;
  1057.   DWORD e32_dircnt;
  1058.   DWORD e32_fpagetab;
  1059.   DWORD e32_frectab;
  1060.   DWORD e32_impmod;
  1061.   DWORD e32_impmodcnt;
  1062.   DWORD e32_impproc;
  1063.   DWORD e32_pagesum;
  1064.   DWORD e32_datapage;
  1065.   DWORD e32_preload;
  1066.   DWORD e32_nrestab;
  1067.   DWORD e32_cbnrestab;
  1068.   DWORD e32_nressum;
  1069.   DWORD e32_autodata;
  1070.   DWORD e32_debuginfo;
  1071.   DWORD e32_debuglen;
  1072.   DWORD e32_instpreload;
  1073.   DWORD e32_instdemand;
  1074.   DWORD e32_heapsize;
  1075.   BYTE   e32_res3[12];
  1076.   DWORD e32_winresoff;
  1077.   DWORD e32_winreslen;
  1078.   WORD  e32_devid;
  1079.   WORD  e32_ddkver;
  1080. } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
  1081. /* These defines describe the meanings of the bits in the Characteristics
  1082.    field */
  1083. #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 /* No relocation info */
  1084. #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
  1085. #define IMAGE_FILE_LINE_NUMS_STRIPPED   0x0004
  1086. #define IMAGE_FILE_LOCAL_SYMS_STRIPPED  0x0008
  1087. #define IMAGE_FILE_16BIT_MACHINE 0x0040
  1088. #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
  1089. #define IMAGE_FILE_32BIT_MACHINE 0x0100
  1090. #define IMAGE_FILE_DEBUG_STRIPPED 0x0200
  1091. #define IMAGE_FILE_SYSTEM 0x1000
  1092. #define IMAGE_FILE_DLL 0x2000
  1093. #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
  1094. /* These are the settings of the Machine field. */
  1095. #define IMAGE_FILE_MACHINE_UNKNOWN 0
  1096. #define IMAGE_FILE_MACHINE_I860 0x14d
  1097. #define IMAGE_FILE_MACHINE_I386 0x14c
  1098. #define IMAGE_FILE_MACHINE_R3000 0x162
  1099. #define IMAGE_FILE_MACHINE_R4000 0x166
  1100. #define IMAGE_FILE_MACHINE_R10000 0x168
  1101. #define IMAGE_FILE_MACHINE_ALPHA 0x184
  1102. #define IMAGE_FILE_MACHINE_POWERPC 0x1F0  
  1103. #define IMAGE_SIZEOF_FILE_HEADER 20
  1104. /* Possible Magic values */
  1105. #define IMAGE_NT_OPTIONAL_HDR_MAGIC        0x10b
  1106. #define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
  1107. /* These are indexes into the DataDirectory array */
  1108. #define IMAGE_FILE_EXPORT_DIRECTORY 0
  1109. #define IMAGE_FILE_IMPORT_DIRECTORY 1
  1110. #define IMAGE_FILE_RESOURCE_DIRECTORY 2
  1111. #define IMAGE_FILE_EXCEPTION_DIRECTORY 3
  1112. #define IMAGE_FILE_SECURITY_DIRECTORY 4
  1113. #define IMAGE_FILE_BASE_RELOCATION_TABLE 5
  1114. #define IMAGE_FILE_DEBUG_DIRECTORY 6
  1115. #define IMAGE_FILE_DESCRIPTION_STRING 7
  1116. #define IMAGE_FILE_MACHINE_VALUE 8  /* Mips */
  1117. #define IMAGE_FILE_THREAD_LOCAL_STORAGE 9
  1118. #define IMAGE_FILE_CALLBACK_DIRECTORY 10
  1119. /* Directory Entries, indices into the DataDirectory array */
  1120. #define IMAGE_DIRECTORY_ENTRY_EXPORT 0
  1121. #define IMAGE_DIRECTORY_ENTRY_IMPORT 1
  1122. #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
  1123. #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
  1124. #define IMAGE_DIRECTORY_ENTRY_SECURITY 4
  1125. #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
  1126. #define IMAGE_DIRECTORY_ENTRY_DEBUG 6
  1127. #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
  1128. #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8   /* (MIPS GP) */
  1129. #define IMAGE_DIRECTORY_ENTRY_TLS 9
  1130. #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
  1131. #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
  1132. #define IMAGE_DIRECTORY_ENTRY_IAT 12  /* Import Address Table */
  1133. #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13
  1134. #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
  1135. /* Subsystem Values */
  1136. #define IMAGE_SUBSYSTEM_UNKNOWN 0
  1137. #define IMAGE_SUBSYSTEM_NATIVE 1
  1138. #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 /* Windows GUI subsystem */
  1139. #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 /* Windows character subsystem*/
  1140. #define IMAGE_SUBSYSTEM_OS2_CUI 5
  1141. #define IMAGE_SUBSYSTEM_POSIX_CUI 7
  1142. typedef struct _IMAGE_FILE_HEADER {
  1143.   WORD  Machine;
  1144.   WORD  NumberOfSections;
  1145.   DWORD TimeDateStamp;
  1146.   DWORD PointerToSymbolTable;
  1147.   DWORD NumberOfSymbols;
  1148.   WORD  SizeOfOptionalHeader;
  1149.   WORD  Characteristics;
  1150. } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
  1151. typedef struct _IMAGE_DATA_DIRECTORY {
  1152.   DWORD VirtualAddress;
  1153.   DWORD Size;
  1154. } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
  1155. #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
  1156. typedef struct _IMAGE_OPTIONAL_HEADER {
  1157.   /* Standard fields */
  1158.   WORD  Magic;
  1159.   BYTE  MajorLinkerVersion;
  1160.   BYTE  MinorLinkerVersion;
  1161.   DWORD SizeOfCode;
  1162.   DWORD SizeOfInitializedData;
  1163.   DWORD SizeOfUninitializedData;
  1164.   DWORD AddressOfEntryPoint;
  1165.   DWORD BaseOfCode;
  1166.   DWORD BaseOfData;
  1167.   /* NT additional fields */
  1168.   DWORD ImageBase;
  1169.   DWORD SectionAlignment;
  1170.   DWORD FileAlignment;
  1171.   WORD  MajorOperatingSystemVersion;
  1172.   WORD  MinorOperatingSystemVersion;
  1173.   WORD  MajorImageVersion;
  1174.   WORD  MinorImageVersion;
  1175.   WORD  MajorSubsystemVersion;
  1176.   WORD  MinorSubsystemVersion;
  1177.   DWORD Win32VersionValue;
  1178.   DWORD SizeOfImage;
  1179.   DWORD SizeOfHeaders;
  1180.   DWORD CheckSum;
  1181.   WORD  Subsystem;
  1182.   WORD  DllCharacteristics;
  1183.   DWORD SizeOfStackReserve;
  1184.   DWORD SizeOfStackCommit;
  1185.   DWORD SizeOfHeapReserve;
  1186.   DWORD SizeOfHeapCommit;
  1187.   DWORD LoaderFlags;
  1188.   DWORD NumberOfRvaAndSizes;
  1189.   IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  1190. } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
  1191. typedef struct _IMAGE_NT_HEADERS {
  1192.   DWORD Signature;
  1193.   IMAGE_FILE_HEADER FileHeader;
  1194.   IMAGE_OPTIONAL_HEADER OptionalHeader;
  1195. } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
  1196. #define IMAGE_SIZEOF_SHORT_NAME 8
  1197. typedef struct _IMAGE_SECTION_HEADER {
  1198.   BYTE  Name[IMAGE_SIZEOF_SHORT_NAME];
  1199.   union {
  1200.     DWORD PhysicalAddress;
  1201.     DWORD VirtualSize;
  1202.   } Misc;
  1203.   DWORD VirtualAddress;
  1204.   DWORD SizeOfRawData;
  1205.   DWORD PointerToRawData;
  1206.   DWORD PointerToRelocations;
  1207.   DWORD PointerToLinenumbers;
  1208.   WORD  NumberOfRelocations;
  1209.   WORD  NumberOfLinenumbers;
  1210.   DWORD Characteristics;
  1211. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
  1212. #define IMAGE_SIZEOF_SECTION_HEADER 40
  1213. #define IMAGE_FIRST_SECTION(ntheader) 
  1214.   ((PIMAGE_SECTION_HEADER)((LPBYTE)&((PIMAGE_NT_HEADERS)(ntheader))->OptionalHeader + 
  1215.                            ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader))
  1216. /* These defines are for the Characteristics bitfield. */
  1217. /* #define IMAGE_SCN_TYPE_REG 0x00000000 - Reserved */
  1218. /* #define IMAGE_SCN_TYPE_DSECT 0x00000001 - Reserved */
  1219. /* #define IMAGE_SCN_TYPE_NOLOAD 0x00000002 - Reserved */
  1220. /* #define IMAGE_SCN_TYPE_GROUP 0x00000004 - Reserved */
  1221. /* #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 - Reserved */
  1222. /* #define IMAGE_SCN_TYPE_COPY 0x00000010 - Reserved */
  1223. #define IMAGE_SCN_CNT_CODE 0x00000020
  1224. #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
  1225. #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
  1226. #define IMAGE_SCN_LNK_OTHER 0x00000100 
  1227. #define IMAGE_SCN_LNK_INFO 0x00000200  
  1228. /* #define IMAGE_SCN_TYPE_OVER 0x00000400 - Reserved */
  1229. #define IMAGE_SCN_LNK_REMOVE 0x00000800
  1230. #define IMAGE_SCN_LNK_COMDAT 0x00001000
  1231. /*  0x00002000 - Reserved */
  1232. /* #define IMAGE_SCN_MEM_PROTECTED  0x00004000 - Obsolete */
  1233. #define IMAGE_SCN_MEM_FARDATA 0x00008000
  1234. /* #define IMAGE_SCN_MEM_SYSHEAP 0x00010000 - Obsolete */
  1235. #define IMAGE_SCN_MEM_PURGEABLE 0x00020000
  1236. #define IMAGE_SCN_MEM_16BIT 0x00020000
  1237. #define IMAGE_SCN_MEM_LOCKED 0x00040000
  1238. #define IMAGE_SCN_MEM_PRELOAD 0x00080000
  1239. #define IMAGE_SCN_ALIGN_1BYTES 0x00100000
  1240. #define IMAGE_SCN_ALIGN_2BYTES 0x00200000
  1241. #define IMAGE_SCN_ALIGN_4BYTES 0x00300000
  1242. #define IMAGE_SCN_ALIGN_8BYTES 0x00400000
  1243. #define IMAGE_SCN_ALIGN_16BYTES 0x00500000  /* Default */
  1244. #define IMAGE_SCN_ALIGN_32BYTES 0x00600000
  1245. #define IMAGE_SCN_ALIGN_64BYTES 0x00700000
  1246. /*  0x00800000 - Unused */
  1247. #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
  1248. #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
  1249. #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
  1250. #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
  1251. #define IMAGE_SCN_MEM_SHARED 0x10000000
  1252. #define IMAGE_SCN_MEM_EXECUTE 0x20000000
  1253. #define IMAGE_SCN_MEM_READ 0x40000000
  1254. #define IMAGE_SCN_MEM_WRITE 0x80000000
  1255. #include "pshpack2.h"
  1256. typedef struct _IMAGE_SYMBOL {
  1257.     union {
  1258.         BYTE    ShortName[8];
  1259.         struct {
  1260.             DWORD   Short;
  1261.             DWORD   Long;
  1262.         } Name;
  1263.         DWORD   LongName[2];
  1264.     } N;
  1265.     DWORD   Value;
  1266.     SHORT   SectionNumber;
  1267.     WORD    Type;
  1268.     BYTE    StorageClass;
  1269.     BYTE    NumberOfAuxSymbols;
  1270. } IMAGE_SYMBOL;
  1271. typedef IMAGE_SYMBOL *PIMAGE_SYMBOL;
  1272. #define IMAGE_SIZEOF_SYMBOL 18
  1273. typedef struct _IMAGE_LINENUMBER {
  1274.     union {
  1275.         DWORD   SymbolTableIndex;
  1276.         DWORD   VirtualAddress;
  1277.     } Type;
  1278.     WORD    Linenumber;
  1279. } IMAGE_LINENUMBER;
  1280. typedef IMAGE_LINENUMBER *PIMAGE_LINENUMBER;
  1281. #define IMAGE_SIZEOF_LINENUMBER  6
  1282. typedef union _IMAGE_AUX_SYMBOL {
  1283.     struct {
  1284.         DWORD    TagIndex;
  1285.         union {
  1286.             struct {
  1287.                 WORD    Linenumber;
  1288.                 WORD    Size;
  1289.             } LnSz;
  1290.            DWORD    TotalSize;
  1291.         } Misc;
  1292.         union {
  1293.             struct {
  1294.                 DWORD    PointerToLinenumber;
  1295.                 DWORD    PointerToNextFunction;
  1296.             } Function;
  1297.             struct {
  1298.                 WORD     Dimension[4];
  1299.             } Array;
  1300.         } FcnAry;
  1301.         WORD    TvIndex;
  1302.     } Sym;
  1303.     struct {
  1304.         BYTE    Name[IMAGE_SIZEOF_SYMBOL];
  1305.     } File;
  1306.     struct {
  1307.         DWORD   Length;
  1308.         WORD    NumberOfRelocations;
  1309.         WORD    NumberOfLinenumbers;
  1310.         DWORD   CheckSum;
  1311.         SHORT   Number;
  1312.         BYTE    Selection;
  1313.     } Section;
  1314. } IMAGE_AUX_SYMBOL;
  1315. typedef IMAGE_AUX_SYMBOL *PIMAGE_AUX_SYMBOL;
  1316. #define IMAGE_SIZEOF_AUX_SYMBOL 18
  1317. #include "poppack.h"
  1318. #define IMAGE_SYM_UNDEFINED           (SHORT)0
  1319. #define IMAGE_SYM_ABSOLUTE            (SHORT)-1
  1320. #define IMAGE_SYM_DEBUG               (SHORT)-2
  1321. #define IMAGE_SYM_TYPE_NULL                 0x0000
  1322. #define IMAGE_SYM_TYPE_VOID                 0x0001
  1323. #define IMAGE_SYM_TYPE_CHAR                 0x0002
  1324. #define IMAGE_SYM_TYPE_SHORT                0x0003
  1325. #define IMAGE_SYM_TYPE_INT                  0x0004
  1326. #define IMAGE_SYM_TYPE_LONG                 0x0005
  1327. #define IMAGE_SYM_TYPE_FLOAT                0x0006
  1328. #define IMAGE_SYM_TYPE_DOUBLE               0x0007
  1329. #define IMAGE_SYM_TYPE_STRUCT               0x0008
  1330. #define IMAGE_SYM_TYPE_UNION                0x0009
  1331. #define IMAGE_SYM_TYPE_ENUM                 0x000A
  1332. #define IMAGE_SYM_TYPE_MOE                  0x000B
  1333. #define IMAGE_SYM_TYPE_BYTE                 0x000C
  1334. #define IMAGE_SYM_TYPE_WORD                 0x000D
  1335. #define IMAGE_SYM_TYPE_UINT                 0x000E
  1336. #define IMAGE_SYM_TYPE_DWORD                0x000F
  1337. #define IMAGE_SYM_TYPE_PCODE                0x8000
  1338. #define IMAGE_SYM_DTYPE_NULL                0
  1339. #define IMAGE_SYM_DTYPE_POINTER             1
  1340. #define IMAGE_SYM_DTYPE_FUNCTION            2
  1341. #define IMAGE_SYM_DTYPE_ARRAY               3
  1342. #define IMAGE_SYM_CLASS_END_OF_FUNCTION     (BYTE )-1
  1343. #define IMAGE_SYM_CLASS_NULL                0x0000
  1344. #define IMAGE_SYM_CLASS_AUTOMATIC           0x0001
  1345. #define IMAGE_SYM_CLASS_EXTERNAL            0x0002
  1346. #define IMAGE_SYM_CLASS_STATIC              0x0003
  1347. #define IMAGE_SYM_CLASS_REGISTER            0x0004
  1348. #define IMAGE_SYM_CLASS_EXTERNAL_DEF        0x0005
  1349. #define IMAGE_SYM_CLASS_LABEL               0x0006
  1350. #define IMAGE_SYM_CLASS_UNDEFINED_LABEL     0x0007
  1351. #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT    0x0008
  1352. #define IMAGE_SYM_CLASS_ARGUMENT            0x0009
  1353. #define IMAGE_SYM_CLASS_STRUCT_TAG          0x000A
  1354. #define IMAGE_SYM_CLASS_MEMBER_OF_UNION     0x000B
  1355. #define IMAGE_SYM_CLASS_UNION_TAG           0x000C
  1356. #define IMAGE_SYM_CLASS_TYPE_DEFINITION     0x000D
  1357. #define IMAGE_SYM_CLASS_UNDEFINED_STATIC    0x000E
  1358. #define IMAGE_SYM_CLASS_ENUM_TAG            0x000F
  1359. #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM      0x0010
  1360. #define IMAGE_SYM_CLASS_REGISTER_PARAM      0x0011
  1361. #define IMAGE_SYM_CLASS_BIT_FIELD           0x0012
  1362. #define IMAGE_SYM_CLASS_FAR_EXTERNAL        0x0044
  1363. #define IMAGE_SYM_CLASS_BLOCK               0x0064
  1364. #define IMAGE_SYM_CLASS_FUNCTION            0x0065
  1365. #define IMAGE_SYM_CLASS_END_OF_STRUCT       0x0066
  1366. #define IMAGE_SYM_CLASS_FILE                0x0067
  1367. #define IMAGE_SYM_CLASS_SECTION             0x0068
  1368. #define IMAGE_SYM_CLASS_WEAK_EXTERNAL       0x0069
  1369. #define N_BTMASK                            0x000F
  1370. #define N_TMASK                             0x0030
  1371. #define N_TMASK1                            0x00C0
  1372. #define N_TMASK2                            0x00F0
  1373. #define N_BTSHFT                            4
  1374. #define N_TSHIFT                            2
  1375. #define BTYPE(x) ((x) & N_BTMASK)
  1376. #ifndef ISPTR
  1377. #define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
  1378. #endif
  1379. #ifndef ISFCN
  1380. #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
  1381. #endif
  1382. #ifndef ISARY
  1383. #define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))
  1384. #endif
  1385. #ifndef ISTAG
  1386. #define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)
  1387. #endif
  1388. #ifndef INCREF
  1389. #define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
  1390. #endif
  1391. #ifndef DECREF
  1392. #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
  1393. #endif
  1394. #define IMAGE_COMDAT_SELECT_NODUPLICATES    1
  1395. #define IMAGE_COMDAT_SELECT_ANY             2
  1396. #define IMAGE_COMDAT_SELECT_SAME_SIZE       3
  1397. #define IMAGE_COMDAT_SELECT_EXACT_MATCH     4
  1398. #define IMAGE_COMDAT_SELECT_ASSOCIATIVE     5
  1399. #define IMAGE_COMDAT_SELECT_LARGEST         6
  1400. #define IMAGE_COMDAT_SELECT_NEWEST          7
  1401. #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1
  1402. #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2
  1403. #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3
  1404. /* Export module directory */
  1405. typedef struct _IMAGE_EXPORT_DIRECTORY {
  1406. DWORD Characteristics;
  1407. DWORD TimeDateStamp;
  1408. WORD MajorVersion;
  1409. WORD MinorVersion;
  1410. DWORD Name;
  1411. DWORD Base;
  1412. DWORD NumberOfFunctions;
  1413. DWORD NumberOfNames;
  1414. LPDWORD *AddressOfFunctions;
  1415. LPDWORD *AddressOfNames;
  1416. LPWORD *AddressOfNameOrdinals;
  1417. } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
  1418. /* Import name entry */
  1419. typedef struct _IMAGE_IMPORT_BY_NAME {
  1420. WORD Hint;
  1421. BYTE Name[1];
  1422. } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
  1423. /* Import thunk */
  1424. typedef struct _IMAGE_THUNK_DATA {
  1425. union {
  1426. LPBYTE    ForwarderString;
  1427. FARPROC Function;
  1428. DWORD     Ordinal;
  1429. PIMAGE_IMPORT_BY_NAME AddressOfData;
  1430. } u1;
  1431. } IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;
  1432. /* Import module directory */
  1433. typedef struct _IMAGE_IMPORT_DESCRIPTOR {
  1434. union {
  1435. DWORD Characteristics; /* 0 for terminating null import descriptor  */
  1436. PIMAGE_THUNK_DATA OriginalFirstThunk; /* RVA to original unbound IAT */
  1437. } u;
  1438. DWORD TimeDateStamp; /* 0 if not bound,
  1439.  * -1 if bound, and real datetime stamp
  1440.  *    in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
  1441.  * (new BIND)
  1442.  * otherwise date/time stamp of DLL bound to
  1443.  * (Old BIND)
  1444.  */
  1445. DWORD ForwarderChain; /* -1 if no forwarders */
  1446. DWORD Name;
  1447. /* RVA to IAT (if bound this IAT has actual addresses) */
  1448. PIMAGE_THUNK_DATA FirstThunk;
  1449. } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
  1450. #define IMAGE_ORDINAL_FLAG 0x80000000
  1451. #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
  1452. #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
  1453. typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR
  1454. {
  1455.     DWORD   TimeDateStamp;
  1456.     WORD    OffsetModuleName;
  1457.     WORD    NumberOfModuleForwarderRefs;
  1458. /* Array of zero or more IMAGE_BOUND_FORWARDER_REF follows */
  1459. } IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
  1460. typedef struct _IMAGE_BOUND_FORWARDER_REF
  1461. {
  1462.     DWORD   TimeDateStamp;
  1463.     WORD    OffsetModuleName;
  1464.     WORD    Reserved;
  1465. } IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
  1466. typedef struct _IMAGE_BASE_RELOCATION
  1467. {
  1468. DWORD VirtualAddress;
  1469. DWORD SizeOfBlock;
  1470. WORD TypeOffset[1];
  1471. } IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
  1472. typedef struct _IMAGE_RELOCATION
  1473. {
  1474.     union {
  1475.         DWORD   VirtualAddress;
  1476.         DWORD   RelocCount;
  1477.     } u;
  1478.     DWORD   SymbolTableIndex;
  1479.     WORD    Type;
  1480. } IMAGE_RELOCATION;
  1481. typedef IMAGE_RELOCATION *PIMAGE_RELOCATION;
  1482. #define IMAGE_SIZEOF_RELOCATION 10
  1483. /* generic relocation types */
  1484. #define IMAGE_REL_BASED_ABSOLUTE  0
  1485. #define IMAGE_REL_BASED_HIGH 1
  1486. #define IMAGE_REL_BASED_LOW 2
  1487. #define IMAGE_REL_BASED_HIGHLOW 3
  1488. #define IMAGE_REL_BASED_HIGHADJ 4
  1489. #define IMAGE_REL_BASED_MIPS_JMPADDR 5
  1490. #define IMAGE_REL_BASED_SECTION 6
  1491. #define IMAGE_REL_BASED_REL 7
  1492. #define IMAGE_REL_BASED_MIPS_JMPADDR16 9
  1493. #define IMAGE_REL_BASED_IA64_IMM64 9 /* yes, 9 too */
  1494. #define IMAGE_REL_BASED_DIR64 10
  1495. #define IMAGE_REL_BASED_HIGH3ADJ 11
  1496. /* I386 relocation types */
  1497. #define IMAGE_REL_I386_ABSOLUTE 0
  1498. #define IMAGE_REL_I386_DIR16 1
  1499. #define IMAGE_REL_I386_REL16 2
  1500. #define IMAGE_REL_I386_DIR32 6
  1501. #define IMAGE_REL_I386_DIR32NB 7
  1502. #define IMAGE_REL_I386_SEG12 9
  1503. #define IMAGE_REL_I386_SECTION 10
  1504. #define IMAGE_REL_I386_SECREL 11
  1505. #define IMAGE_REL_I386_REL32 20
  1506. /* MIPS relocation types */
  1507. #define IMAGE_REL_MIPS_ABSOLUTE 0x0000
  1508. #define IMAGE_REL_MIPS_REFHALF 0x0001
  1509. #define IMAGE_REL_MIPS_REFWORD 0x0002
  1510. #define IMAGE_REL_MIPS_JMPADDR 0x0003
  1511. #define IMAGE_REL_MIPS_REFHI 0x0004
  1512. #define IMAGE_REL_MIPS_REFLO 0x0005
  1513. #define IMAGE_REL_MIPS_GPREL 0x0006
  1514. #define IMAGE_REL_MIPS_LITERAL 0x0007
  1515. #define IMAGE_REL_MIPS_SECTION 0x000A
  1516. #define IMAGE_REL_MIPS_SECREL 0x000B
  1517. #define IMAGE_REL_MIPS_SECRELLO 0x000C
  1518. #define IMAGE_REL_MIPS_SECRELHI 0x000D
  1519. #define IMAGE_REL_MIPS_JMPADDR16 0x0010
  1520. #define IMAGE_REL_MIPS_REFWORDNB 0x0022
  1521. #define IMAGE_REL_MIPS_PAIR 0x0025
  1522. /* ALPHA relocation types */
  1523. #define IMAGE_REL_ALPHA_ABSOLUTE 0x0000
  1524. #define IMAGE_REL_ALPHA_REFLONG 0x0001
  1525. #define IMAGE_REL_ALPHA_REFQUAD 0x0002
  1526. #define IMAGE_REL_ALPHA_GPREL 0x0003
  1527. #define IMAGE_REL_ALPHA_LITERAL 0x0004
  1528. #define IMAGE_REL_ALPHA_LITUSE 0x0005
  1529. #define IMAGE_REL_ALPHA_GPDISP 0x0006
  1530. #define IMAGE_REL_ALPHA_BRADDR 0x0007
  1531. #define IMAGE_REL_ALPHA_HINT 0x0008
  1532. #define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009
  1533. #define IMAGE_REL_ALPHA_REFHI 0x000A
  1534. #define IMAGE_REL_ALPHA_REFLO 0x000B
  1535. #define IMAGE_REL_ALPHA_PAIR 0x000C
  1536. #define IMAGE_REL_ALPHA_MATCH 0x000D
  1537. #define IMAGE_REL_ALPHA_SECTION 0x000E
  1538. #define IMAGE_REL_ALPHA_SECREL 0x000F
  1539. #define IMAGE_REL_ALPHA_REFLONGNB 0x0010
  1540. #define IMAGE_REL_ALPHA_SECRELLO 0x0011
  1541. #define IMAGE_REL_ALPHA_SECRELHI 0x0012
  1542. #define IMAGE_REL_ALPHA_REFQ3 0x0013
  1543. #define IMAGE_REL_ALPHA_REFQ2 0x0014
  1544. #define IMAGE_REL_ALPHA_REFQ1 0x0015
  1545. #define IMAGE_REL_ALPHA_GPRELLO 0x0016
  1546. #define IMAGE_REL_ALPHA_GPRELHI 0x0017
  1547. /* PowerPC relocation types */
  1548. #define IMAGE_REL_PPC_ABSOLUTE          0x0000
  1549. #define IMAGE_REL_PPC_ADDR64            0x0001
  1550. #define IMAGE_REL_PPC_ADDR            0x0002
  1551. #define IMAGE_REL_PPC_ADDR24            0x0003
  1552. #define IMAGE_REL_PPC_ADDR16            0x0004
  1553. #define IMAGE_REL_PPC_ADDR14            0x0005
  1554. #define IMAGE_REL_PPC_REL24             0x0006
  1555. #define IMAGE_REL_PPC_REL14             0x0007
  1556. #define IMAGE_REL_PPC_TOCREL16          0x0008
  1557. #define IMAGE_REL_PPC_TOCREL14          0x0009
  1558. #define IMAGE_REL_PPC_ADDR32NB          0x000A
  1559. #define IMAGE_REL_PPC_SECREL            0x000B
  1560. #define IMAGE_REL_PPC_SECTION           0x000C
  1561. #define IMAGE_REL_PPC_IFGLUE            0x000D
  1562. #define IMAGE_REL_PPC_IMGLUE            0x000E
  1563. #define IMAGE_REL_PPC_SECREL16          0x000F
  1564. #define IMAGE_REL_PPC_REFHI             0x0010
  1565. #define IMAGE_REL_PPC_REFLO             0x0011
  1566. #define IMAGE_REL_PPC_PAIR              0x0012
  1567. #define IMAGE_REL_PPC_SECRELLO          0x0013
  1568. #define IMAGE_REL_PPC_SECRELHI          0x0014
  1569. #define IMAGE_REL_PPC_GPREL 0x0015
  1570. #define IMAGE_REL_PPC_TYPEMASK          0x00FF
  1571. /* modifier bits */
  1572. #define IMAGE_REL_PPC_NEG               0x0100
  1573. #define IMAGE_REL_PPC_BRTAKEN           0x0200
  1574. #define IMAGE_REL_PPC_BRNTAKEN          0x0400
  1575. #define IMAGE_REL_PPC_TOCDEFN           0x0800
  1576. /* SH3 ? relocation type */
  1577. #define IMAGE_REL_SH3_ABSOLUTE          0x0000
  1578. #define IMAGE_REL_SH3_DIRECT16          0x0001
  1579. #define IMAGE_REL_SH3_DIRECT          0x0002
  1580. #define IMAGE_REL_SH3_DIRECT8           0x0003
  1581. #define IMAGE_REL_SH3_DIRECT8_WORD      0x0004
  1582. #define IMAGE_REL_SH3_DIRECT8_LONG      0x0005
  1583. #define IMAGE_REL_SH3_DIRECT4           0x0006
  1584. #define IMAGE_REL_SH3_DIRECT4_WORD      0x0007
  1585. #define IMAGE_REL_SH3_DIRECT4_LONG      0x0008
  1586. #define IMAGE_REL_SH3_PCREL8_WORD       0x0009
  1587. #define IMAGE_REL_SH3_PCREL8_LONG       0x000A
  1588. #define IMAGE_REL_SH3_PCREL12_WORD      0x000B
  1589. #define IMAGE_REL_SH3_STARTOF_SECTION   0x000C
  1590. #define IMAGE_REL_SH3_SIZEOF_SECTION    0x000D
  1591. #define IMAGE_REL_SH3_SECTION           0x000E
  1592. #define IMAGE_REL_SH3_SECREL            0x000F
  1593. #define IMAGE_REL_SH3_DIRECT32_NB       0x0010
  1594. /* ARM (Archimedes?) relocation types */
  1595. #define IMAGE_REL_ARM_ABSOLUTE 0x0000
  1596. #define IMAGE_REL_ARM_ADDR 0x0001
  1597. #define IMAGE_REL_ARM_ADDR32NB 0x0002
  1598. #define IMAGE_REL_ARM_BRANCH24 0x0003
  1599. #define IMAGE_REL_ARM_BRANCH11 0x0004
  1600. #define IMAGE_REL_ARM_SECTION 0x000E
  1601. #define IMAGE_REL_ARM_SECREL 0x000F
  1602. /* IA64 relocation types */
  1603. #define IMAGE_REL_IA64_ABSOLUTE 0x0000
  1604. #define IMAGE_REL_IA64_IMM14 0x0001
  1605. #define IMAGE_REL_IA64_IMM22 0x0002
  1606. #define IMAGE_REL_IA64_IMM64 0x0003
  1607. #define IMAGE_REL_IA64_DIR 0x0004
  1608. #define IMAGE_REL_IA64_DIR64 0x0005
  1609. #define IMAGE_REL_IA64_PCREL21B 0x0006
  1610. #define IMAGE_REL_IA64_PCREL21M 0x0007
  1611. #define IMAGE_REL_IA64_PCREL21F 0x0008
  1612. #define IMAGE_REL_IA64_GPREL22 0x0009
  1613. #define IMAGE_REL_IA64_LTOFF22 0x000A
  1614. #define IMAGE_REL_IA64_SECTION 0x000B
  1615. #define IMAGE_REL_IA64_SECREL22 0x000C
  1616. #define IMAGE_REL_IA64_SECREL64I 0x000D
  1617. #define IMAGE_REL_IA64_SECREL 0x000E
  1618. #define IMAGE_REL_IA64_LTOFF64 0x000F
  1619. #define IMAGE_REL_IA64_DIR32NB 0x0010
  1620. #define IMAGE_REL_IA64_RESERVED_11 0x0011
  1621. #define IMAGE_REL_IA64_RESERVED_12 0x0012
  1622. #define IMAGE_REL_IA64_RESERVED_13 0x0013
  1623. #define IMAGE_REL_IA64_RESERVED_14 0x0014
  1624. #define IMAGE_REL_IA64_RESERVED_15 0x0015
  1625. #define IMAGE_REL_IA64_RESERVED_16 0x0016
  1626. #define IMAGE_REL_IA64_ADDEND 0x001F
  1627. /* archive format */
  1628. #define IMAGE_ARCHIVE_START_SIZE             8
  1629. #define IMAGE_ARCHIVE_START                  "!<arch>n"
  1630. #define IMAGE_ARCHIVE_END                    "`n"
  1631. #define IMAGE_ARCHIVE_PAD                    "n"
  1632. #define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "
  1633. #define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "
  1634. typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER
  1635. {
  1636.     BYTE     Name[16];
  1637.     BYTE     Date[12];
  1638.     BYTE     UserID[6];
  1639.     BYTE     GroupID[6];
  1640.     BYTE     Mode[8];
  1641.     BYTE     Size[10];
  1642.     BYTE     EndHeader[2];
  1643. } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
  1644. #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
  1645. /*
  1646.  * Resource directory stuff
  1647.  */
  1648. typedef struct _IMAGE_RESOURCE_DIRECTORY {
  1649. DWORD Characteristics;
  1650. DWORD TimeDateStamp;
  1651. WORD MajorVersion;
  1652. WORD MinorVersion;
  1653. WORD NumberOfNamedEntries;
  1654. WORD NumberOfIdEntries;
  1655. /*  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; */
  1656. } IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
  1657. #define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
  1658. #define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
  1659. typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
  1660. union {
  1661. struct {
  1662. unsigned NameOffset:31;
  1663. unsigned NameIsString:1;
  1664. } s;
  1665. DWORD   Name;
  1666. WORD    Id;
  1667. } u1;
  1668. union {
  1669. DWORD   OffsetToData;
  1670. struct {
  1671. unsigned OffsetToDirectory:31;
  1672. unsigned DataIsDirectory:1;
  1673. } s;
  1674. } u2;
  1675. } IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
  1676. typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
  1677. WORD Length;
  1678. CHAR NameString[ 1 ];
  1679. } IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING;
  1680. typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
  1681. WORD Length;
  1682. WCHAR NameString[ 1 ];
  1683. } IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;
  1684. typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
  1685. DWORD OffsetToData;
  1686. DWORD Size;
  1687. DWORD CodePage;
  1688. DWORD ResourceHandle;
  1689. } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
  1690. typedef VOID CALLBACK (*PIMAGE_TLS_CALLBACK)(
  1691. LPVOID DllHandle,DWORD Reason,LPVOID Reserved
  1692. );
  1693. typedef struct _IMAGE_TLS_DIRECTORY {
  1694. DWORD StartAddressOfRawData;
  1695. DWORD EndAddressOfRawData;
  1696. LPDWORD AddressOfIndex;
  1697. PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
  1698. DWORD SizeOfZeroFill;
  1699. DWORD Characteristics;
  1700. } IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY;
  1701. typedef struct _IMAGE_DEBUG_DIRECTORY {
  1702.   DWORD Characteristics;
  1703.   DWORD TimeDateStamp;
  1704.   WORD  MajorVersion;
  1705.   WORD  MinorVersion;
  1706.   DWORD Type;
  1707.   DWORD SizeOfData;
  1708.   DWORD AddressOfRawData;
  1709.   DWORD PointerToRawData;
  1710. } IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
  1711. #define IMAGE_DEBUG_TYPE_UNKNOWN        0
  1712. #define IMAGE_DEBUG_TYPE_COFF           1
  1713. #define IMAGE_DEBUG_TYPE_CODEVIEW       2
  1714. #define IMAGE_DEBUG_TYPE_FPO            3
  1715. #define IMAGE_DEBUG_TYPE_MISC           4
  1716. #define IMAGE_DEBUG_TYPE_EXCEPTION      5
  1717. #define IMAGE_DEBUG_TYPE_FIXUP          6
  1718. #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC    7
  1719. #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC  8
  1720. #define IMAGE_DEBUG_TYPE_BORLAND        9
  1721. #define IMAGE_DEBUG_TYPE_RESERVED10    10
  1722. typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
  1723.   DWORD NumberOfSymbols;
  1724.   DWORD LvaToFirstSymbol;
  1725.   DWORD NumberOfLinenumbers;
  1726.   DWORD LvaToFirstLinenumber;
  1727.   DWORD RvaToFirstByteOfCode;
  1728.   DWORD RvaToLastByteOfCode;
  1729.   DWORD RvaToFirstByteOfData;
  1730.   DWORD RvaToLastByteOfData;
  1731. } IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
  1732. #define FRAME_FPO       0
  1733. #define FRAME_TRAP      1
  1734. #define FRAME_TSS       2
  1735. #define FRAME_NONFPO    3
  1736. typedef struct _FPO_DATA {
  1737.   DWORD ulOffStart;
  1738.   DWORD cbProcSize;
  1739.   DWORD cdwLocals;
  1740.   WORD  cdwParams;
  1741.   unsigned cbProlog : 8;
  1742.   unsigned cbRegs   : 3;
  1743.   unsigned fHasSEH  : 1;
  1744.   unsigned fUseBP   : 1;
  1745.   unsigned reserved : 1;
  1746.   unsigned cbFrame  : 2;
  1747. } FPO_DATA, *PFPO_DATA;
  1748. typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
  1749.   DWORD Characteristics;
  1750.   DWORD TimeDateStamp;
  1751.   WORD  MajorVersion;
  1752.   WORD  MinorVersion;
  1753.   DWORD GlobalFlagsClear;
  1754.   DWORD GlobalFlagsSet;
  1755.   DWORD CriticalSectionDefaultTimeout;
  1756.   DWORD DeCommitFreeBlockThreshold;
  1757.   DWORD DeCommitTotalFreeThreshold;
  1758.   PVOID LockPrefixTable;
  1759.   DWORD MaximumAllocationSize;
  1760.   DWORD VirtualMemoryThreshold;
  1761.   DWORD ProcessHeapFlags;
  1762.   DWORD ProcessAffinityMask;
  1763.   WORD  CSDVersion;
  1764.   WORD  Reserved1;
  1765.   PVOID EditList;
  1766.   DWORD Reserved[1];
  1767. } IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;
  1768. typedef struct _IMAGE_FUNCTION_ENTRY {
  1769.   DWORD StartingAddress;
  1770.   DWORD EndingAddress;
  1771.   DWORD EndOfPrologue;
  1772. } IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
  1773. /* This is the structure that appears at the very start of a .DBG file. */
  1774. typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
  1775. WORD Signature;
  1776. WORD Flags;
  1777. WORD Machine;
  1778. WORD Characteristics;
  1779. DWORD TimeDateStamp;
  1780. DWORD CheckSum;
  1781. DWORD ImageBase;
  1782. DWORD SizeOfImage;
  1783. DWORD NumberOfSections;
  1784. DWORD ExportedNamesSize;
  1785. DWORD DebugDirectorySize;
  1786. DWORD SectionAlignment;
  1787. DWORD Reserved[ 2 ];
  1788. } IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER;
  1789. #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
  1790. typedef struct tagMESSAGE_RESOURCE_ENTRY {
  1791. WORD Length;
  1792. WORD Flags;
  1793. BYTE Text[1];
  1794. } MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY;
  1795. #define MESSAGE_RESOURCE_UNICODE 0x0001
  1796. typedef struct tagMESSAGE_RESOURCE_BLOCK {
  1797. DWORD LowId;
  1798. DWORD HighId;
  1799. DWORD OffsetToEntries;
  1800. } MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK;
  1801. typedef struct tagMESSAGE_RESOURCE_DATA {
  1802. DWORD NumberOfBlocks;
  1803. MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
  1804. } MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;
  1805. /*
  1806.  * Here follows typedefs for security and tokens.
  1807.  */ 
  1808. /*
  1809.  * First a constant for the following typdefs.
  1810.  */
  1811. #define ANYSIZE_ARRAY   1
  1812. /* FIXME:  Orphan.  What does it point to? */
  1813. typedef PVOID PACCESS_TOKEN;
  1814. /*
  1815.  * TOKEN_INFORMATION_CLASS
  1816.  */
  1817. typedef enum _TOKEN_INFORMATION_CLASS {
  1818.   TokenUser = 1, 
  1819.   TokenGroups, 
  1820.   TokenPrivileges, 
  1821.   TokenOwner, 
  1822.   TokenPrimaryGroup, 
  1823.   TokenDefaultDacl, 
  1824.   TokenSource, 
  1825.   TokenType, 
  1826.   TokenImpersonationLevel, 
  1827.   TokenStatistics 
  1828. } TOKEN_INFORMATION_CLASS; 
  1829. #ifndef _SECURITY_DEFINED
  1830. #define _SECURITY_DEFINED
  1831. #include "pshpack1.h"
  1832. typedef DWORD ACCESS_MASK, *PACCESS_MASK;
  1833. typedef struct _GENERIC_MAPPING {
  1834.     ACCESS_MASK GenericRead;
  1835.     ACCESS_MASK GenericWrite;
  1836.     ACCESS_MASK GenericExecute;
  1837.     ACCESS_MASK GenericAll;
  1838. } GENERIC_MAPPING, *PGENERIC_MAPPING;
  1839. #ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
  1840. #define SID_IDENTIFIER_AUTHORITY_DEFINED
  1841. typedef struct {
  1842.     BYTE Value[6];
  1843. } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
  1844. #endif /* !defined(SID_IDENTIFIER_AUTHORITY_DEFINED) */
  1845. #ifndef SID_DEFINED
  1846. #define SID_DEFINED
  1847. typedef struct _SID {
  1848.     BYTE Revision;
  1849.     BYTE SubAuthorityCount;
  1850.     SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
  1851.     DWORD SubAuthority[1];
  1852. } SID,*PSID;
  1853. #endif /* !defined(SID_DEFINED) */
  1854. #define SID_REVISION (1) /* Current revision */
  1855. #define SID_MAX_SUB_AUTHORITIES (15) /* current max subauths */
  1856. #define SID_RECOMMENDED_SUB_AUTHORITIES (1) /* recommended subauths */
  1857. /* 
  1858.  * ACL 
  1859.  */
  1860. #define ACL_REVISION1 1
  1861. #define ACL_REVISION2 2
  1862. #define ACL_REVISION3 3
  1863. #define ACL_REVISION4 4
  1864. #define MIN_ACL_REVISION ACL_REVISION2
  1865. #define MAX_ACL_REVISION ACL_REVISION4
  1866. typedef struct _ACL {
  1867.     BYTE AclRevision;
  1868.     BYTE Sbz1;
  1869.     WORD AclSize;
  1870.     WORD AceCount;
  1871.     WORD Sbz2;
  1872. } ACL, *PACL;
  1873. /* SECURITY_DESCRIPTOR */
  1874. #define SECURITY_DESCRIPTOR_REVISION 1
  1875. #define SECURITY_DESCRIPTOR_REVISION1 1
  1876. #define SE_OWNER_DEFAULTED 0x0001
  1877. #define SE_GROUP_DEFAULTED 0x0002
  1878. #define SE_DACL_PRESENT 0x0004
  1879. #define SE_DACL_DEFAULTED 0x0008
  1880. #define SE_SACL_PRESENT 0x0010
  1881. #define SE_SACL_DEFAULTED 0x0020
  1882. #define SE_SELF_RELATIVE 0x8000
  1883. typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
  1884. typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
  1885. /* The security descriptor structure */
  1886. typedef struct {
  1887.     BYTE Revision;
  1888.     BYTE Sbz1;
  1889.     SECURITY_DESCRIPTOR_CONTROL Control;
  1890.     DWORD Owner;
  1891.     DWORD Group;
  1892.     DWORD Sacl;
  1893.     DWORD Dacl;
  1894. } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
  1895. typedef struct {
  1896.     BYTE Revision;
  1897.     BYTE Sbz1;
  1898.     SECURITY_DESCRIPTOR_CONTROL Control;
  1899.     PSID Owner;
  1900.     PSID Group;
  1901.     PACL Sacl;
  1902.     PACL Dacl;
  1903. } SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
  1904. #define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR)) 
  1905. #include "poppack.h"
  1906. #endif /* _SECURITY_DEFINED */
  1907. #include "pshpack1.h"
  1908. /* 
  1909.  * SID_AND_ATTRIBUTES
  1910.  */
  1911. typedef struct _SID_AND_ATTRIBUTES {
  1912.   PSID  Sid; 
  1913.   DWORD Attributes; 
  1914. } SID_AND_ATTRIBUTES ; 
  1915.  
  1916. /* security entities */
  1917. #define SECURITY_NULL_RID (0x00000000L)
  1918. #define SECURITY_WORLD_RID (0x00000000L)
  1919. #define SECURITY_LOCAL_RID (0X00000000L)
  1920. #define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0}
  1921. /* S-1-1 */
  1922. #define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1}
  1923. /* S-1-2 */
  1924. #define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2}
  1925. /* S-1-3 */
  1926. #define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3}
  1927. #define SECURITY_CREATOR_OWNER_RID (0x00000000L) 
  1928. #define SECURITY_CREATOR_GROUP_RID (0x00000001L)
  1929. #define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
  1930. #define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
  1931. /* S-1-4 */
  1932. #define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4}
  1933. /* S-1-5 */
  1934. #define SECURITY_NT_AUTHORITY {0,0,0,0,0,5} 
  1935. #define SECURITY_DIALUP_RID                     0x00000001L
  1936. #define SECURITY_NETWORK_RID                    0x00000002L
  1937. #define SECURITY_BATCH_RID                      0x00000003L
  1938. #define SECURITY_INTERACTIVE_RID                0x00000004L
  1939. #define SECURITY_LOGON_IDS_RID                  0x00000005L
  1940. #define SECURITY_SERVICE_RID                    0x00000006L
  1941. #define SECURITY_ANONYMOUS_LOGON_RID            0x00000007L
  1942. #define SECURITY_PROXY_RID                      0x00000008L
  1943. #define SECURITY_ENTERPRISE_CONTROLLERS_RID     0x00000009L
  1944. #define SECURITY_PRINCIPAL_SELF_RID             0x0000000AL
  1945. #define SECURITY_AUTHENTICATED_USER_RID         0x0000000BL
  1946. #define SECURITY_RESTRICTED_CODE_RID            0x0000000CL
  1947. #define SECURITY_TERMINAL_SERVER_RID            0x0000000DL
  1948. #define SECURITY_LOCAL_SYSTEM_RID               0x00000012L
  1949. #define SECURITY_NT_NON_UNIQUE                  0x00000015L
  1950. #define SECURITY_BUILTIN_DOMAIN_RID             0x00000020L
  1951. #define DOMAIN_GROUP_RID_ADMINS                 0x00000200L
  1952. #define DOMAIN_GROUP_RID_USERS                  0x00000201L
  1953. #define DOMAIN_GROUP_RID_GUESTS                 0x00000202L
  1954. #define DOMAIN_ALIAS_RID_ADMINS                 0x00000220L
  1955. #define DOMAIN_ALIAS_RID_USERS                  0x00000221L
  1956. #define DOMAIN_ALIAS_RID_GUESTS                 0x00000222L
  1957. #define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID
  1958. #define SECURITY_LOGON_IDS_RID_COUNT (3L)
  1959. /*
  1960.  * TOKEN_USER
  1961.  */
  1962. typedef struct _TOKEN_USER {
  1963.   SID_AND_ATTRIBUTES User; 
  1964. } TOKEN_USER; 
  1965. /*
  1966.  * TOKEN_GROUPS
  1967.  */
  1968. typedef struct _TOKEN_GROUPS  {
  1969.   DWORD GroupCount; 
  1970.   SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; 
  1971. } TOKEN_GROUPS; 
  1972. /*
  1973.  * LUID_AND_ATTRIBUTES
  1974.  */
  1975. typedef union _LARGE_INTEGER {
  1976.     struct {
  1977.         DWORD    LowPart;
  1978.         LONG     HighPart;
  1979.     } DUMMYSTRUCTNAME;
  1980.     LONGLONG QuadPart;
  1981. } LARGE_INTEGER, *LPLARGE_INTEGER, *PLARGE_INTEGER;
  1982. typedef union _ULARGE_INTEGER {
  1983.     struct {
  1984.         DWORD    LowPart;
  1985.         LONG     HighPart;
  1986.     } DUMMYSTRUCTNAME;
  1987.     LONGLONG QuadPart;
  1988. } ULARGE_INTEGER, *LPULARGE_INTEGER, *PULARGE_INTEGER;
  1989. /*
  1990.  * Locally Unique Identifier
  1991.  */
  1992. typedef LARGE_INTEGER LUID,*PLUID;
  1993. typedef struct _LUID_AND_ATTRIBUTES {
  1994.   LUID   Luid; 
  1995.   DWORD  Attributes; 
  1996. } LUID_AND_ATTRIBUTES; 
  1997. /*
  1998.  * PRIVILEGE_SET
  1999.  */
  2000. typedef struct _PRIVILEGE_SET {
  2001.     DWORD PrivilegeCount;
  2002.     DWORD Control;
  2003.     LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
  2004. } PRIVILEGE_SET, *PPRIVILEGE_SET;
  2005. /*
  2006.  * TOKEN_PRIVILEGES
  2007.  */
  2008. typedef struct _TOKEN_PRIVILEGES {
  2009.   DWORD PrivilegeCount; 
  2010.   LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 
  2011. } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 
  2012. /*
  2013.  * TOKEN_OWNER
  2014.  */
  2015. typedef struct _TOKEN_OWNER {
  2016.   PSID Owner; 
  2017. } TOKEN_OWNER; 
  2018. /*
  2019.  * TOKEN_PRIMARY_GROUP
  2020.  */
  2021. typedef struct _TOKEN_PRIMARY_GROUP {
  2022.   PSID PrimaryGroup; 
  2023. } TOKEN_PRIMARY_GROUP; 
  2024. /*
  2025.  * TOKEN_DEFAULT_DACL
  2026.  */
  2027. typedef struct _TOKEN_DEFAULT_DACL { 
  2028.   PACL DefaultDacl; 
  2029. } TOKEN_DEFAULT_DACL; 
  2030. /*
  2031.  * TOKEN_SOURCEL
  2032.  */
  2033. typedef struct _TOKEN_SOURCE {
  2034.   char Sourcename[8]; 
  2035.   LUID SourceIdentifier; 
  2036. } TOKEN_SOURCE; 
  2037. /*
  2038.  * TOKEN_TYPE
  2039.  */
  2040. typedef enum tagTOKEN_TYPE {
  2041.   TokenPrimary = 1, 
  2042.   TokenImpersonation 
  2043. } TOKEN_TYPE; 
  2044. /*
  2045.  * SECURITY_IMPERSONATION_LEVEL
  2046.  */
  2047. typedef enum _SECURITY_IMPERSONATION_LEVEL {
  2048.   SecurityAnonymous, 
  2049.   SecurityIdentification, 
  2050.   SecurityImpersonation, 
  2051.   SecurityDelegation 
  2052. } SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL; 
  2053. typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
  2054. * PSECURITY_CONTEXT_TRACKING_MODE;
  2055. /*
  2056.  * Quality of Service
  2057.  */
  2058. typedef struct _SECURITY_QUALITY_OF_SERVICE {
  2059.   DWORD Length;
  2060.   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
  2061.   SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
  2062.   WIN_BOOL EffectiveOnly;
  2063. } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
  2064. /*
  2065.  * TOKEN_STATISTICS
  2066.  */
  2067. typedef struct _TOKEN_STATISTICS {
  2068.   LUID  TokenId; 
  2069.   LUID  AuthenticationId; 
  2070.   LARGE_INTEGER ExpirationTime; 
  2071.   TOKEN_TYPE    TokenType; 
  2072.   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; 
  2073.   DWORD DynamicCharged; 
  2074.   DWORD DynamicAvailable; 
  2075.   DWORD GroupCount; 
  2076.   DWORD PrivilegeCount; 
  2077.   LUID  ModifiedId; 
  2078. } TOKEN_STATISTICS; 
  2079. /* 
  2080.  * ACLs of NT 
  2081.  */
  2082. #define ACL_REVISION 2
  2083. #define ACL_REVISION1 1
  2084. #define ACL_REVISION2 2
  2085. /* ACEs, directly starting after an ACL */
  2086. typedef struct _ACE_HEADER {
  2087. BYTE AceType;
  2088. BYTE AceFlags;
  2089. WORD AceSize;
  2090. } ACE_HEADER,*PACE_HEADER;
  2091. /* AceType */
  2092. #define ACCESS_ALLOWED_ACE_TYPE 0
  2093. #define ACCESS_DENIED_ACE_TYPE 1
  2094. #define SYSTEM_AUDIT_ACE_TYPE 2
  2095. #define SYSTEM_ALARM_ACE_TYPE 3
  2096. /* inherit AceFlags */
  2097. #define OBJECT_INHERIT_ACE 0x01
  2098. #define CONTAINER_INHERIT_ACE 0x02
  2099. #define NO_PROPAGATE_INHERIT_ACE 0x04
  2100. #define INHERIT_ONLY_ACE 0x08
  2101. #define VALID_INHERIT_FLAGS 0x0F
  2102. /* AceFlags mask for what events we (should) audit */
  2103. #define SUCCESSFUL_ACCESS_ACE_FLAG 0x40
  2104. #define FAILED_ACCESS_ACE_FLAG 0x80
  2105. /* different ACEs depending on AceType 
  2106.  * SidStart marks the begin of a SID
  2107.  * so the thing finally looks like this:
  2108.  * 0: ACE_HEADER
  2109.  * 4: ACCESS_MASK
  2110.  * 8... : SID
  2111.  */
  2112. typedef struct _ACCESS_ALLOWED_ACE {
  2113. ACE_HEADER Header;
  2114. DWORD Mask;
  2115. DWORD SidStart;
  2116. } ACCESS_ALLOWED_ACE,*PACCESS_ALLOWED_ACE;
  2117. typedef struct _ACCESS_DENIED_ACE {
  2118. ACE_HEADER Header;
  2119. DWORD Mask;
  2120. DWORD SidStart;
  2121. } ACCESS_DENIED_ACE,*PACCESS_DENIED_ACE;
  2122. typedef struct _SYSTEM_AUDIT_ACE {
  2123. ACE_HEADER Header;
  2124. DWORD Mask;
  2125. DWORD SidStart;
  2126. } SYSTEM_AUDIT_ACE,*PSYSTEM_AUDIT_ACE;
  2127. typedef struct _SYSTEM_ALARM_ACE {
  2128. ACE_HEADER Header;
  2129. DWORD Mask;
  2130. DWORD SidStart;
  2131. } SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;
  2132. typedef enum tagSID_NAME_USE {
  2133. SidTypeUser = 1,
  2134. SidTypeGroup,
  2135. SidTypeDomain,
  2136. SidTypeAlias,
  2137. SidTypeWellKnownGroup,
  2138. SidTypeDeletedAccount,
  2139. SidTypeInvalid,
  2140. SidTypeUnknown
  2141. } SID_NAME_USE,*PSID_NAME_USE;
  2142. /* Access rights */
  2143. #define DELETE                     0x00010000
  2144. #define READ_CONTROL               0x00020000
  2145. #define WRITE_DAC                  0x00040000
  2146. #define WRITE_OWNER                0x00080000
  2147. #define SYNCHRONIZE                0x00100000
  2148. #define STANDARD_RIGHTS_REQUIRED   0x000f0000
  2149. #define STANDARD_RIGHTS_READ       READ_CONTROL
  2150. #define STANDARD_RIGHTS_WRITE      READ_CONTROL
  2151. #define STANDARD_RIGHTS_EXECUTE    READ_CONTROL
  2152. #define STANDARD_RIGHTS_ALL        0x001f0000
  2153. #define SPECIFIC_RIGHTS_ALL        0x0000ffff
  2154. #define GENERIC_READ               0x80000000
  2155. #define GENERIC_WRITE              0x40000000
  2156. #define GENERIC_EXECUTE            0x20000000
  2157. #define GENERIC_ALL                0x10000000
  2158. #define MAXIMUM_ALLOWED            0x02000000
  2159. #define ACCESS_SYSTEM_SECURITY     0x01000000
  2160. #define EVENT_MODIFY_STATE         0x0002
  2161. #define EVENT_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
  2162. #define SEMAPHORE_MODIFY_STATE     0x0002
  2163. #define SEMAPHORE_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
  2164. #define MUTEX_MODIFY_STATE         0x0001
  2165. #define MUTEX_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1)
  2166. #define PROCESS_TERMINATE          0x0001
  2167. #define PROCESS_CREATE_THREAD      0x0002
  2168. #define PROCESS_VM_OPERATION       0x0008
  2169. #define PROCESS_VM_READ            0x0010
  2170. #define PROCESS_VM_WRITE           0x0020
  2171. #define PROCESS_DUP_HANDLE         0x0040
  2172. #define PROCESS_CREATE_PROCESS     0x0080
  2173. #define PROCESS_SET_QUOTA          0x0100
  2174. #define PROCESS_SET_INFORMATION    0x0200
  2175. #define PROCESS_QUERY_INFORMATION  0x0400
  2176. #define PROCESS_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xfff)
  2177. #define THREAD_TERMINATE           0x0001
  2178. #define THREAD_SUSPEND_RESUME      0x0002
  2179. #define THREAD_GET_CONTEXT         0x0008
  2180. #define THREAD_SET_CONTEXT         0x0010
  2181. #define THREAD_SET_INFORMATION     0x0020
  2182. #define THREAD_QUERY_INFORMATION   0x0040
  2183. #define THREAD_SET_THREAD_TOKEN    0x0080
  2184. #define THREAD_IMPERSONATE         0x0100
  2185. #define THREAD_DIRECT_IMPERSONATION 0x0200
  2186. #define THREAD_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3ff)
  2187. #define THREAD_BASE_PRIORITY_LOWRT  15 
  2188. #define THREAD_BASE_PRIORITY_MAX    2 
  2189. #define THREAD_BASE_PRIORITY_MIN   -2
  2190. #define THREAD_BASE_PRIORITY_IDLE  -15
  2191. #define FILE_READ_DATA            0x0001    /* file & pipe */
  2192. #define FILE_LIST_DIRECTORY       0x0001    /* directory */
  2193. #define FILE_WRITE_DATA           0x0002    /* file & pipe */
  2194. #define FILE_ADD_FILE             0x0002    /* directory */
  2195. #define FILE_APPEND_DATA          0x0004    /* file */
  2196. #define FILE_ADD_SUBDIRECTORY     0x0004    /* directory */
  2197. #define FILE_CREATE_PIPE_INSTANCE 0x0004    /* named pipe */
  2198. #define FILE_READ_EA              0x0008    /* file & directory */
  2199. #define FILE_READ_PROPERTIES      FILE_READ_EA
  2200. #define FILE_WRITE_EA             0x0010    /* file & directory */
  2201. #define FILE_WRITE_PROPERTIES     FILE_WRITE_EA
  2202. #define FILE_EXECUTE              0x0020    /* file */
  2203. #define FILE_TRAVERSE             0x0020    /* directory */
  2204. #define FILE_DELETE_CHILD         0x0040    /* directory */
  2205. #define FILE_READ_ATTRIBUTES      0x0080    /* all */
  2206. #define FILE_WRITE_ATTRIBUTES     0x0100    /* all */
  2207. #define FILE_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1ff)
  2208. #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ | FILE_READ_DATA | 
  2209.                                    FILE_READ_ATTRIBUTES | FILE_READ_EA | 
  2210.                                    SYNCHRONIZE)
  2211. #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | 
  2212.                                    FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | 
  2213.                                    FILE_APPEND_DATA | SYNCHRONIZE)
  2214. #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE | FILE_EXECUTE | 
  2215.                                    FILE_READ_ATTRIBUTES | SYNCHRONIZE)
  2216. /* File attribute flags
  2217.  */
  2218. #define FILE_SHARE_READ 0x00000001L
  2219. #define FILE_SHARE_WRITE 0x00000002L
  2220. #define FILE_SHARE_DELETE 0x00000004L
  2221. #define FILE_ATTRIBUTE_READONLY         0x00000001L
  2222. #define FILE_ATTRIBUTE_HIDDEN           0x00000002L
  2223. #define FILE_ATTRIBUTE_SYSTEM           0x00000004L
  2224. #define FILE_ATTRIBUTE_LABEL            0x00000008L  /* Not in Windows API */
  2225. #define FILE_ATTRIBUTE_DIRECTORY        0x00000010L
  2226. #define FILE_ATTRIBUTE_ARCHIVE          0x00000020L
  2227. #define FILE_ATTRIBUTE_NORMAL           0x00000080L
  2228. #define FILE_ATTRIBUTE_TEMPORARY        0x00000100L
  2229. #define FILE_ATTRIBUTE_ATOMIC_WRITE     0x00000200L
  2230. #define FILE_ATTRIBUTE_XACTION_WRITE    0x00000400L
  2231. #define FILE_ATTRIBUTE_COMPRESSED       0x00000800L
  2232. #define FILE_ATTRIBUTE_OFFLINE 0x00001000L
  2233. /* File alignments (NT) */
  2234. #define FILE_BYTE_ALIGNMENT 0x00000000
  2235. #define FILE_WORD_ALIGNMENT 0x00000001
  2236. #define FILE_LONG_ALIGNMENT 0x00000003
  2237. #define FILE_QUAD_ALIGNMENT 0x00000007
  2238. #define FILE_OCTA_ALIGNMENT 0x0000000f
  2239. #define FILE_32_BYTE_ALIGNMENT 0x0000001f
  2240. #define FILE_64_BYTE_ALIGNMENT 0x0000003f
  2241. #define FILE_128_BYTE_ALIGNMENT 0x0000007f
  2242. #define FILE_256_BYTE_ALIGNMENT 0x000000ff
  2243. #define FILE_512_BYTE_ALIGNMENT 0x000001ff
  2244. #define REG_NONE 0 /* no type */
  2245. #define REG_SZ 1 /* string type (ASCII) */
  2246. #define REG_EXPAND_SZ 2 /* string, includes %ENVVAR% (expanded by caller) (ASCII) */
  2247. #define REG_BINARY 3 /* binary format, callerspecific */
  2248. /* YES, REG_DWORD == REG_DWORD_LITTLE_ENDIAN */
  2249. #define REG_DWORD 4 /* DWORD in little endian format */
  2250. #define REG_DWORD_LITTLE_ENDIAN 4 /* DWORD in little endian format */
  2251. #define REG_DWORD_BIG_ENDIAN 5 /* DWORD in big endian format  */
  2252. #define REG_LINK 6 /* symbolic link (UNICODE) */
  2253. #define REG_MULTI_SZ 7 /* multiple strings, delimited by , terminated by  (ASCII) */
  2254. #define REG_RESOURCE_LIST 8 /* resource list? huh? */
  2255. #define REG_FULL_RESOURCE_DESCRIPTOR 9 /* full resource descriptor? huh? */
  2256. #define REG_RESOURCE_REQUIREMENTS_LIST 10
  2257. /* ----------------------------- begin registry ----------------------------- */
  2258. /* Registry security values */
  2259. #define OWNER_SECURITY_INFORMATION 0x00000001
  2260. #define GROUP_SECURITY_INFORMATION 0x00000002
  2261. #define DACL_SECURITY_INFORMATION 0x00000004
  2262. #define SACL_SECURITY_INFORMATION 0x00000008
  2263. #define REG_OPTION_RESERVED 0x00000000
  2264. #define REG_OPTION_NON_VOLATILE 0x00000000
  2265. #define REG_OPTION_VOLATILE 0x00000001
  2266. #define REG_OPTION_CREATE_LINK 0x00000002
  2267. #define REG_OPTION_BACKUP_RESTORE 0x00000004 /* FIXME */
  2268. #define REG_OPTION_OPEN_LINK 0x00000008
  2269. #define REG_LEGAL_OPTION        (REG_OPTION_RESERVED|  
  2270. REG_OPTION_NON_VOLATILE|  
  2271. REG_OPTION_VOLATILE|  
  2272. REG_OPTION_CREATE_LINK|  
  2273. REG_OPTION_BACKUP_RESTORE|  
  2274. REG_OPTION_OPEN_LINK)
  2275. #define REG_CREATED_NEW_KEY 0x00000001
  2276. #define REG_OPENED_EXISTING_KEY 0x00000002
  2277. /* For RegNotifyChangeKeyValue */
  2278. #define REG_NOTIFY_CHANGE_NAME 0x1
  2279. #define KEY_QUERY_VALUE 0x00000001
  2280. #define KEY_SET_VALUE 0x00000002
  2281. #define KEY_CREATE_SUB_KEY 0x00000004
  2282. #define KEY_ENUMERATE_SUB_KEYS 0x00000008
  2283. #define KEY_NOTIFY 0x00000010
  2284. #define KEY_CREATE_LINK 0x00000020
  2285. #define KEY_READ       ((STANDARD_RIGHTS_READ|  
  2286. KEY_QUERY_VALUE|  
  2287. KEY_ENUMERATE_SUB_KEYS|  
  2288. KEY_NOTIFY)  
  2289. & (~SYNCHRONIZE)  
  2290.       )
  2291. #define KEY_WRITE       ((STANDARD_RIGHTS_WRITE|  
  2292. KEY_SET_VALUE|  
  2293. KEY_CREATE_SUB_KEY)  
  2294. & (~SYNCHRONIZE)  
  2295.       )
  2296. #define KEY_EXECUTE       ((KEY_READ)  
  2297. & (~SYNCHRONIZE))  
  2298.       )
  2299. #define KEY_ALL_ACCESS        ((STANDARD_RIGHTS_ALL|  
  2300. KEY_QUERY_VALUE|  
  2301. KEY_SET_VALUE|  
  2302. KEY_CREATE_SUB_KEY|  
  2303. KEY_ENUMERATE_SUB_KEYS|  
  2304. KEY_NOTIFY|  
  2305. KEY_CREATE_LINK)  
  2306. & (~SYNCHRONIZE)  
  2307.       )
  2308. /* ------------------------------ end registry ------------------------------ */
  2309. #define RtlEqualMemory(Destination, Source, Length) (!memcmp((Destination),(Source),(Length)))
  2310. #define RtlMoveMemory(Destination, Source, Length) memmove((Destination),(Source),(Length))
  2311. #define RtlCopyMemory(Destination, Source, Length) memcpy((Destination),(Source),(Length))
  2312. #define RtlFillMemory(Destination, Length, Fill) memset((Destination),(Fill),(Length))
  2313. #define RtlZeroMemory(Destination, Length) memset((Destination),0,(Length))
  2314. #include "poppack.h"
  2315. #endif  /* __WINE_WINNT_H */