WinNT.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:293k
源码类别:

模拟服务器

开发平台:

C/C++

  1.     DWORD  e32_datapage;                // Offset of Enumerated Data Pages
  2.     DWORD  e32_preload;                 // Number of preload pages
  3.     DWORD  e32_nrestab;                 // Offset of Non-resident Names Table
  4.     DWORD  e32_cbnrestab;               // Size of Non-resident Name Table
  5.     DWORD  e32_nressum;                 // Non-resident Name Table Checksum
  6.     DWORD  e32_autodata;                // Object # for automatic data object
  7.     DWORD  e32_debuginfo;               // Offset of the debugging information
  8.     DWORD  e32_debuglen;                // The length of the debugging info. in bytes
  9.     DWORD  e32_instpreload;             // Number of instance pages in preload section of VXD file
  10.     DWORD  e32_instdemand;              // Number of instance pages in demand load section of VXD file
  11.     DWORD  e32_heapsize;                // Size of heap - for 16-bit apps
  12.     BYTE   e32_res3[12];                // Reserved words
  13.     DWORD  e32_winresoff;
  14.     DWORD  e32_winreslen;
  15.     WORD   e32_devid;                   // Device ID for VxD
  16.     WORD   e32_ddkver;                  // DDK version for VxD
  17.   } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
  18. #ifndef _MAC
  19. #include "poppack.h"                    // Back to 4 byte packing
  20. #endif
  21. //
  22. // File header format.
  23. //
  24. typedef struct _IMAGE_FILE_HEADER {
  25.     WORD    Machine;
  26.     WORD    NumberOfSections;
  27.     DWORD   TimeDateStamp;
  28.     DWORD   PointerToSymbolTable;
  29.     DWORD   NumberOfSymbols;
  30.     WORD    SizeOfOptionalHeader;
  31.     WORD    Characteristics;
  32. } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
  33. #define IMAGE_SIZEOF_FILE_HEADER             20
  34. #define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
  35. #define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references).
  36. #define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
  37. #define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
  38. #define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set
  39. #define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses
  40. #define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
  41. #define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
  42. #define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
  43. #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file.
  44. #define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // If Image is on Net, copy and run from the swap file.
  45. #define IMAGE_FILE_SYSTEM                    0x1000  // System File.
  46. #define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
  47. #define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // File should only be run on a UP machine
  48. #define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
  49. #define IMAGE_FILE_MACHINE_UNKNOWN           0
  50. #define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
  51. #define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
  52. #define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
  53. #define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
  54. #define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2
  55. #define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP
  56. #define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian
  57. #define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
  58. #define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
  59. #define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
  60. #define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5
  61. #define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
  62. #define IMAGE_FILE_MACHINE_THUMB             0x01c2
  63. #define IMAGE_FILE_MACHINE_AM33              0x01d3
  64. #define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
  65. #define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
  66. #define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
  67. #define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
  68. #define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
  69. #define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
  70. #define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
  71. #define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
  72. #define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon
  73. #define IMAGE_FILE_MACHINE_CEF               0x0CEF
  74. #define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code
  75. #define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
  76. #define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
  77. #define IMAGE_FILE_MACHINE_CEE               0xC0EE
  78. //
  79. // Directory format.
  80. //
  81. typedef struct _IMAGE_DATA_DIRECTORY {
  82.     DWORD   VirtualAddress;
  83.     DWORD   Size;
  84. } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
  85. #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
  86. //
  87. // Optional header format.
  88. //
  89. typedef struct _IMAGE_OPTIONAL_HEADER {
  90.     //
  91.     // Standard fields.
  92.     //
  93.     WORD    Magic;
  94.     BYTE    MajorLinkerVersion;
  95.     BYTE    MinorLinkerVersion;
  96.     DWORD   SizeOfCode;
  97.     DWORD   SizeOfInitializedData;
  98.     DWORD   SizeOfUninitializedData;
  99.     DWORD   AddressOfEntryPoint;
  100.     DWORD   BaseOfCode;
  101.     DWORD   BaseOfData;
  102.     //
  103.     // NT additional fields.
  104.     //
  105.     DWORD   ImageBase;
  106.     DWORD   SectionAlignment;
  107.     DWORD   FileAlignment;
  108.     WORD    MajorOperatingSystemVersion;
  109.     WORD    MinorOperatingSystemVersion;
  110.     WORD    MajorImageVersion;
  111.     WORD    MinorImageVersion;
  112.     WORD    MajorSubsystemVersion;
  113.     WORD    MinorSubsystemVersion;
  114.     DWORD   Win32VersionValue;
  115.     DWORD   SizeOfImage;
  116.     DWORD   SizeOfHeaders;
  117.     DWORD   CheckSum;
  118.     WORD    Subsystem;
  119.     WORD    DllCharacteristics;
  120.     DWORD   SizeOfStackReserve;
  121.     DWORD   SizeOfStackCommit;
  122.     DWORD   SizeOfHeapReserve;
  123.     DWORD   SizeOfHeapCommit;
  124.     DWORD   LoaderFlags;
  125.     DWORD   NumberOfRvaAndSizes;
  126.     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  127. } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
  128. typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
  129.     WORD   Magic;
  130.     BYTE   MajorLinkerVersion;
  131.     BYTE   MinorLinkerVersion;
  132.     DWORD  SizeOfCode;
  133.     DWORD  SizeOfInitializedData;
  134.     DWORD  SizeOfUninitializedData;
  135.     DWORD  AddressOfEntryPoint;
  136.     DWORD  BaseOfCode;
  137.     DWORD  BaseOfData;
  138.     DWORD  BaseOfBss;
  139.     DWORD  GprMask;
  140.     DWORD  CprMask[4];
  141.     DWORD  GpValue;
  142. } IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
  143. typedef struct _IMAGE_OPTIONAL_HEADER64 {
  144.     WORD        Magic;
  145.     BYTE        MajorLinkerVersion;
  146.     BYTE        MinorLinkerVersion;
  147.     DWORD       SizeOfCode;
  148.     DWORD       SizeOfInitializedData;
  149.     DWORD       SizeOfUninitializedData;
  150.     DWORD       AddressOfEntryPoint;
  151.     DWORD       BaseOfCode;
  152.     ULONGLONG   ImageBase;
  153.     DWORD       SectionAlignment;
  154.     DWORD       FileAlignment;
  155.     WORD        MajorOperatingSystemVersion;
  156.     WORD        MinorOperatingSystemVersion;
  157.     WORD        MajorImageVersion;
  158.     WORD        MinorImageVersion;
  159.     WORD        MajorSubsystemVersion;
  160.     WORD        MinorSubsystemVersion;
  161.     DWORD       Win32VersionValue;
  162.     DWORD       SizeOfImage;
  163.     DWORD       SizeOfHeaders;
  164.     DWORD       CheckSum;
  165.     WORD        Subsystem;
  166.     WORD        DllCharacteristics;
  167.     ULONGLONG   SizeOfStackReserve;
  168.     ULONGLONG   SizeOfStackCommit;
  169.     ULONGLONG   SizeOfHeapReserve;
  170.     ULONGLONG   SizeOfHeapCommit;
  171.     DWORD       LoaderFlags;
  172.     DWORD       NumberOfRvaAndSizes;
  173.     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  174. } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
  175. #define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER      56
  176. #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER      28
  177. #define IMAGE_SIZEOF_NT_OPTIONAL32_HEADER    224
  178. #define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER    240
  179. #define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10b
  180. #define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
  181. #define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
  182. #ifdef _WIN64
  183. typedef IMAGE_OPTIONAL_HEADER64             IMAGE_OPTIONAL_HEADER;
  184. typedef PIMAGE_OPTIONAL_HEADER64            PIMAGE_OPTIONAL_HEADER;
  185. #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER     IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
  186. #define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR64_MAGIC
  187. #else
  188. typedef IMAGE_OPTIONAL_HEADER32             IMAGE_OPTIONAL_HEADER;
  189. typedef PIMAGE_OPTIONAL_HEADER32            PIMAGE_OPTIONAL_HEADER;
  190. #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER     IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
  191. #define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR32_MAGIC
  192. #endif
  193. typedef struct _IMAGE_NT_HEADERS64 {
  194.     DWORD Signature;
  195.     IMAGE_FILE_HEADER FileHeader;
  196.     IMAGE_OPTIONAL_HEADER64 OptionalHeader;
  197. } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
  198. typedef struct _IMAGE_NT_HEADERS {
  199.     DWORD Signature;
  200.     IMAGE_FILE_HEADER FileHeader;
  201.     IMAGE_OPTIONAL_HEADER32 OptionalHeader;
  202. } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
  203. typedef struct _IMAGE_ROM_HEADERS {
  204.     IMAGE_FILE_HEADER FileHeader;
  205.     IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
  206. } IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
  207. #ifdef _WIN64
  208. typedef IMAGE_NT_HEADERS64                  IMAGE_NT_HEADERS;
  209. typedef PIMAGE_NT_HEADERS64                 PIMAGE_NT_HEADERS;
  210. #else
  211. typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
  212. typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;
  213. #endif
  214. // IMAGE_FIRST_SECTION doesn't need 32/64 versions since the file header is the same either way.
  215. #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)        
  216.     ((ULONG_PTR)ntheader +                                              
  217.      FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +                 
  218.      ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader   
  219.     ))
  220. // Subsystem Values
  221. #define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.
  222. #define IMAGE_SUBSYSTEM_NATIVE               1   // Image doesn't require a subsystem.
  223. #define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Image runs in the Windows GUI subsystem.
  224. #define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Image runs in the Windows character subsystem.
  225. #define IMAGE_SUBSYSTEM_OS2_CUI              5   // image runs in the OS/2 character subsystem.
  226. #define IMAGE_SUBSYSTEM_POSIX_CUI            7   // image runs in the Posix character subsystem.
  227. #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // image is a native Win9x driver.
  228. #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Image runs in the Windows CE subsystem.
  229. #define IMAGE_SUBSYSTEM_EFI_APPLICATION      10  //
  230. #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER  11   //
  231. #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER   12  //
  232. #define IMAGE_SUBSYSTEM_EFI_ROM              13
  233. #define IMAGE_SUBSYSTEM_XBOX                 14
  234. // DllCharacteristics Entries
  235. //      IMAGE_LIBRARY_PROCESS_INIT           0x0001     // Reserved.
  236. //      IMAGE_LIBRARY_PROCESS_TERM           0x0002     // Reserved.
  237. //      IMAGE_LIBRARY_THREAD_INIT            0x0004     // Reserved.
  238. //      IMAGE_LIBRARY_THREAD_TERM            0x0008     // Reserved.
  239. #define IMAGE_DLLCHARACTERISTICS_NO_BIND     0x0800     // Do not bind this image.
  240. //                                           0x1000     // Reserved.
  241. #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER  0x2000     // Driver uses WDM model
  242. //                                           0x4000     // Reserved.
  243. #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE     0x8000
  244. // Directory Entries
  245. #define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory
  246. #define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory
  247. #define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory
  248. #define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory
  249. #define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory
  250. #define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table
  251. #define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory
  252. //      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)
  253. #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
  254. #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP
  255. #define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory
  256. #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory
  257. #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers
  258. #define IMAGE_DIRECTORY_ENTRY_IAT            12   // Import Address Table
  259. #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
  260. #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor
  261. //
  262. // Non-COFF Object file header
  263. //
  264. typedef struct ANON_OBJECT_HEADER {
  265.     WORD    Sig1;            // Must be IMAGE_FILE_MACHINE_UNKNOWN
  266.     WORD    Sig2;            // Must be 0xffff
  267.     WORD    Version;         // >= 1 (implies the CLSID field is present)
  268.     WORD    Machine;
  269.     DWORD   TimeDateStamp;
  270.     CLSID   ClassID;         // Used to invoke CoCreateInstance
  271.     DWORD   SizeOfData;      // Size of data that follows the header
  272. } ANON_OBJECT_HEADER;
  273. //
  274. // Section header format.
  275. //
  276. #define IMAGE_SIZEOF_SHORT_NAME              8
  277. typedef struct _IMAGE_SECTION_HEADER {
  278.     BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
  279.     union {
  280.             DWORD   PhysicalAddress;
  281.             DWORD   VirtualSize;
  282.     } Misc;
  283.     DWORD   VirtualAddress;
  284.     DWORD   SizeOfRawData;
  285.     DWORD   PointerToRawData;
  286.     DWORD   PointerToRelocations;
  287.     DWORD   PointerToLinenumbers;
  288.     WORD    NumberOfRelocations;
  289.     WORD    NumberOfLinenumbers;
  290.     DWORD   Characteristics;
  291. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
  292. #define IMAGE_SIZEOF_SECTION_HEADER          40
  293. //
  294. // Section characteristics.
  295. //
  296. //      IMAGE_SCN_TYPE_REG                   0x00000000  // Reserved.
  297. //      IMAGE_SCN_TYPE_DSECT                 0x00000001  // Reserved.
  298. //      IMAGE_SCN_TYPE_NOLOAD                0x00000002  // Reserved.
  299. //      IMAGE_SCN_TYPE_GROUP                 0x00000004  // Reserved.
  300. #define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
  301. //      IMAGE_SCN_TYPE_COPY                  0x00000010  // Reserved.
  302. #define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
  303. #define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
  304. #define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.
  305. #define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
  306. #define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
  307. //      IMAGE_SCN_TYPE_OVER                  0x00000400  // Reserved.
  308. #define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
  309. #define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
  310. //                                           0x00002000  // Reserved.
  311. //      IMAGE_SCN_MEM_PROTECTED - Obsolete   0x00004000
  312. #define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000  // Reset speculative exceptions handling bits in the TLB entries for this section.
  313. #define IMAGE_SCN_GPREL                      0x00008000  // Section content can be accessed relative to GP
  314. #define IMAGE_SCN_MEM_FARDATA                0x00008000
  315. //      IMAGE_SCN_MEM_SYSHEAP  - Obsolete    0x00010000
  316. #define IMAGE_SCN_MEM_PURGEABLE              0x00020000
  317. #define IMAGE_SCN_MEM_16BIT                  0x00020000
  318. #define IMAGE_SCN_MEM_LOCKED                 0x00040000
  319. #define IMAGE_SCN_MEM_PRELOAD                0x00080000
  320. #define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
  321. #define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
  322. #define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
  323. #define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
  324. #define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
  325. #define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
  326. #define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
  327. #define IMAGE_SCN_ALIGN_128BYTES             0x00800000  //
  328. #define IMAGE_SCN_ALIGN_256BYTES             0x00900000  //
  329. #define IMAGE_SCN_ALIGN_512BYTES             0x00A00000  //
  330. #define IMAGE_SCN_ALIGN_1024BYTES            0x00B00000  //
  331. #define IMAGE_SCN_ALIGN_2048BYTES            0x00C00000  //
  332. #define IMAGE_SCN_ALIGN_4096BYTES            0x00D00000  //
  333. #define IMAGE_SCN_ALIGN_8192BYTES            0x00E00000  //
  334. // Unused                                    0x00F00000
  335. #define IMAGE_SCN_ALIGN_MASK                 0x00F00000
  336. #define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  // Section contains extended relocations.
  337. #define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
  338. #define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
  339. #define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
  340. #define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
  341. #define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
  342. #define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
  343. #define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.
  344. //
  345. // TLS Chaacteristic Flags
  346. //
  347. #define IMAGE_SCN_SCALE_INDEX                0x00000001  // Tls index is scaled
  348. #ifndef _MAC
  349. #include "pshpack2.h"                       // Symbols, relocs, and linenumbers are 2 byte packed
  350. #endif
  351. //
  352. // Symbol format.
  353. //
  354. typedef struct _IMAGE_SYMBOL {
  355.     union {
  356.         BYTE    ShortName[8];
  357.         struct {
  358.             DWORD   Short;     // if 0, use LongName
  359.             DWORD   Long;      // offset into string table
  360.         } Name;
  361.         DWORD   LongName[2];    // PBYTE [2]
  362.     } N;
  363.     DWORD   Value;
  364.     SHORT   SectionNumber;
  365.     WORD    Type;
  366.     BYTE    StorageClass;
  367.     BYTE    NumberOfAuxSymbols;
  368. } IMAGE_SYMBOL;
  369. typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;
  370. #define IMAGE_SIZEOF_SYMBOL                  18
  371. //
  372. // Section values.
  373. //
  374. // Symbols have a section number of the section in which they are
  375. // defined. Otherwise, section numbers have the following meanings:
  376. //
  377. #define IMAGE_SYM_UNDEFINED           (SHORT)0          // Symbol is undefined or is common.
  378. #define IMAGE_SYM_ABSOLUTE            (SHORT)-1         // Symbol is an absolute value.
  379. #define IMAGE_SYM_DEBUG               (SHORT)-2         // Symbol is a special debug item.
  380. #define IMAGE_SYM_SECTION_MAX         0xFEFF            // Values 0xFF00-0xFFFF are special
  381. //
  382. // Type (fundamental) values.
  383. //
  384. #define IMAGE_SYM_TYPE_NULL                 0x0000  // no type.
  385. #define IMAGE_SYM_TYPE_VOID                 0x0001  //
  386. #define IMAGE_SYM_TYPE_CHAR                 0x0002  // type character.
  387. #define IMAGE_SYM_TYPE_SHORT                0x0003  // type short integer.
  388. #define IMAGE_SYM_TYPE_INT                  0x0004  //
  389. #define IMAGE_SYM_TYPE_LONG                 0x0005  //
  390. #define IMAGE_SYM_TYPE_FLOAT                0x0006  //
  391. #define IMAGE_SYM_TYPE_DOUBLE               0x0007  //
  392. #define IMAGE_SYM_TYPE_STRUCT               0x0008  //
  393. #define IMAGE_SYM_TYPE_UNION                0x0009  //
  394. #define IMAGE_SYM_TYPE_ENUM                 0x000A  // enumeration.
  395. #define IMAGE_SYM_TYPE_MOE                  0x000B  // member of enumeration.
  396. #define IMAGE_SYM_TYPE_BYTE                 0x000C  //
  397. #define IMAGE_SYM_TYPE_WORD                 0x000D  //
  398. #define IMAGE_SYM_TYPE_UINT                 0x000E  //
  399. #define IMAGE_SYM_TYPE_DWORD                0x000F  //
  400. #define IMAGE_SYM_TYPE_PCODE                0x8000  //
  401. //
  402. // Type (derived) values.
  403. //
  404. #define IMAGE_SYM_DTYPE_NULL                0       // no derived type.
  405. #define IMAGE_SYM_DTYPE_POINTER             1       // pointer.
  406. #define IMAGE_SYM_DTYPE_FUNCTION            2       // function.
  407. #define IMAGE_SYM_DTYPE_ARRAY               3       // array.
  408. //
  409. // Storage classes.
  410. //
  411. #define IMAGE_SYM_CLASS_END_OF_FUNCTION     (BYTE )-1
  412. #define IMAGE_SYM_CLASS_NULL                0x0000
  413. #define IMAGE_SYM_CLASS_AUTOMATIC           0x0001
  414. #define IMAGE_SYM_CLASS_EXTERNAL            0x0002
  415. #define IMAGE_SYM_CLASS_STATIC              0x0003
  416. #define IMAGE_SYM_CLASS_REGISTER            0x0004
  417. #define IMAGE_SYM_CLASS_EXTERNAL_DEF        0x0005
  418. #define IMAGE_SYM_CLASS_LABEL               0x0006
  419. #define IMAGE_SYM_CLASS_UNDEFINED_LABEL     0x0007
  420. #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT    0x0008
  421. #define IMAGE_SYM_CLASS_ARGUMENT            0x0009
  422. #define IMAGE_SYM_CLASS_STRUCT_TAG          0x000A
  423. #define IMAGE_SYM_CLASS_MEMBER_OF_UNION     0x000B
  424. #define IMAGE_SYM_CLASS_UNION_TAG           0x000C
  425. #define IMAGE_SYM_CLASS_TYPE_DEFINITION     0x000D
  426. #define IMAGE_SYM_CLASS_UNDEFINED_STATIC    0x000E
  427. #define IMAGE_SYM_CLASS_ENUM_TAG            0x000F
  428. #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM      0x0010
  429. #define IMAGE_SYM_CLASS_REGISTER_PARAM      0x0011
  430. #define IMAGE_SYM_CLASS_BIT_FIELD           0x0012
  431. #define IMAGE_SYM_CLASS_FAR_EXTERNAL        0x0044  //
  432. #define IMAGE_SYM_CLASS_BLOCK               0x0064
  433. #define IMAGE_SYM_CLASS_FUNCTION            0x0065
  434. #define IMAGE_SYM_CLASS_END_OF_STRUCT       0x0066
  435. #define IMAGE_SYM_CLASS_FILE                0x0067
  436. // new
  437. #define IMAGE_SYM_CLASS_SECTION             0x0068
  438. #define IMAGE_SYM_CLASS_WEAK_EXTERNAL       0x0069
  439. #define IMAGE_SYM_CLASS_CLR_TOKEN           0x006B
  440. // type packing constants
  441. #define N_BTMASK                            0x000F
  442. #define N_TMASK                             0x0030
  443. #define N_TMASK1                            0x00C0
  444. #define N_TMASK2                            0x00F0
  445. #define N_BTSHFT                            4
  446. #define N_TSHIFT                            2
  447. // MACROS
  448. // Basic Type of  x
  449. #define BTYPE(x) ((x) & N_BTMASK)
  450. // Is x a pointer?
  451. #ifndef ISPTR
  452. #define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
  453. #endif
  454. // Is x a function?
  455. #ifndef ISFCN
  456. #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
  457. #endif
  458. // Is x an array?
  459. #ifndef ISARY
  460. #define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))
  461. #endif
  462. // Is x a structure, union, or enumeration TAG?
  463. #ifndef ISTAG
  464. #define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)
  465. #endif
  466. #ifndef INCREF
  467. #define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
  468. #endif
  469. #ifndef DECREF
  470. #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
  471. #endif
  472. //
  473. // Auxiliary entry format.
  474. //
  475. typedef union _IMAGE_AUX_SYMBOL {
  476.     struct {
  477.         DWORD    TagIndex;                      // struct, union, or enum tag index
  478.         union {
  479.             struct {
  480.                 WORD    Linenumber;             // declaration line number
  481.                 WORD    Size;                   // size of struct, union, or enum
  482.             } LnSz;
  483.            DWORD    TotalSize;
  484.         } Misc;
  485.         union {
  486.             struct {                            // if ISFCN, tag, or .bb
  487.                 DWORD    PointerToLinenumber;
  488.                 DWORD    PointerToNextFunction;
  489.             } Function;
  490.             struct {                            // if ISARY, up to 4 dimen.
  491.                 WORD     Dimension[4];
  492.             } Array;
  493.         } FcnAry;
  494.         WORD    TvIndex;                        // tv index
  495.     } Sym;
  496.     struct {
  497.         BYTE    Name[IMAGE_SIZEOF_SYMBOL];
  498.     } File;
  499.     struct {
  500.         DWORD   Length;                         // section length
  501.         WORD    NumberOfRelocations;            // number of relocation entries
  502.         WORD    NumberOfLinenumbers;            // number of line numbers
  503.         DWORD   CheckSum;                       // checksum for communal
  504.         SHORT   Number;                         // section number to associate with
  505.         BYTE    Selection;                      // communal selection type
  506.     } Section;
  507. } IMAGE_AUX_SYMBOL;
  508. typedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL;
  509. #define IMAGE_SIZEOF_AUX_SYMBOL             18
  510. typedef enum IMAGE_AUX_SYMBOL_TYPE {
  511.     IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1,
  512. } IMAGE_AUX_SYMBOL_TYPE;
  513. #include <pshpack2.h>
  514. typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {
  515.     BYTE  bAuxType;                  // IMAGE_AUX_SYMBOL_TYPE
  516.     BYTE  bReserved;                 // Must be 0
  517.     DWORD SymbolTableIndex;
  518.     BYTE  rgbReserved[12];           // Must be 0
  519. } IMAGE_AUX_SYMBOL_TOKEN_DEF;
  520. typedef IMAGE_AUX_SYMBOL_TOKEN_DEF UNALIGNED *PIMAGE_AUX_SYMBOL_TOKEN_DEF;
  521. #include <poppack.h>
  522. //
  523. // Communal selection types.
  524. //
  525. #define IMAGE_COMDAT_SELECT_NODUPLICATES    1
  526. #define IMAGE_COMDAT_SELECT_ANY             2
  527. #define IMAGE_COMDAT_SELECT_SAME_SIZE       3
  528. #define IMAGE_COMDAT_SELECT_EXACT_MATCH     4
  529. #define IMAGE_COMDAT_SELECT_ASSOCIATIVE     5
  530. #define IMAGE_COMDAT_SELECT_LARGEST         6
  531. #define IMAGE_COMDAT_SELECT_NEWEST          7
  532. #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1
  533. #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2
  534. #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3
  535. //
  536. // Relocation format.
  537. //
  538. typedef struct _IMAGE_RELOCATION {
  539.     union {
  540.         DWORD   VirtualAddress;
  541.         DWORD   RelocCount;             // Set to the real count when IMAGE_SCN_LNK_NRELOC_OVFL is set
  542.     };
  543.     DWORD   SymbolTableIndex;
  544.     WORD    Type;
  545. } IMAGE_RELOCATION;
  546. typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;
  547. #define IMAGE_SIZEOF_RELOCATION         10
  548. //
  549. // I386 relocation types.
  550. //
  551. #define IMAGE_REL_I386_ABSOLUTE         0x0000  // Reference is absolute, no relocation is necessary
  552. #define IMAGE_REL_I386_DIR16            0x0001  // Direct 16-bit reference to the symbols virtual address
  553. #define IMAGE_REL_I386_REL16            0x0002  // PC-relative 16-bit reference to the symbols virtual address
  554. #define IMAGE_REL_I386_DIR32            0x0006  // Direct 32-bit reference to the symbols virtual address
  555. #define IMAGE_REL_I386_DIR32NB          0x0007  // Direct 32-bit reference to the symbols virtual address, base not included
  556. #define IMAGE_REL_I386_SEG12            0x0009  // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
  557. #define IMAGE_REL_I386_SECTION          0x000A
  558. #define IMAGE_REL_I386_SECREL           0x000B
  559. #define IMAGE_REL_I386_TOKEN            0x000C  // clr token
  560. #define IMAGE_REL_I386_SECREL7          0x000D  // 7 bit offset from base of section containing target
  561. #define IMAGE_REL_I386_REL32            0x0014  // PC-relative 32-bit reference to the symbols virtual address
  562. //
  563. // MIPS relocation types.
  564. //
  565. #define IMAGE_REL_MIPS_ABSOLUTE         0x0000  // Reference is absolute, no relocation is necessary
  566. #define IMAGE_REL_MIPS_REFHALF          0x0001
  567. #define IMAGE_REL_MIPS_REFWORD          0x0002
  568. #define IMAGE_REL_MIPS_JMPADDR          0x0003
  569. #define IMAGE_REL_MIPS_REFHI            0x0004
  570. #define IMAGE_REL_MIPS_REFLO            0x0005
  571. #define IMAGE_REL_MIPS_GPREL            0x0006
  572. #define IMAGE_REL_MIPS_LITERAL          0x0007
  573. #define IMAGE_REL_MIPS_SECTION          0x000A
  574. #define IMAGE_REL_MIPS_SECREL           0x000B
  575. #define IMAGE_REL_MIPS_SECRELLO         0x000C  // Low 16-bit section relative referemce (used for >32k TLS)
  576. #define IMAGE_REL_MIPS_SECRELHI         0x000D  // High 16-bit section relative reference (used for >32k TLS)
  577. #define IMAGE_REL_MIPS_TOKEN            0x000E  // clr token
  578. #define IMAGE_REL_MIPS_JMPADDR16        0x0010
  579. #define IMAGE_REL_MIPS_REFWORDNB        0x0022
  580. #define IMAGE_REL_MIPS_PAIR             0x0025
  581. //
  582. // Alpha Relocation types.
  583. //
  584. #define IMAGE_REL_ALPHA_ABSOLUTE        0x0000
  585. #define IMAGE_REL_ALPHA_REFLONG         0x0001
  586. #define IMAGE_REL_ALPHA_REFQUAD         0x0002
  587. #define IMAGE_REL_ALPHA_GPREL32         0x0003
  588. #define IMAGE_REL_ALPHA_LITERAL         0x0004
  589. #define IMAGE_REL_ALPHA_LITUSE          0x0005
  590. #define IMAGE_REL_ALPHA_GPDISP          0x0006
  591. #define IMAGE_REL_ALPHA_BRADDR          0x0007
  592. #define IMAGE_REL_ALPHA_HINT            0x0008
  593. #define IMAGE_REL_ALPHA_INLINE_REFLONG  0x0009
  594. #define IMAGE_REL_ALPHA_REFHI           0x000A
  595. #define IMAGE_REL_ALPHA_REFLO           0x000B
  596. #define IMAGE_REL_ALPHA_PAIR            0x000C
  597. #define IMAGE_REL_ALPHA_MATCH           0x000D
  598. #define IMAGE_REL_ALPHA_SECTION         0x000E
  599. #define IMAGE_REL_ALPHA_SECREL          0x000F
  600. #define IMAGE_REL_ALPHA_REFLONGNB       0x0010
  601. #define IMAGE_REL_ALPHA_SECRELLO        0x0011  // Low 16-bit section relative reference
  602. #define IMAGE_REL_ALPHA_SECRELHI        0x0012  // High 16-bit section relative reference
  603. #define IMAGE_REL_ALPHA_REFQ3           0x0013  // High 16 bits of 48 bit reference
  604. #define IMAGE_REL_ALPHA_REFQ2           0x0014  // Middle 16 bits of 48 bit reference
  605. #define IMAGE_REL_ALPHA_REFQ1           0x0015  // Low 16 bits of 48 bit reference
  606. #define IMAGE_REL_ALPHA_GPRELLO         0x0016  // Low 16-bit GP relative reference
  607. #define IMAGE_REL_ALPHA_GPRELHI         0x0017  // High 16-bit GP relative reference
  608. //
  609. // IBM PowerPC relocation types.
  610. //
  611. #define IMAGE_REL_PPC_ABSOLUTE          0x0000  // NOP
  612. #define IMAGE_REL_PPC_ADDR64            0x0001  // 64-bit address
  613. #define IMAGE_REL_PPC_ADDR32            0x0002  // 32-bit address
  614. #define IMAGE_REL_PPC_ADDR24            0x0003  // 26-bit address, shifted left 2 (branch absolute)
  615. #define IMAGE_REL_PPC_ADDR16            0x0004  // 16-bit address
  616. #define IMAGE_REL_PPC_ADDR14            0x0005  // 16-bit address, shifted left 2 (load doubleword)
  617. #define IMAGE_REL_PPC_REL24             0x0006  // 26-bit PC-relative offset, shifted left 2 (branch relative)
  618. #define IMAGE_REL_PPC_REL14             0x0007  // 16-bit PC-relative offset, shifted left 2 (br cond relative)
  619. #define IMAGE_REL_PPC_TOCREL16          0x0008  // 16-bit offset from TOC base
  620. #define IMAGE_REL_PPC_TOCREL14          0x0009  // 16-bit offset from TOC base, shifted left 2 (load doubleword)
  621. #define IMAGE_REL_PPC_ADDR32NB          0x000A  // 32-bit addr w/o image base
  622. #define IMAGE_REL_PPC_SECREL            0x000B  // va of containing section (as in an image sectionhdr)
  623. #define IMAGE_REL_PPC_SECTION           0x000C  // sectionheader number
  624. #define IMAGE_REL_PPC_IFGLUE            0x000D  // substitute TOC restore instruction iff symbol is glue code
  625. #define IMAGE_REL_PPC_IMGLUE            0x000E  // symbol is glue code; virtual address is TOC restore instruction
  626. #define IMAGE_REL_PPC_SECREL16          0x000F  // va of containing section (limited to 16 bits)
  627. #define IMAGE_REL_PPC_REFHI             0x0010
  628. #define IMAGE_REL_PPC_REFLO             0x0011
  629. #define IMAGE_REL_PPC_PAIR              0x0012
  630. #define IMAGE_REL_PPC_SECRELLO          0x0013  // Low 16-bit section relative reference (used for >32k TLS)
  631. #define IMAGE_REL_PPC_SECRELHI          0x0014  // High 16-bit section relative reference (used for >32k TLS)
  632. #define IMAGE_REL_PPC_GPREL             0x0015
  633. #define IMAGE_REL_PPC_TOKEN             0x0016  // clr token
  634. #define IMAGE_REL_PPC_TYPEMASK          0x00FF  // mask to isolate above values in IMAGE_RELOCATION.Type
  635. // Flag bits in IMAGE_RELOCATION.TYPE
  636. #define IMAGE_REL_PPC_NEG               0x0100  // subtract reloc value rather than adding it
  637. #define IMAGE_REL_PPC_BRTAKEN           0x0200  // fix branch prediction bit to predict branch taken
  638. #define IMAGE_REL_PPC_BRNTAKEN          0x0400  // fix branch prediction bit to predict branch not taken
  639. #define IMAGE_REL_PPC_TOCDEFN           0x0800  // toc slot defined in file (or, data in toc)
  640. //
  641. // Hitachi SH3 relocation types.
  642. //
  643. #define IMAGE_REL_SH3_ABSOLUTE          0x0000  // No relocation
  644. #define IMAGE_REL_SH3_DIRECT16          0x0001  // 16 bit direct
  645. #define IMAGE_REL_SH3_DIRECT32          0x0002  // 32 bit direct
  646. #define IMAGE_REL_SH3_DIRECT8           0x0003  // 8 bit direct, -128..255
  647. #define IMAGE_REL_SH3_DIRECT8_WORD      0x0004  // 8 bit direct .W (0 ext.)
  648. #define IMAGE_REL_SH3_DIRECT8_LONG      0x0005  // 8 bit direct .L (0 ext.)
  649. #define IMAGE_REL_SH3_DIRECT4           0x0006  // 4 bit direct (0 ext.)
  650. #define IMAGE_REL_SH3_DIRECT4_WORD      0x0007  // 4 bit direct .W (0 ext.)
  651. #define IMAGE_REL_SH3_DIRECT4_LONG      0x0008  // 4 bit direct .L (0 ext.)
  652. #define IMAGE_REL_SH3_PCREL8_WORD       0x0009  // 8 bit PC relative .W
  653. #define IMAGE_REL_SH3_PCREL8_LONG       0x000A  // 8 bit PC relative .L
  654. #define IMAGE_REL_SH3_PCREL12_WORD      0x000B  // 12 LSB PC relative .W
  655. #define IMAGE_REL_SH3_STARTOF_SECTION   0x000C  // Start of EXE section
  656. #define IMAGE_REL_SH3_SIZEOF_SECTION    0x000D  // Size of EXE section
  657. #define IMAGE_REL_SH3_SECTION           0x000E  // Section table index
  658. #define IMAGE_REL_SH3_SECREL            0x000F  // Offset within section
  659. #define IMAGE_REL_SH3_DIRECT32_NB       0x0010  // 32 bit direct not based
  660. #define IMAGE_REL_SH3_GPREL4_LONG       0x0011  // GP-relative addressing
  661. #define IMAGE_REL_SH3_TOKEN             0x0012  // clr token
  662. #define IMAGE_REL_ARM_ABSOLUTE          0x0000  // No relocation required
  663. #define IMAGE_REL_ARM_ADDR32            0x0001  // 32 bit address
  664. #define IMAGE_REL_ARM_ADDR32NB          0x0002  // 32 bit address w/o image base
  665. #define IMAGE_REL_ARM_BRANCH24          0x0003  // 24 bit offset << 2 & sign ext.
  666. #define IMAGE_REL_ARM_BRANCH11          0x0004  // Thumb: 2 11 bit offsets
  667. #define IMAGE_REL_ARM_TOKEN             0x0005  // clr token
  668. #define IMAGE_REL_ARM_GPREL12           0x0006  // GP-relative addressing (ARM)
  669. #define IMAGE_REL_ARM_GPREL7            0x0007  // GP-relative addressing (Thumb)
  670. #define IMAGE_REL_ARM_BLX24             0x0008
  671. #define IMAGE_REL_ARM_BLX11             0x0009
  672. #define IMAGE_REL_ARM_SECTION           0x000E  // Section table index
  673. #define IMAGE_REL_ARM_SECREL            0x000F  // Offset within section
  674. #define IMAGE_REL_AM_ABSOLUTE           0x0000
  675. #define IMAGE_REL_AM_ADDR32             0x0001
  676. #define IMAGE_REL_AM_ADDR32NB           0x0002
  677. #define IMAGE_REL_AM_CALL32             0x0003
  678. #define IMAGE_REL_AM_FUNCINFO           0x0004
  679. #define IMAGE_REL_AM_REL32_1            0x0005
  680. #define IMAGE_REL_AM_REL32_2            0x0006
  681. #define IMAGE_REL_AM_SECREL             0x0007
  682. #define IMAGE_REL_AM_SECTION            0x0008
  683. #define IMAGE_REL_AM_TOKEN              0x0009
  684. //
  685. // X86-64 relocations
  686. //
  687. #define IMAGE_REL_AMD64_ABSOLUTE        0x0000  // Reference is absolute, no relocation is necessary
  688. #define IMAGE_REL_AMD64_ADDR64          0x0001  // 64-bit address (VA).
  689. #define IMAGE_REL_AMD64_ADDR32          0x0002  // 32-bit address (VA).
  690. #define IMAGE_REL_AMD64_ADDR32NB        0x0003  // 32-bit address w/o image base (RVA).
  691. #define IMAGE_REL_AMD64_REL32           0x0004  // 32-bit relative address from byte following reloc
  692. #define IMAGE_REL_AMD64_REL32_1         0x0005  // 32-bit relative address from byte distance 1 from reloc
  693. #define IMAGE_REL_AMD64_REL32_2         0x0006  // 32-bit relative address from byte distance 2 from reloc
  694. #define IMAGE_REL_AMD64_REL32_3         0x0007  // 32-bit relative address from byte distance 3 from reloc
  695. #define IMAGE_REL_AMD64_REL32_4         0x0008  // 32-bit relative address from byte distance 4 from reloc
  696. #define IMAGE_REL_AMD64_REL32_5         0x0009  // 32-bit relative address from byte distance 5 from reloc
  697. #define IMAGE_REL_AMD64_SECTION         0x000A  // Section index
  698. #define IMAGE_REL_AMD64_SECREL          0x000B  // 32 bit offset from base of section containing target
  699. #define IMAGE_REL_AMD64_SECREL7         0x000C  // 7 bit unsigned offset from base of section containing target
  700. #define IMAGE_REL_AMD64_TOKEN           0x000D  // 32 bit metadata token
  701. //
  702. // IA64 relocation types.
  703. //
  704. #define IMAGE_REL_IA64_ABSOLUTE         0x0000
  705. #define IMAGE_REL_IA64_IMM14            0x0001
  706. #define IMAGE_REL_IA64_IMM22            0x0002
  707. #define IMAGE_REL_IA64_IMM64            0x0003
  708. #define IMAGE_REL_IA64_DIR32            0x0004
  709. #define IMAGE_REL_IA64_DIR64            0x0005
  710. #define IMAGE_REL_IA64_PCREL21B         0x0006
  711. #define IMAGE_REL_IA64_PCREL21M         0x0007
  712. #define IMAGE_REL_IA64_PCREL21F         0x0008
  713. #define IMAGE_REL_IA64_GPREL22          0x0009
  714. #define IMAGE_REL_IA64_LTOFF22          0x000A
  715. #define IMAGE_REL_IA64_SECTION          0x000B
  716. #define IMAGE_REL_IA64_SECREL22         0x000C
  717. #define IMAGE_REL_IA64_SECREL64I        0x000D
  718. #define IMAGE_REL_IA64_SECREL32         0x000E
  719. // 
  720. #define IMAGE_REL_IA64_DIR32NB          0x0010
  721. #define IMAGE_REL_IA64_SREL14           0x0011
  722. #define IMAGE_REL_IA64_SREL22           0x0012
  723. #define IMAGE_REL_IA64_SREL32           0x0013
  724. #define IMAGE_REL_IA64_UREL32           0x0014
  725. #define IMAGE_REL_IA64_PCREL60X         0x0015  // This is always a BRL and never converted
  726. #define IMAGE_REL_IA64_PCREL60B         0x0016  // If possible, convert to MBB bundle with NOP.B in slot 1
  727. #define IMAGE_REL_IA64_PCREL60F         0x0017  // If possible, convert to MFB bundle with NOP.F in slot 1
  728. #define IMAGE_REL_IA64_PCREL60I         0x0018  // If possible, convert to MIB bundle with NOP.I in slot 1
  729. #define IMAGE_REL_IA64_PCREL60M         0x0019  // If possible, convert to MMB bundle with NOP.M in slot 1
  730. #define IMAGE_REL_IA64_IMMGPREL64       0x001A
  731. #define IMAGE_REL_IA64_TOKEN            0x001B  // clr token
  732. #define IMAGE_REL_IA64_GPREL32          0x001C
  733. #define IMAGE_REL_IA64_ADDEND           0x001F
  734. //
  735. // CEF relocation types.
  736. //
  737. #define IMAGE_REL_CEF_ABSOLUTE          0x0000  // Reference is absolute, no relocation is necessary
  738. #define IMAGE_REL_CEF_ADDR32            0x0001  // 32-bit address (VA).
  739. #define IMAGE_REL_CEF_ADDR64            0x0002  // 64-bit address (VA).
  740. #define IMAGE_REL_CEF_ADDR32NB          0x0003  // 32-bit address w/o image base (RVA).
  741. #define IMAGE_REL_CEF_SECTION           0x0004  // Section index
  742. #define IMAGE_REL_CEF_SECREL            0x0005  // 32 bit offset from base of section containing target
  743. #define IMAGE_REL_CEF_TOKEN             0x0006  // 32 bit metadata token
  744. //
  745. // clr relocation types.
  746. //
  747. #define IMAGE_REL_CEE_ABSOLUTE          0x0000  // Reference is absolute, no relocation is necessary
  748. #define IMAGE_REL_CEE_ADDR32            0x0001  // 32-bit address (VA).
  749. #define IMAGE_REL_CEE_ADDR64            0x0002  // 64-bit address (VA).
  750. #define IMAGE_REL_CEE_ADDR32NB          0x0003  // 32-bit address w/o image base (RVA).
  751. #define IMAGE_REL_CEE_SECTION           0x0004  // Section index
  752. #define IMAGE_REL_CEE_SECREL            0x0005  // 32 bit offset from base of section containing target
  753. #define IMAGE_REL_CEE_TOKEN             0x0006  // 32 bit metadata token
  754. #define IMAGE_REL_M32R_ABSOLUTE       0x0000   // No relocation required
  755. #define IMAGE_REL_M32R_ADDR32         0x0001   // 32 bit address
  756. #define IMAGE_REL_M32R_ADDR32NB       0x0002   // 32 bit address w/o image base
  757. #define IMAGE_REL_M32R_ADDR24         0x0003   // 24 bit address
  758. #define IMAGE_REL_M32R_GPREL16        0x0004   // GP relative addressing
  759. #define IMAGE_REL_M32R_PCREL24        0x0005   // 24 bit offset << 2 & sign ext.
  760. #define IMAGE_REL_M32R_PCREL16        0x0006   // 16 bit offset << 2 & sign ext.
  761. #define IMAGE_REL_M32R_PCREL8         0x0007   // 8 bit offset << 2 & sign ext.
  762. #define IMAGE_REL_M32R_REFHALF        0x0008   // 16 MSBs
  763. #define IMAGE_REL_M32R_REFHI          0x0009   // 16 MSBs; adj for LSB sign ext.
  764. #define IMAGE_REL_M32R_REFLO          0x000A   // 16 LSBs
  765. #define IMAGE_REL_M32R_PAIR           0x000B   // Link HI and LO
  766. #define IMAGE_REL_M32R_SECTION        0x000C   // Section table index
  767. #define IMAGE_REL_M32R_SECREL32       0x000D   // 32 bit section relative reference
  768. #define IMAGE_REL_M32R_TOKEN          0x000E   // clr token
  769. #define EXT_IMM64(Value, Address, Size, InstPos, ValPos)  /* Intel-IA64-Filler */           
  770.     Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos)  // Intel-IA64-Filler
  771. #define INS_IMM64(Value, Address, Size, InstPos, ValPos)  /* Intel-IA64-Filler */
  772.     *(PDWORD)Address = (*(PDWORD)Address & ~(((1 << Size) - 1) << InstPos)) | /* Intel-IA64-Filler */
  773.           ((DWORD)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos)  // Intel-IA64-Filler
  774. #define EMARCH_ENC_I17_IMM7B_INST_WORD_X         3  // Intel-IA64-Filler
  775. #define EMARCH_ENC_I17_IMM7B_SIZE_X              7  // Intel-IA64-Filler
  776. #define EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X     4  // Intel-IA64-Filler
  777. #define EMARCH_ENC_I17_IMM7B_VAL_POS_X           0  // Intel-IA64-Filler
  778. #define EMARCH_ENC_I17_IMM9D_INST_WORD_X         3  // Intel-IA64-Filler
  779. #define EMARCH_ENC_I17_IMM9D_SIZE_X              9  // Intel-IA64-Filler
  780. #define EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X     18  // Intel-IA64-Filler
  781. #define EMARCH_ENC_I17_IMM9D_VAL_POS_X           7  // Intel-IA64-Filler
  782. #define EMARCH_ENC_I17_IMM5C_INST_WORD_X         3  // Intel-IA64-Filler
  783. #define EMARCH_ENC_I17_IMM5C_SIZE_X              5  // Intel-IA64-Filler
  784. #define EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X     13  // Intel-IA64-Filler
  785. #define EMARCH_ENC_I17_IMM5C_VAL_POS_X           16  // Intel-IA64-Filler
  786. #define EMARCH_ENC_I17_IC_INST_WORD_X            3  // Intel-IA64-Filler
  787. #define EMARCH_ENC_I17_IC_SIZE_X                 1  // Intel-IA64-Filler
  788. #define EMARCH_ENC_I17_IC_INST_WORD_POS_X        12  // Intel-IA64-Filler
  789. #define EMARCH_ENC_I17_IC_VAL_POS_X              21  // Intel-IA64-Filler
  790. #define EMARCH_ENC_I17_IMM41a_INST_WORD_X        1  // Intel-IA64-Filler
  791. #define EMARCH_ENC_I17_IMM41a_SIZE_X             10  // Intel-IA64-Filler
  792. #define EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X    14  // Intel-IA64-Filler
  793. #define EMARCH_ENC_I17_IMM41a_VAL_POS_X          22  // Intel-IA64-Filler
  794. #define EMARCH_ENC_I17_IMM41b_INST_WORD_X        1  // Intel-IA64-Filler
  795. #define EMARCH_ENC_I17_IMM41b_SIZE_X             8  // Intel-IA64-Filler
  796. #define EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X    24  // Intel-IA64-Filler
  797. #define EMARCH_ENC_I17_IMM41b_VAL_POS_X          32  // Intel-IA64-Filler
  798. #define EMARCH_ENC_I17_IMM41c_INST_WORD_X        2  // Intel-IA64-Filler
  799. #define EMARCH_ENC_I17_IMM41c_SIZE_X             23  // Intel-IA64-Filler
  800. #define EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X    0  // Intel-IA64-Filler
  801. #define EMARCH_ENC_I17_IMM41c_VAL_POS_X          40  // Intel-IA64-Filler
  802. #define EMARCH_ENC_I17_SIGN_INST_WORD_X          3  // Intel-IA64-Filler
  803. #define EMARCH_ENC_I17_SIGN_SIZE_X               1  // Intel-IA64-Filler
  804. #define EMARCH_ENC_I17_SIGN_INST_WORD_POS_X      27  // Intel-IA64-Filler
  805. #define EMARCH_ENC_I17_SIGN_VAL_POS_X            63  // Intel-IA64-Filler
  806. //
  807. // Line number format.
  808. //
  809. typedef struct _IMAGE_LINENUMBER {
  810.     union {
  811.         DWORD   SymbolTableIndex;               // Symbol table index of function name if Linenumber is 0.
  812.         DWORD   VirtualAddress;                 // Virtual address of line number.
  813.     } Type;
  814.     WORD    Linenumber;                         // Line number.
  815. } IMAGE_LINENUMBER;
  816. typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;
  817. #define IMAGE_SIZEOF_LINENUMBER              6
  818. #ifndef _MAC
  819. #include "poppack.h"                        // Back to 4 byte packing
  820. #endif
  821. //
  822. // Based relocation format.
  823. //
  824. typedef struct _IMAGE_BASE_RELOCATION {
  825.     DWORD   VirtualAddress;
  826.     DWORD   SizeOfBlock;
  827. //  WORD    TypeOffset[1];
  828. } IMAGE_BASE_RELOCATION;
  829. typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
  830. #define IMAGE_SIZEOF_BASE_RELOCATION         8
  831. //
  832. // Based relocation types.
  833. //
  834. #define IMAGE_REL_BASED_ABSOLUTE              0
  835. #define IMAGE_REL_BASED_HIGH                  1
  836. #define IMAGE_REL_BASED_LOW                   2
  837. #define IMAGE_REL_BASED_HIGHLOW               3
  838. #define IMAGE_REL_BASED_HIGHADJ               4
  839. #define IMAGE_REL_BASED_MIPS_JMPADDR          5
  840. #define IMAGE_REL_BASED_MIPS_JMPADDR16        9
  841. #define IMAGE_REL_BASED_IA64_IMM64            9
  842. #define IMAGE_REL_BASED_DIR64                 10
  843. //
  844. // Archive format.
  845. //
  846. #define IMAGE_ARCHIVE_START_SIZE             8
  847. #define IMAGE_ARCHIVE_START                  "!<arch>n"
  848. #define IMAGE_ARCHIVE_END                    "`n"
  849. #define IMAGE_ARCHIVE_PAD                    "n"
  850. #define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "
  851. #define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "
  852. typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
  853.     BYTE     Name[16];                          // File member name - `/' terminated.
  854.     BYTE     Date[12];                          // File member date - decimal.
  855.     BYTE     UserID[6];                         // File member user id - decimal.
  856.     BYTE     GroupID[6];                        // File member group id - decimal.
  857.     BYTE     Mode[8];                           // File member mode - octal.
  858.     BYTE     Size[10];                          // File member size - decimal.
  859.     BYTE     EndHeader[2];                      // String to end header.
  860. } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
  861. #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60
  862. //
  863. // DLL support.
  864. //
  865. //
  866. // Export Format
  867. //
  868. typedef struct _IMAGE_EXPORT_DIRECTORY {
  869.     DWORD   Characteristics;
  870.     DWORD   TimeDateStamp;
  871.     WORD    MajorVersion;
  872.     WORD    MinorVersion;
  873.     DWORD   Name;
  874.     DWORD   Base;
  875.     DWORD   NumberOfFunctions;
  876.     DWORD   NumberOfNames;
  877.     DWORD   AddressOfFunctions;     // RVA from base of image
  878.     DWORD   AddressOfNames;         // RVA from base of image
  879.     DWORD   AddressOfNameOrdinals;  // RVA from base of image
  880. } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
  881. //
  882. // Import Format
  883. //
  884. typedef struct _IMAGE_IMPORT_BY_NAME {
  885.     WORD    Hint;
  886.     BYTE    Name[1];
  887. } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
  888. #include "pshpack8.h"                       // Use align 8 for the 64-bit IAT.
  889. typedef struct _IMAGE_THUNK_DATA64 {
  890.     union {
  891.         ULONGLONG ForwarderString;  // PBYTE 
  892.         ULONGLONG Function;         // PDWORD
  893.         ULONGLONG Ordinal;
  894.         ULONGLONG AddressOfData;    // PIMAGE_IMPORT_BY_NAME
  895.     } u1;
  896. } IMAGE_THUNK_DATA64;
  897. typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;
  898. #include "poppack.h"                        // Back to 4 byte packing
  899. typedef struct _IMAGE_THUNK_DATA32 {
  900.     union {
  901.         DWORD ForwarderString;      // PBYTE 
  902.         DWORD Function;             // PDWORD
  903.         DWORD Ordinal;
  904.         DWORD AddressOfData;        // PIMAGE_IMPORT_BY_NAME
  905.     } u1;
  906. } IMAGE_THUNK_DATA32;
  907. typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;
  908. #define IMAGE_ORDINAL_FLAG64 0x8000000000000000
  909. #define IMAGE_ORDINAL_FLAG32 0x80000000
  910. #define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)
  911. #define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)
  912. #define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)
  913. #define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)
  914. //
  915. // Thread Local Storage
  916. //
  917. typedef VOID
  918. (NTAPI *PIMAGE_TLS_CALLBACK) (
  919.     PVOID DllHandle,
  920.     DWORD Reason,
  921.     PVOID Reserved
  922.     );
  923. typedef struct _IMAGE_TLS_DIRECTORY64 {
  924.     ULONGLONG   StartAddressOfRawData;
  925.     ULONGLONG   EndAddressOfRawData;
  926.     ULONGLONG   AddressOfIndex;         // PDWORD
  927.     ULONGLONG   AddressOfCallBacks;     // PIMAGE_TLS_CALLBACK *;
  928.     DWORD   SizeOfZeroFill;
  929.     DWORD   Characteristics;
  930. } IMAGE_TLS_DIRECTORY64;
  931. typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;
  932. typedef struct _IMAGE_TLS_DIRECTORY32 {
  933.     DWORD   StartAddressOfRawData;
  934.     DWORD   EndAddressOfRawData;
  935.     DWORD   AddressOfIndex;             // PDWORD
  936.     DWORD   AddressOfCallBacks;         // PIMAGE_TLS_CALLBACK *
  937.     DWORD   SizeOfZeroFill;
  938.     DWORD   Characteristics;
  939. } IMAGE_TLS_DIRECTORY32;
  940. typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;
  941. #ifdef _WIN64
  942. #define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG64
  943. #define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL64(Ordinal)
  944. typedef IMAGE_THUNK_DATA64              IMAGE_THUNK_DATA;
  945. typedef PIMAGE_THUNK_DATA64             PIMAGE_THUNK_DATA;
  946. #define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL64(Ordinal)
  947. typedef IMAGE_TLS_DIRECTORY64           IMAGE_TLS_DIRECTORY;
  948. typedef PIMAGE_TLS_DIRECTORY64          PIMAGE_TLS_DIRECTORY;
  949. #else
  950. #define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG32
  951. #define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL32(Ordinal)
  952. typedef IMAGE_THUNK_DATA32              IMAGE_THUNK_DATA;
  953. typedef PIMAGE_THUNK_DATA32             PIMAGE_THUNK_DATA;
  954. #define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL32(Ordinal)
  955. typedef IMAGE_TLS_DIRECTORY32           IMAGE_TLS_DIRECTORY;
  956. typedef PIMAGE_TLS_DIRECTORY32          PIMAGE_TLS_DIRECTORY;
  957. #endif
  958. typedef struct _IMAGE_IMPORT_DESCRIPTOR {
  959.     union {
  960.         DWORD   Characteristics;            // 0 for terminating null import descriptor
  961.         DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
  962.     };
  963.     DWORD   TimeDateStamp;                  // 0 if not bound,
  964.                                             // -1 if bound, and real datetime stamp
  965.                                             //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
  966.                                             // O.W. date/time stamp of DLL bound to (Old BIND)
  967.     DWORD   ForwarderChain;                 // -1 if no forwarders
  968.     DWORD   Name;
  969.     DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
  970. } IMAGE_IMPORT_DESCRIPTOR;
  971. typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
  972. //
  973. // New format import descriptors pointed to by DataDirectory[ IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ]
  974. //
  975. typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
  976.     DWORD   TimeDateStamp;
  977.     WORD    OffsetModuleName;
  978.     WORD    NumberOfModuleForwarderRefs;
  979. // Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
  980. } IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
  981. typedef struct _IMAGE_BOUND_FORWARDER_REF {
  982.     DWORD   TimeDateStamp;
  983.     WORD    OffsetModuleName;
  984.     WORD    Reserved;
  985. } IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
  986. //
  987. // Resource Format.
  988. //
  989. //
  990. // Resource directory consists of two counts, following by a variable length
  991. // array of directory entries.  The first count is the number of entries at
  992. // beginning of the array that have actual names associated with each entry.
  993. // The entries are in ascending order, case insensitive strings.  The second
  994. // count is the number of entries that immediately follow the named entries.
  995. // This second count identifies the number of entries that have 16-bit integer
  996. // Ids as their name.  These entries are also sorted in ascending order.
  997. //
  998. // This structure allows fast lookup by either name or number, but for any
  999. // given resource entry only one form of lookup is supported, not both.
  1000. // This is consistant with the syntax of the .RC file and the .RES file.
  1001. //
  1002. typedef struct _IMAGE_RESOURCE_DIRECTORY {
  1003.     DWORD   Characteristics;
  1004.     DWORD   TimeDateStamp;
  1005.     WORD    MajorVersion;
  1006.     WORD    MinorVersion;
  1007.     WORD    NumberOfNamedEntries;
  1008.     WORD    NumberOfIdEntries;
  1009. //  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
  1010. } IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
  1011. #define IMAGE_RESOURCE_NAME_IS_STRING        0x80000000
  1012. #define IMAGE_RESOURCE_DATA_IS_DIRECTORY     0x80000000
  1013. //
  1014. // Each directory contains the 32-bit Name of the entry and an offset,
  1015. // relative to the beginning of the resource directory of the data associated
  1016. // with this directory entry.  If the name of the entry is an actual text
  1017. // string instead of an integer Id, then the high order bit of the name field
  1018. // is set to one and the low order 31-bits are an offset, relative to the
  1019. // beginning of the resource directory of the string, which is of type
  1020. // IMAGE_RESOURCE_DIRECTORY_STRING.  Otherwise the high bit is clear and the
  1021. // low-order 16-bits are the integer Id that identify this resource directory
  1022. // entry. If the directory entry is yet another resource directory (i.e. a
  1023. // subdirectory), then the high order bit of the offset field will be
  1024. // set to indicate this.  Otherwise the high bit is clear and the offset
  1025. // field points to a resource data entry.
  1026. //
  1027. typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
  1028.     union {
  1029.         struct {
  1030.             DWORD NameOffset:31;
  1031.             DWORD NameIsString:1;
  1032.         };
  1033.         DWORD   Name;
  1034.         WORD    Id;
  1035.     };
  1036.     union {
  1037.         DWORD   OffsetToData;
  1038.         struct {
  1039.             DWORD   OffsetToDirectory:31;
  1040.             DWORD   DataIsDirectory:1;
  1041.         };
  1042.     };
  1043. } IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
  1044. //
  1045. // For resource directory entries that have actual string names, the Name
  1046. // field of the directory entry points to an object of the following type.
  1047. // All of these string objects are stored together after the last resource
  1048. // directory entry and before the first resource data object.  This minimizes
  1049. // the impact of these variable length objects on the alignment of the fixed
  1050. // size directory entry objects.
  1051. //
  1052. typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
  1053.     WORD    Length;
  1054.     CHAR    NameString[ 1 ];
  1055. } IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
  1056. typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
  1057.     WORD    Length;
  1058.     WCHAR   NameString[ 1 ];
  1059. } IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
  1060. //
  1061. // Each resource data entry describes a leaf node in the resource directory
  1062. // tree.  It contains an offset, relative to the beginning of the resource
  1063. // directory of the data for the resource, a size field that gives the number
  1064. // of bytes of data at that offset, a CodePage that should be used when
  1065. // decoding code point values within the resource data.  Typically for new
  1066. // applications the code page would be the unicode code page.
  1067. //
  1068. typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
  1069.     DWORD   OffsetToData;
  1070.     DWORD   Size;
  1071.     DWORD   CodePage;
  1072.     DWORD   Reserved;
  1073. } IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
  1074. //
  1075. // Load Configuration Directory Entry
  1076. //
  1077. typedef struct {
  1078.     DWORD   Characteristics;
  1079.     DWORD   TimeDateStamp;
  1080.     WORD    MajorVersion;
  1081.     WORD    MinorVersion;
  1082.     DWORD   GlobalFlagsClear;
  1083.     DWORD   GlobalFlagsSet;
  1084.     DWORD   CriticalSectionDefaultTimeout;
  1085.     DWORD   DeCommitFreeBlockThreshold;
  1086.     DWORD   DeCommitTotalFreeThreshold;
  1087.     DWORD   LockPrefixTable;            // VA
  1088.     DWORD   MaximumAllocationSize;
  1089.     DWORD   VirtualMemoryThreshold;
  1090.     DWORD   ProcessHeapFlags;
  1091.     DWORD   ProcessAffinityMask;
  1092.     WORD    CSDVersion;
  1093.     WORD    Reserved1;
  1094.     DWORD   EditList;                   // VA
  1095.     DWORD   Reserved[ 1 ];
  1096. } IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
  1097. typedef struct {
  1098.     DWORD   Characteristics;
  1099.     DWORD   TimeDateStamp;
  1100.     WORD    MajorVersion;
  1101.     WORD    MinorVersion;
  1102.     DWORD   GlobalFlagsClear;
  1103.     DWORD   GlobalFlagsSet;
  1104.     DWORD   CriticalSectionDefaultTimeout;
  1105.     ULONGLONG  DeCommitFreeBlockThreshold;
  1106.     ULONGLONG  DeCommitTotalFreeThreshold;
  1107.     ULONGLONG  LockPrefixTable;         // VA
  1108.     ULONGLONG  MaximumAllocationSize;
  1109.     ULONGLONG  VirtualMemoryThreshold;
  1110.     ULONGLONG  ProcessAffinityMask;
  1111.     DWORD   ProcessHeapFlags;
  1112.     WORD    CSDVersion;
  1113.     WORD    Reserved1;
  1114.     ULONGLONG  EditList;                // VA
  1115.     DWORD   Reserved[ 2 ];
  1116. } IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
  1117. #ifdef _WIN64
  1118. typedef IMAGE_LOAD_CONFIG_DIRECTORY64   IMAGE_LOAD_CONFIG_DIRECTORY;
  1119. typedef PIMAGE_LOAD_CONFIG_DIRECTORY64  PIMAGE_LOAD_CONFIG_DIRECTORY;
  1120. #else
  1121. typedef IMAGE_LOAD_CONFIG_DIRECTORY32   IMAGE_LOAD_CONFIG_DIRECTORY;
  1122. typedef PIMAGE_LOAD_CONFIG_DIRECTORY32  PIMAGE_LOAD_CONFIG_DIRECTORY;
  1123. #endif
  1124. //
  1125. // WIN CE Exception table format
  1126. //
  1127. //
  1128. // Function table entry format.  Function table is pointed to by the
  1129. // IMAGE_DIRECTORY_ENTRY_EXCEPTION directory entry.
  1130. //
  1131. typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
  1132.     DWORD FuncStart;
  1133.     DWORD PrologLen : 8;
  1134.     DWORD FuncLen : 22;
  1135.     DWORD ThirtyTwoBit : 1;
  1136.     DWORD ExceptionFlag : 1;
  1137. } IMAGE_CE_RUNTIME_FUNCTION_ENTRY, * PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;
  1138. typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {
  1139.     ULONGLONG BeginAddress;
  1140.     ULONGLONG EndAddress;
  1141.     ULONGLONG ExceptionHandler;
  1142.     ULONGLONG HandlerData;
  1143.     ULONGLONG PrologEndAddress;
  1144. } IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;
  1145. typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {
  1146.     DWORD BeginAddress;
  1147.     DWORD EndAddress;
  1148.     DWORD ExceptionHandler;
  1149.     DWORD HandlerData;
  1150.     DWORD PrologEndAddress;
  1151. } IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;
  1152. typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
  1153.     DWORD BeginAddress;
  1154.     DWORD EndAddress;
  1155.     DWORD UnwindInfoAddress;
  1156. } _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;
  1157. typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
  1158. typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
  1159. #if defined(_AXP64_)
  1160. typedef  IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY  IMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;
  1161. typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;
  1162. typedef  IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
  1163. typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
  1164. #elif defined(_ALPHA_)
  1165. typedef  IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
  1166. typedef PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
  1167. #else
  1168. typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
  1169. typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
  1170. #endif
  1171. //
  1172. // Debug Format
  1173. //
  1174. typedef struct _IMAGE_DEBUG_DIRECTORY {
  1175.     DWORD   Characteristics;
  1176.     DWORD   TimeDateStamp;
  1177.     WORD    MajorVersion;
  1178.     WORD    MinorVersion;
  1179.     DWORD   Type;
  1180.     DWORD   SizeOfData;
  1181.     DWORD   AddressOfRawData;
  1182.     DWORD   PointerToRawData;
  1183. } IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
  1184. #define IMAGE_DEBUG_TYPE_UNKNOWN          0
  1185. #define IMAGE_DEBUG_TYPE_COFF             1
  1186. #define IMAGE_DEBUG_TYPE_CODEVIEW         2
  1187. #define IMAGE_DEBUG_TYPE_FPO              3
  1188. #define IMAGE_DEBUG_TYPE_MISC             4
  1189. #define IMAGE_DEBUG_TYPE_EXCEPTION        5
  1190. #define IMAGE_DEBUG_TYPE_FIXUP            6
  1191. #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC      7
  1192. #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC    8
  1193. #define IMAGE_DEBUG_TYPE_BORLAND          9
  1194. #define IMAGE_DEBUG_TYPE_RESERVED10       10
  1195. #define IMAGE_DEBUG_TYPE_CLSID            11
  1196. typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
  1197.     DWORD   NumberOfSymbols;
  1198.     DWORD   LvaToFirstSymbol;
  1199.     DWORD   NumberOfLinenumbers;
  1200.     DWORD   LvaToFirstLinenumber;
  1201.     DWORD   RvaToFirstByteOfCode;
  1202.     DWORD   RvaToLastByteOfCode;
  1203.     DWORD   RvaToFirstByteOfData;
  1204.     DWORD   RvaToLastByteOfData;
  1205. } IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
  1206. #define FRAME_FPO       0
  1207. #define FRAME_TRAP      1
  1208. #define FRAME_TSS       2
  1209. #define FRAME_NONFPO    3
  1210. typedef struct _FPO_DATA {
  1211.     DWORD       ulOffStart;             // offset 1st byte of function code
  1212.     DWORD       cbProcSize;             // # bytes in function
  1213.     DWORD       cdwLocals;              // # bytes in locals/4
  1214.     WORD        cdwParams;              // # bytes in params/4
  1215.     WORD        cbProlog : 8;           // # bytes in prolog
  1216.     WORD        cbRegs   : 3;           // # regs saved
  1217.     WORD        fHasSEH  : 1;           // TRUE if SEH in func
  1218.     WORD        fUseBP   : 1;           // TRUE if EBP has been allocated
  1219.     WORD        reserved : 1;           // reserved for future use
  1220.     WORD        cbFrame  : 2;           // frame type
  1221. } FPO_DATA, *PFPO_DATA;
  1222. #define SIZEOF_RFPO_DATA 16
  1223. #define IMAGE_DEBUG_MISC_EXENAME    1
  1224. typedef struct _IMAGE_DEBUG_MISC {
  1225.     DWORD       DataType;               // type of misc data, see defines
  1226.     DWORD       Length;                 // total length of record, rounded to four
  1227.                                         // byte multiple.
  1228.     BOOLEAN     Unicode;                // TRUE if data is unicode string
  1229.     BYTE        Reserved[ 3 ];
  1230.     BYTE        Data[ 1 ];              // Actual data
  1231. } IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
  1232. //
  1233. // Function table extracted from MIPS/ALPHA/IA64 images.  Does not contain
  1234. // information needed only for runtime support.  Just those fields for
  1235. // each entry needed by a debugger.
  1236. //
  1237. typedef struct _IMAGE_FUNCTION_ENTRY {
  1238.     DWORD   StartingAddress;
  1239.     DWORD   EndingAddress;
  1240.     DWORD   EndOfPrologue;
  1241. } IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
  1242. typedef struct _IMAGE_FUNCTION_ENTRY64 {
  1243.     ULONGLONG   StartingAddress;
  1244.     ULONGLONG   EndingAddress;
  1245.     union {
  1246.         ULONGLONG   EndOfPrologue;
  1247.         ULONGLONG   UnwindInfoAddress;
  1248.     };
  1249. } IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;
  1250. //
  1251. // Debugging information can be stripped from an image file and placed
  1252. // in a separate .DBG file, whose file name part is the same as the
  1253. // image file name part (e.g. symbols for CMD.EXE could be stripped
  1254. // and placed in CMD.DBG).  This is indicated by the IMAGE_FILE_DEBUG_STRIPPED
  1255. // flag in the Characteristics field of the file header.  The beginning of
  1256. // the .DBG file contains the following structure which captures certain
  1257. // information from the image file.  This allows a debug to proceed even if
  1258. // the original image file is not accessable.  This header is followed by
  1259. // zero of more IMAGE_SECTION_HEADER structures, followed by zero or more
  1260. // IMAGE_DEBUG_DIRECTORY structures.  The latter structures and those in
  1261. // the image file contain file offsets relative to the beginning of the
  1262. // .DBG file.
  1263. //
  1264. // If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure
  1265. // is left in the image file, but not mapped.  This allows a debugger to
  1266. // compute the name of the .DBG file, from the name of the image in the
  1267. // IMAGE_DEBUG_MISC structure.
  1268. //
  1269. typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
  1270.     WORD        Signature;
  1271.     WORD        Flags;
  1272.     WORD        Machine;
  1273.     WORD        Characteristics;
  1274.     DWORD       TimeDateStamp;
  1275.     DWORD       CheckSum;
  1276.     DWORD       ImageBase;
  1277.     DWORD       SizeOfImage;
  1278.     DWORD       NumberOfSections;
  1279.     DWORD       ExportedNamesSize;
  1280.     DWORD       DebugDirectorySize;
  1281.     DWORD       SectionAlignment;
  1282.     DWORD       Reserved[2];
  1283. } IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
  1284. typedef struct _NON_PAGED_DEBUG_INFO {
  1285.     WORD        Signature;
  1286.     WORD        Flags;
  1287.     DWORD       Size;
  1288.     WORD        Machine;
  1289.     WORD        Characteristics;
  1290.     DWORD       TimeDateStamp;
  1291.     DWORD       CheckSum;
  1292.     DWORD       SizeOfImage;
  1293.     ULONGLONG   ImageBase;
  1294.     //DebugDirectorySize
  1295.     //IMAGE_DEBUG_DIRECTORY
  1296. } NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;
  1297. #ifndef _MAC
  1298. #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
  1299. #define NON_PAGED_DEBUG_SIGNATURE      0x494E
  1300. #else
  1301. #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4449  // DI
  1302. #define NON_PAGED_DEBUG_SIGNATURE      0x4E49  // NI
  1303. #endif
  1304. #define IMAGE_SEPARATE_DEBUG_FLAGS_MASK 0x8000
  1305. #define IMAGE_SEPARATE_DEBUG_MISMATCH   0x8000  // when DBG was updated, the
  1306.                                                 // old checksum didn't match.
  1307. //
  1308. //  The .arch section is made up of headers, each describing an amask position/value
  1309. //  pointing to an array of IMAGE_ARCHITECTURE_ENTRY's.  Each "array" (both the header
  1310. //  and entry arrays) are terminiated by a quadword of 0xffffffffL.
  1311. //
  1312. //  NOTE: There may be quadwords of 0 sprinkled around and must be skipped.
  1313. //
  1314. typedef struct _ImageArchitectureHeader {
  1315.     unsigned int AmaskValue: 1;                 // 1 -> code section depends on mask bit
  1316.                                                 // 0 -> new instruction depends on mask bit
  1317.     int :7;                                     // MBZ
  1318.     unsigned int AmaskShift: 8;                 // Amask bit in question for this fixup
  1319.     int :16;                                    // MBZ
  1320.     DWORD FirstEntryRVA;                        // RVA into .arch section to array of ARCHITECTURE_ENTRY's
  1321. } IMAGE_ARCHITECTURE_HEADER, *PIMAGE_ARCHITECTURE_HEADER;
  1322. typedef struct _ImageArchitectureEntry {
  1323.     DWORD FixupInstRVA;                         // RVA of instruction to fixup
  1324.     DWORD NewInst;                              // fixup instruction (see alphaops.h)
  1325. } IMAGE_ARCHITECTURE_ENTRY, *PIMAGE_ARCHITECTURE_ENTRY;
  1326. #include "poppack.h"                // Back to the initial value
  1327. // The following structure defines the new import object.  Note the values of the first two fields,
  1328. // which must be set as stated in order to differentiate old and new import members.
  1329. // Following this structure, the linker emits two null-terminated strings used to recreate the
  1330. // import at the time of use.  The first string is the import's name, the second is the dll's name.
  1331. #define IMPORT_OBJECT_HDR_SIG2  0xffff
  1332. typedef struct IMPORT_OBJECT_HEADER {
  1333.     WORD    Sig1;                       // Must be IMAGE_FILE_MACHINE_UNKNOWN
  1334.     WORD    Sig2;                       // Must be IMPORT_OBJECT_HDR_SIG2.
  1335.     WORD    Version;
  1336.     WORD    Machine;
  1337.     DWORD   TimeDateStamp;              // Time/date stamp
  1338.     DWORD   SizeOfData;                 // particularly useful for incremental links
  1339.     union {
  1340.         WORD    Ordinal;                // if grf & IMPORT_OBJECT_ORDINAL
  1341.         WORD    Hint;
  1342.     };
  1343.     WORD    Type : 2;                   // IMPORT_TYPE
  1344.     WORD    NameType : 3;               // IMPORT_NAME_TYPE
  1345.     WORD    Reserved : 11;              // Reserved. Must be zero.
  1346. } IMPORT_OBJECT_HEADER;
  1347. typedef enum IMPORT_OBJECT_TYPE
  1348. {
  1349.     IMPORT_OBJECT_CODE = 0,
  1350.     IMPORT_OBJECT_DATA = 1,
  1351.     IMPORT_OBJECT_CONST = 2,
  1352. } IMPORT_OBJECT_TYPE;
  1353. typedef enum IMPORT_OBJECT_NAME_TYPE
  1354. {
  1355.     IMPORT_OBJECT_ORDINAL = 0,          // Import by ordinal
  1356.     IMPORT_OBJECT_NAME = 1,             // Import name == public symbol name.
  1357.     IMPORT_OBJECT_NAME_NO_PREFIX = 2,   // Import name == public symbol name skipping leading ?, @, or optionally _.
  1358.     IMPORT_OBJECT_NAME_UNDECORATE = 3,  // Import name == public symbol name skipping leading ?, @, or optionally _
  1359.                                         // and truncating at first @
  1360. } IMPORT_OBJECT_NAME_TYPE;
  1361. #ifndef __IMAGE_COR20_HEADER_DEFINED__
  1362. #define __IMAGE_COR20_HEADER_DEFINED__
  1363. typedef enum ReplacesCorHdrNumericDefines
  1364. {
  1365. // COM+ Header entry point flags.
  1366.     COMIMAGE_FLAGS_ILONLY               =0x00000001,
  1367.     COMIMAGE_FLAGS_32BITREQUIRED        =0x00000002,
  1368.     COMIMAGE_FLAGS_IL_LIBRARY           =0x00000004,
  1369.     COMIMAGE_FLAGS_TRACKDEBUGDATA       =0x00010000,
  1370. // Version flags for image.
  1371.     COR_VERSION_MAJOR_V2                =2,
  1372.     COR_VERSION_MAJOR                   =COR_VERSION_MAJOR_V2,
  1373.     COR_VERSION_MINOR                   =0,
  1374.     COR_DELETED_NAME_LENGTH             =8,
  1375.     COR_VTABLEGAP_NAME_LENGTH           =8,
  1376. // Maximum size of a NativeType descriptor.
  1377.     NATIVE_TYPE_MAX_CB                  =1,   
  1378.     COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,
  1379. // #defines for the MIH FLAGS
  1380.     IMAGE_COR_MIH_METHODRVA             =0x01,
  1381.     IMAGE_COR_MIH_EHRVA                 =0x02,    
  1382.     IMAGE_COR_MIH_BASICBLOCK            =0x08,
  1383. // V-table constants
  1384.     COR_VTABLE_32BIT                    =0x01,          // V-table slots are 32-bits in size.   
  1385.     COR_VTABLE_64BIT                    =0x02,          // V-table slots are 64-bits in size.   
  1386.     COR_VTABLE_FROM_UNMANAGED           =0x04,          // If set, transition from unmanaged.
  1387.     COR_VTABLE_CALL_MOST_DERIVED        =0x10,          // Call most derived method described by
  1388. // EATJ constants
  1389.     IMAGE_COR_EATJ_THUNK_SIZE           =32,            // Size of a jump thunk reserved range.
  1390. // Max name lengths    
  1391.     //@todo: Change to unlimited name lengths.
  1392.     MAX_CLASS_NAME                      =1024,
  1393.     MAX_PACKAGE_NAME                    =1024,
  1394. } ReplacesCorHdrNumericDefines;
  1395. // COM+ 2.0 header structure.
  1396. typedef struct IMAGE_COR20_HEADER
  1397. {
  1398.     // Header versioning
  1399.     DWORD                   cb;              
  1400.     WORD                    MajorRuntimeVersion;
  1401.     WORD                    MinorRuntimeVersion;
  1402.     
  1403.     // Symbol table and startup information
  1404.     IMAGE_DATA_DIRECTORY    MetaData;        
  1405.     DWORD                   Flags;           
  1406.     DWORD                   EntryPointToken;
  1407.     
  1408.     // Binding information
  1409.     IMAGE_DATA_DIRECTORY    Resources;
  1410.     IMAGE_DATA_DIRECTORY    StrongNameSignature;
  1411.     // Regular fixup and binding information
  1412.     IMAGE_DATA_DIRECTORY    CodeManagerTable;
  1413.     IMAGE_DATA_DIRECTORY    VTableFixups;
  1414.     IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;
  1415.     // Precompiled image info (internal use only - set to zero)
  1416.     IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
  1417.     
  1418. } IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;
  1419. #endif // __IMAGE_COR20_HEADER_DEFINED__
  1420. //
  1421. // End Image Format
  1422. //
  1423. //
  1424. // for move macros
  1425. //
  1426. #ifdef _MAC
  1427. #ifndef _INC_STRING
  1428. #include <string.h>
  1429. #endif /* _INC_STRING */
  1430. #else
  1431. #include <string.h>
  1432. #endif // _MAC
  1433. #ifndef _SLIST_HEADER_
  1434. #define _SLIST_HEADER_
  1435. #define SLIST_ENTRY SINGLE_LIST_ENTRY
  1436. #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
  1437. #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
  1438. #if defined(_WIN64)
  1439. typedef struct DECLSPEC_ALIGN(16) _SLIST_HEADER {
  1440.     ULONGLONG Alignment;
  1441.     ULONGLONG Region;
  1442. } SLIST_HEADER;
  1443. typedef struct _SLIST_HEADER *PSLIST_HEADER;
  1444. #else
  1445. typedef union _SLIST_HEADER {
  1446.     ULONGLONG Alignment;
  1447.     struct {
  1448.         SLIST_ENTRY Next;
  1449.         WORD   Depth;
  1450.         WORD   Sequence;
  1451.     };
  1452. } SLIST_HEADER, *PSLIST_HEADER;
  1453. #endif
  1454. #endif
  1455. NTSYSAPI
  1456. VOID
  1457. NTAPI
  1458. RtlInitializeSListHead (
  1459.     IN PSLIST_HEADER ListHead
  1460.     );
  1461. NTSYSAPI
  1462. PSLIST_ENTRY
  1463. RtlFirstEntrySList (
  1464.     IN const SLIST_HEADER *ListHead
  1465.     );
  1466. NTSYSAPI
  1467. PSLIST_ENTRY
  1468. NTAPI
  1469. RtlInterlockedPopEntrySList (
  1470.     IN PSLIST_HEADER ListHead
  1471.     );
  1472. NTSYSAPI
  1473. PSLIST_ENTRY
  1474. NTAPI
  1475. RtlInterlockedPushEntrySList (
  1476.     IN PSLIST_HEADER ListHead,
  1477.     IN PSLIST_ENTRY ListEntry
  1478.     );
  1479. NTSYSAPI
  1480. PSLIST_ENTRY
  1481. NTAPI
  1482. RtlInterlockedFlushSList (
  1483.     IN PSLIST_HEADER ListHead
  1484.     );
  1485. NTSYSAPI
  1486. WORD  
  1487. NTAPI
  1488. RtlQueryDepthSList (
  1489.     IN PSLIST_HEADER ListHead
  1490.     );
  1491. #define HEAP_NO_SERIALIZE               0x00000001      
  1492. #define HEAP_GROWABLE                   0x00000002      
  1493. #define HEAP_GENERATE_EXCEPTIONS        0x00000004      
  1494. #define HEAP_ZERO_MEMORY                0x00000008      
  1495. #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010      
  1496. #define HEAP_TAIL_CHECKING_ENABLED      0x00000020      
  1497. #define HEAP_FREE_CHECKING_ENABLED      0x00000040      
  1498. #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080      
  1499. #define HEAP_CREATE_ALIGN_16            0x00010000      
  1500. #define HEAP_CREATE_ENABLE_TRACING      0x00020000      
  1501. #define HEAP_MAXIMUM_TAG                0x0FFF              
  1502. #define HEAP_PSEUDO_TAG_FLAG            0x8000              
  1503. #define HEAP_TAG_SHIFT                  18                  
  1504. #define HEAP_MAKE_TAG_FLAGS( b, o ) ((DWORD)((b) + ((o) << 18)))  
  1505. #define IS_TEXT_UNICODE_ASCII16               0x0001
  1506. #define IS_TEXT_UNICODE_REVERSE_ASCII16       0x0010
  1507. #define IS_TEXT_UNICODE_STATISTICS            0x0002
  1508. #define IS_TEXT_UNICODE_REVERSE_STATISTICS    0x0020
  1509. #define IS_TEXT_UNICODE_CONTROLS              0x0004
  1510. #define IS_TEXT_UNICODE_REVERSE_CONTROLS      0x0040
  1511. #define IS_TEXT_UNICODE_SIGNATURE             0x0008
  1512. #define IS_TEXT_UNICODE_REVERSE_SIGNATURE     0x0080
  1513. #define IS_TEXT_UNICODE_ILLEGAL_CHARS         0x0100
  1514. #define IS_TEXT_UNICODE_ODD_LENGTH            0x0200
  1515. #define IS_TEXT_UNICODE_DBCS_LEADBYTE         0x0400
  1516. #define IS_TEXT_UNICODE_NULL_BYTES            0x1000
  1517. #define IS_TEXT_UNICODE_UNICODE_MASK          0x000F
  1518. #define IS_TEXT_UNICODE_REVERSE_MASK          0x00F0
  1519. #define IS_TEXT_UNICODE_NOT_UNICODE_MASK      0x0F00
  1520. #define IS_TEXT_UNICODE_NOT_ASCII_MASK        0xF000
  1521. #define COMPRESSION_FORMAT_NONE          (0x0000)   
  1522. #define COMPRESSION_FORMAT_DEFAULT       (0x0001)   
  1523. #define COMPRESSION_FORMAT_LZNT1         (0x0002)   
  1524. #define COMPRESSION_ENGINE_STANDARD      (0x0000)   
  1525. #define COMPRESSION_ENGINE_MAXIMUM       (0x0100)   
  1526. #define COMPRESSION_ENGINE_HIBER         (0x0200)   
  1527. NTSYSAPI
  1528. SIZE_T
  1529. NTAPI
  1530. RtlCompareMemory (
  1531.     const VOID *Source1,
  1532.     const VOID *Source2,
  1533.     SIZE_T Length
  1534.     );
  1535. #if defined(_M_AMD64) || defined(_M_IA64)
  1536. #define RtlEqualMemory(Source1, Source2, Length) 
  1537.     ((Length) == RtlCompareMemory(Source1, Source2, Length))
  1538. NTSYSAPI
  1539. VOID
  1540. NTAPI
  1541. RtlCopyMemory (
  1542.    VOID UNALIGNED *Destination,
  1543.    CONST VOID UNALIGNED *Source,
  1544.    SIZE_T Length
  1545.    );
  1546. #if !defined(_M_AMD64)
  1547. NTSYSAPI
  1548. VOID
  1549. NTAPI
  1550. RtlCopyMemory32 (
  1551.    VOID UNALIGNED *Destination,
  1552.    CONST VOID UNALIGNED *Source,
  1553.    DWORD Length
  1554.    );
  1555. #endif
  1556. NTSYSAPI
  1557. VOID
  1558. NTAPI
  1559. RtlMoveMemory (
  1560.    VOID UNALIGNED *Destination,
  1561.    CONST VOID UNALIGNED *Source,
  1562.    SIZE_T Length
  1563.    );
  1564. NTSYSAPI
  1565. VOID
  1566. NTAPI
  1567. RtlFillMemory (
  1568.    VOID UNALIGNED *Destination,
  1569.    SIZE_T Length,
  1570.    BYTE  Fill
  1571.    );
  1572. NTSYSAPI
  1573. VOID
  1574. NTAPI
  1575. RtlZeroMemory (
  1576.    VOID UNALIGNED *Destination,
  1577.    SIZE_T Length
  1578.    );
  1579. #else
  1580. #define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
  1581. #define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
  1582. #define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
  1583. #define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
  1584. #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
  1585. #endif
  1586. typedef struct _MESSAGE_RESOURCE_ENTRY {
  1587.     WORD   Length;
  1588.     WORD   Flags;
  1589.     BYTE  Text[ 1 ];
  1590. } MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
  1591. #define MESSAGE_RESOURCE_UNICODE 0x0001
  1592. typedef struct _MESSAGE_RESOURCE_BLOCK {
  1593.     DWORD LowId;
  1594.     DWORD HighId;
  1595.     DWORD OffsetToEntries;
  1596. } MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
  1597. typedef struct _MESSAGE_RESOURCE_DATA {
  1598.     DWORD NumberOfBlocks;
  1599.     MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
  1600. } MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
  1601. typedef struct _OSVERSIONINFOA {
  1602.     DWORD dwOSVersionInfoSize;
  1603.     DWORD dwMajorVersion;
  1604.     DWORD dwMinorVersion;
  1605.     DWORD dwBuildNumber;
  1606.     DWORD dwPlatformId;
  1607.     CHAR   szCSDVersion[ 128 ];     // Maintenance string for PSS usage
  1608. } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
  1609. typedef struct _OSVERSIONINFOW {
  1610.     DWORD dwOSVersionInfoSize;
  1611.     DWORD dwMajorVersion;
  1612.     DWORD dwMinorVersion;
  1613.     DWORD dwBuildNumber;
  1614.     DWORD dwPlatformId;
  1615.     WCHAR  szCSDVersion[ 128 ];     // Maintenance string for PSS usage
  1616. } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
  1617. #ifdef UNICODE
  1618. typedef OSVERSIONINFOW OSVERSIONINFO;
  1619. typedef POSVERSIONINFOW POSVERSIONINFO;
  1620. typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
  1621. #else
  1622. typedef OSVERSIONINFOA OSVERSIONINFO;
  1623. typedef POSVERSIONINFOA POSVERSIONINFO;
  1624. typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
  1625. #endif // UNICODE
  1626. typedef struct _OSVERSIONINFOEXA {
  1627.     DWORD dwOSVersionInfoSize;
  1628.     DWORD dwMajorVersion;
  1629.     DWORD dwMinorVersion;
  1630.     DWORD dwBuildNumber;
  1631.     DWORD dwPlatformId;
  1632.     CHAR   szCSDVersion[ 128 ];     // Maintenance string for PSS usage
  1633.     WORD   wServicePackMajor;
  1634.     WORD   wServicePackMinor;
  1635.     WORD   wSuiteMask;
  1636.     BYTE  wProductType;
  1637.     BYTE  wReserved;
  1638. } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
  1639. typedef struct _OSVERSIONINFOEXW {
  1640.     DWORD dwOSVersionInfoSize;
  1641.     DWORD dwMajorVersion;
  1642.     DWORD dwMinorVersion;
  1643.     DWORD dwBuildNumber;
  1644.     DWORD dwPlatformId;
  1645.     WCHAR  szCSDVersion[ 128 ];     // Maintenance string for PSS usage
  1646.     WORD   wServicePackMajor;
  1647.     WORD   wServicePackMinor;
  1648.     WORD   wSuiteMask;
  1649.     BYTE  wProductType;
  1650.     BYTE  wReserved;
  1651. } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
  1652. #ifdef UNICODE
  1653. typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
  1654. typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
  1655. typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
  1656. #else
  1657. typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
  1658. typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
  1659. typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
  1660. #endif // UNICODE
  1661. //
  1662. // RtlVerifyVersionInfo() conditions
  1663. //
  1664. #define VER_EQUAL                       1
  1665. #define VER_GREATER                     2
  1666. #define VER_GREATER_EQUAL               3
  1667. #define VER_LESS                        4
  1668. #define VER_LESS_EQUAL                  5
  1669. #define VER_AND                         6
  1670. #define VER_OR                          7
  1671. #define VER_CONDITION_MASK              7
  1672. #define VER_NUM_BITS_PER_CONDITION_MASK 3
  1673. //
  1674. // RtlVerifyVersionInfo() type mask bits
  1675. //
  1676. #define VER_MINORVERSION                0x0000001
  1677. #define VER_MAJORVERSION                0x0000002
  1678. #define VER_BUILDNUMBER                 0x0000004
  1679. #define VER_PLATFORMID                  0x0000008
  1680. #define VER_SERVICEPACKMINOR            0x0000010
  1681. #define VER_SERVICEPACKMAJOR            0x0000020
  1682. #define VER_SUITENAME                   0x0000040
  1683. #define VER_PRODUCT_TYPE                0x0000080
  1684. //
  1685. // RtlVerifyVersionInfo() os product type values
  1686. //
  1687. #define VER_NT_WORKSTATION              0x0000001
  1688. #define VER_NT_DOMAIN_CONTROLLER        0x0000002
  1689. #define VER_NT_SERVER                   0x0000003
  1690. //
  1691. // dwPlatformId defines:
  1692. //
  1693. #define VER_PLATFORM_WIN32s             0
  1694. #define VER_PLATFORM_WIN32_WINDOWS      1
  1695. #define VER_PLATFORM_WIN32_NT           2
  1696. //
  1697. //
  1698. // VerifyVersionInfo() macro to set the condition mask
  1699. //
  1700. // For documentation sakes here's the old version of the macro that got
  1701. // changed to call an API
  1702. // #define VER_SET_CONDITION(_m_,_t_,_c_)  _m_=(_m_|(_c_<<(1<<_t_)))
  1703. //
  1704. #define VER_SET_CONDITION(_m_,_t_,_c_)  
  1705.         ((_m_)=VerSetConditionMask((_m_),(_t_),(_c_)))
  1706. ULONGLONG
  1707. NTAPI
  1708. VerSetConditionMask(
  1709.         IN  ULONGLONG   ConditionMask,
  1710.         IN  DWORD   TypeMask,
  1711.         IN  BYTE    Condition
  1712.         );
  1713. //
  1714. typedef struct _RTL_CRITICAL_SECTION_DEBUG {
  1715.     WORD   Type;
  1716.     WORD   CreatorBackTraceIndex;
  1717.     struct _RTL_CRITICAL_SECTION *CriticalSection;
  1718.     LIST_ENTRY ProcessLocksList;
  1719.     DWORD EntryCount;
  1720.     DWORD ContentionCount;
  1721.     DWORD Spare[ 2 ];
  1722. } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
  1723. #define RTL_CRITSECT_TYPE 0
  1724. #define RTL_RESOURCE_TYPE 1
  1725. typedef struct _RTL_CRITICAL_SECTION {
  1726.     PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
  1727.     //
  1728.     //  The following three fields control entering and exiting the critical
  1729.     //  section for the resource
  1730.     //
  1731.     LONG LockCount;
  1732.     LONG RecursionCount;
  1733.     HANDLE OwningThread;        // from the thread's ClientId->UniqueThread
  1734.     HANDLE LockSemaphore;
  1735.     ULONG_PTR SpinCount;        // force size on 64-bit systems when packed
  1736. } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
  1737. typedef VOID (* RTL_VERIFIER_DLL_LOAD_CALLBACK) (
  1738.     PWSTR DllName,
  1739.     PVOID DllBase,
  1740.     SIZE_T DllSize,
  1741.     PVOID Reserved
  1742.     );
  1743. typedef VOID (* RTL_VERIFIER_DLL_UNLOAD_CALLBACK) (
  1744.     PWSTR DllName,
  1745.     PVOID DllBase,
  1746.     SIZE_T DllSize,
  1747.     PVOID Reserved
  1748.     );
  1749. typedef struct _RTL_VERIFIER_THUNK_DESCRIPTOR {
  1750.     PCHAR ThunkName;
  1751.     PVOID ThunkOldAddress;
  1752.     PVOID ThunkNewAddress;
  1753. } RTL_VERIFIER_THUNK_DESCRIPTOR, *PRTL_VERIFIER_THUNK_DESCRIPTOR;
  1754. typedef struct _RTL_VERIFIER_DLL_DESCRIPTOR {
  1755.     PWCHAR DllName;
  1756.     DWORD DllFlags;
  1757.     PVOID DllAddress;
  1758.     PRTL_VERIFIER_THUNK_DESCRIPTOR DllThunks;
  1759. } RTL_VERIFIER_DLL_DESCRIPTOR, *PRTL_VERIFIER_DLL_DESCRIPTOR;
  1760. typedef struct _RTL_VERIFIER_PROVIDER_DESCRIPTOR {
  1761.     //
  1762.     // Filled by verifier provider DLL
  1763.     // 
  1764.     DWORD Length;        
  1765.     PRTL_VERIFIER_DLL_DESCRIPTOR ProviderDlls;
  1766.     RTL_VERIFIER_DLL_LOAD_CALLBACK ProviderDllLoadCallback;
  1767.     RTL_VERIFIER_DLL_UNLOAD_CALLBACK ProviderDllUnloadCallback;
  1768.     
  1769.     //
  1770.     // Filled by verifier engine
  1771.     //
  1772.         
  1773.     PWSTR VerifierImage;
  1774.     DWORD VerifierFlags;
  1775.     DWORD VerifierDebug;
  1776. } RTL_VERIFIER_PROVIDER_DESCRIPTOR, *PRTL_VERIFIER_PROVIDER_DESCRIPTOR;
  1777. //
  1778. // Application verifier standard flags
  1779. //
  1780. #define RTL_VRF_FLG_FULL_PAGE_HEAP     0x0001
  1781. #define RTL_VRF_FLG_LOCK_CHECKS        0x0002
  1782. #define RTL_VRF_FLG_HANDLE_CHECKS      0x0004
  1783. #define RTL_VRF_FLG_STACK_CHECKS       0x0008
  1784. #define RTL_VRF_FLG_APPCOMPAT_CHECKS   0x0010
  1785. //
  1786. // Application verifier standard stop codes
  1787. //
  1788. #define APPLICATION_VERIFIER_INTERNAL_ERROR               0x80000000
  1789. #define APPLICATION_VERIFIER_INTERNAL_WARNING             0x40000000
  1790. #define APPLICATION_VERIFIER_NO_BREAK                     0x20000000
  1791. #define APPLICATION_VERIFIER_RESERVED_BIT_28              0x10000000
  1792. #define APPLICATION_VERIFIER_UNKNOWN_ERROR                0x0001
  1793. #define APPLICATION_VERIFIER_ACCESS_VIOLATION             0x0002
  1794. #define APPLICATION_VERIFIER_UNSYNCHRONIZED_ACCESS        0x0003
  1795. #define APPLICATION_VERIFIER_EXTREME_SIZE_REQUEST         0x0004
  1796. #define APPLICATION_VERIFIER_BAD_HEAP_HANDLE              0x0005
  1797. #define APPLICATION_VERIFIER_SWITCHED_HEAP_HANDLE         0x0006
  1798. #define APPLICATION_VERIFIER_DOUBLE_FREE                  0x0007
  1799. #define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK         0x0008
  1800. #define APPLICATION_VERIFIER_DESTROY_PROCESS_HEAP         0x0009
  1801. #define APPLICATION_VERIFIER_UNEXPECTED_EXCEPTION         0x000A
  1802. #define APPLICATION_VERIFIER_STACK_OVERFLOW               0x000B
  1803. #define APPLICATION_VERIFIER_TERMINATE_THREAD_CALL        0x0100
  1804. #define APPLICATION_VERIFIER_EXIT_THREAD_OWNS_LOCK        0x0200
  1805. #define APPLICATION_VERIFIER_LOCK_IN_UNLOADED_DLL         0x0201
  1806. #define APPLICATION_VERIFIER_LOCK_IN_FREED_HEAP           0x0202
  1807. #define APPLICATION_VERIFIER_LOCK_DOUBLE_INITIALIZE       0x0203
  1808. #define APPLICATION_VERIFIER_LOCK_IN_FREED_MEMORY         0x0204
  1809. #define APPLICATION_VERIFIER_LOCK_CORRUPTED               0x0205
  1810. #define APPLICATION_VERIFIER_LOCK_INVALID_OWNER           0x0206
  1811. #define APPLICATION_VERIFIER_LOCK_INVALID_RECURSION_COUNT 0x0207
  1812. #define APPLICATION_VERIFIER_LOCK_INVALID_LOCK_COUNT      0x0208
  1813. #define APPLICATION_VERIFIER_LOCK_OVER_RELEASED           0x0209
  1814. #define APPLICATION_VERIFIER_LOCK_NOT_INITIALIZED         0x0210
  1815. #define APPLICATION_VERIFIER_INVALID_HANDLE               0x0300
  1816. #define VERIFIER_STOP(Code, Msg, P1, S1, P2, S2, P3, S3, P4, S4) {  
  1817.         RtlApplicationVerifierStop ((Code),                         
  1818.                                     (Msg),                          
  1819.                                     (ULONG_PTR)(P1),(S1),           
  1820.                                     (ULONG_PTR)(P2),(S2),           
  1821.                                     (ULONG_PTR)(P3),(S3),           
  1822.                                     (ULONG_PTR)(P4),(S4));          
  1823.   }
  1824. VOID
  1825. RtlApplicationVerifierStop (
  1826.     ULONG_PTR Code,
  1827.     PCHAR Message,
  1828.     ULONG_PTR Param1, PCHAR Description1,
  1829.     ULONG_PTR Param2, PCHAR Description2,
  1830.     ULONG_PTR Param3, PCHAR Description3,
  1831.     ULONG_PTR Param4, PCHAR Description4
  1832.     );
  1833. typedef LONG (NTAPI *PVECTORED_EXCEPTION_HANDLER)(
  1834.     struct _EXCEPTION_POINTERS *ExceptionInfo
  1835.     );
  1836. #define SEF_DACL_AUTO_INHERIT             0x01
  1837. #define SEF_SACL_AUTO_INHERIT             0x02
  1838. #define SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT 0x04
  1839. #define SEF_AVOID_PRIVILEGE_CHECK         0x08
  1840. #define SEF_AVOID_OWNER_CHECK             0x10
  1841. #define SEF_DEFAULT_OWNER_FROM_PARENT     0x20
  1842. #define SEF_DEFAULT_GROUP_FROM_PARENT     0x40
  1843. typedef enum _HEAP_INFORMATION_CLASS {
  1844.     HeapCompatibilityInformation
  1845. } HEAP_INFORMATION_CLASS;
  1846. DWORD   
  1847. RtlSetHeapInformation (
  1848.     IN PVOID HeapHandle,
  1849.     IN HEAP_INFORMATION_CLASS HeapInformationClass,
  1850.     IN PVOID HeapInformation OPTIONAL,
  1851.     IN SIZE_T HeapInformationLength OPTIONAL
  1852.     );
  1853. DWORD   
  1854. RtlQueryHeapInformation (
  1855.     IN PVOID HeapHandle,
  1856.     IN HEAP_INFORMATION_CLASS HeapInformationClass,
  1857.     OUT PVOID HeapInformation OPTIONAL,
  1858.     IN SIZE_T HeapInformationLength OPTIONAL,
  1859.     OUT PSIZE_T ReturnLength OPTIONAL
  1860.     );
  1861. #define WT_EXECUTEDEFAULT       0x00000000                           
  1862. #define WT_EXECUTEINIOTHREAD    0x00000001                           
  1863. #define WT_EXECUTEINUITHREAD    0x00000002                           
  1864. #define WT_EXECUTEINWAITTHREAD  0x00000004                           
  1865. #define WT_EXECUTEONLYONCE      0x00000008                           
  1866. #define WT_EXECUTEINTIMERTHREAD 0x00000020                           
  1867. #define WT_EXECUTELONGFUNCTION  0x00000010                           
  1868. #define WT_EXECUTEINPERSISTENTIOTHREAD  0x00000040                   
  1869. #define WT_EXECUTEINPERSISTENTTHREAD 0x00000080                      
  1870. #define WT_SET_MAX_THREADPOOL_THREADS(Flags, Limit)  ((Flags) |= (Limit)<<16) 
  1871. typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );   
  1872. typedef VOID (NTAPI * WORKERCALLBACKFUNC) (PVOID );                 
  1873. typedef VOID (NTAPI * APC_CALLBACK_FUNCTION) (DWORD   , PVOID, PVOID); 
  1874. #define WT_EXECUTEINLONGTHREAD  0x00000010                           
  1875. #define WT_EXECUTEDELETEWAIT    0x00000008                           
  1876. typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {
  1877.     ActivationContextBasicInformation                       = 1,
  1878.     ActivationContextDetailedInformation                    = 2,
  1879.     AssemblyDetailedInformationInActivationContext          = 3,
  1880.     FileInformationInAssemblyOfAssemblyInActivationContext  = 4,
  1881.     MaxActivationContextInfoClass,
  1882.     //
  1883.     // compatibility with old names
  1884.     //
  1885.     AssemblyDetailedInformationInActivationContxt           = 3,
  1886.     FileInformationInAssemblyOfAssemblyInActivationContxt   = 4
  1887. } ACTIVATION_CONTEXT_INFO_CLASS;
  1888. #define ACTIVATIONCONTEXTINFOCLASS ACTIVATION_CONTEXT_INFO_CLASS
  1889. typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {
  1890.     DWORD ulAssemblyIndex; 
  1891.     DWORD ulFileIndexInAssembly; 
  1892. } ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;
  1893. typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;
  1894. #define ACTIVATION_CONTEXT_PATH_TYPE_NONE (1)
  1895. #define ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE (2)
  1896. #define ACTIVATION_CONTEXT_PATH_TYPE_URL (3)
  1897. #define ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF (4)
  1898. typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
  1899.     DWORD ulFlags;
  1900.     DWORD ulFilenameLength;
  1901.     DWORD ulPathLength; 
  1902.     PCWSTR lpFileName;
  1903.     PCWSTR lpFilePath;   
  1904. } ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;
  1905. typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
  1906. //
  1907. // compatibility with old names
  1908. // The new names use "file" consistently.
  1909. //
  1910. #define  _ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION  _ASSEMBLY_FILE_DETAILED_INFORMATION
  1911. #define   ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION   ASSEMBLY_FILE_DETAILED_INFORMATION
  1912. #define  PASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION  PASSEMBLY_FILE_DETAILED_INFORMATION
  1913. #define PCASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PCASSEMBLY_FILE_DETAILED_INFORMATION
  1914. typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
  1915.     DWORD ulFlags;
  1916.     DWORD ulEncodedAssemblyIdentityLength;      // in bytes
  1917.     DWORD ulManifestPathType;                   // ACTIVATION_CONTEXT_PATH_TYPE_*
  1918.     DWORD ulManifestPathLength;                 // in bytes
  1919.     LARGE_INTEGER liManifestLastWriteTime;      // FILETIME
  1920.     DWORD ulPolicyPathType;                     // ACTIVATION_CONTEXT_PATH_TYPE_*
  1921.     DWORD ulPolicyPathLength;                   // in bytes
  1922.     LARGE_INTEGER liPolicyLastWriteTime;        // FILETIME
  1923.     DWORD ulMetadataSatelliteRosterIndex;
  1924.     
  1925.     DWORD ulManifestVersionMajor;               // 1
  1926.     DWORD ulManifestVersionMinor;               // 0
  1927.     DWORD ulPolicyVersionMajor;                 // 0
  1928.     DWORD ulPolicyVersionMinor;                 // 0
  1929.     DWORD ulAssemblyDirectoryNameLength;        // in bytes
  1930.     PCWSTR lpAssemblyEncodedAssemblyIdentity;
  1931.     PCWSTR lpAssemblyManifestPath;
  1932.     PCWSTR lpAssemblyPolicyPath;
  1933.     PCWSTR lpAssemblyDirectoryName;
  1934.     DWORD  ulFileCount;
  1935. } ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
  1936. typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;
  1937. typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
  1938.     DWORD dwFlags;
  1939.     DWORD ulFormatVersion;
  1940.     DWORD ulAssemblyCount;
  1941.     DWORD ulRootManifestPathType;
  1942.     DWORD ulRootManifestPathChars;
  1943.     DWORD ulRootConfigurationPathType;
  1944.     DWORD ulRootConfigurationPathChars;
  1945.     DWORD ulAppDirPathType;
  1946.     DWORD ulAppDirPathChars;
  1947.     PCWSTR lpRootManifestPath;
  1948.     PCWSTR lpRootConfigurationPath;
  1949.     PCWSTR lpAppDirPath;
  1950. } ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
  1951. typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
  1952. #define DLL_PROCESS_ATTACH   1    
  1953. #define DLL_THREAD_ATTACH    2    
  1954. #define DLL_THREAD_DETACH    3    
  1955. #define DLL_PROCESS_DETACH   0    
  1956. #define DLL_PROCESS_VERIFIER 4    
  1957. //
  1958. // Defines for the READ flags for Eventlogging
  1959. //
  1960. #define EVENTLOG_SEQUENTIAL_READ        0x0001
  1961. #define EVENTLOG_SEEK_READ              0x0002
  1962. #define EVENTLOG_FORWARDS_READ          0x0004
  1963. #define EVENTLOG_BACKWARDS_READ         0x0008
  1964. //
  1965. // The types of events that can be logged.
  1966. //
  1967. #define EVENTLOG_SUCCESS                0x0000
  1968. #define EVENTLOG_ERROR_TYPE             0x0001
  1969. #define EVENTLOG_WARNING_TYPE           0x0002
  1970. #define EVENTLOG_INFORMATION_TYPE       0x0004
  1971. #define EVENTLOG_AUDIT_SUCCESS          0x0008
  1972. #define EVENTLOG_AUDIT_FAILURE          0x0010
  1973. //
  1974. // Defines for the WRITE flags used by Auditing for paired events
  1975. // These are not implemented in Product 1
  1976. //
  1977. #define EVENTLOG_START_PAIRED_EVENT    0x0001
  1978. #define EVENTLOG_END_PAIRED_EVENT      0x0002
  1979. #define EVENTLOG_END_ALL_PAIRED_EVENTS 0x0004
  1980. #define EVENTLOG_PAIRED_EVENT_ACTIVE   0x0008
  1981. #define EVENTLOG_PAIRED_EVENT_INACTIVE 0x0010
  1982. //
  1983. // Structure that defines the header of the Eventlog record. This is the
  1984. // fixed-sized portion before all the variable-length strings, binary
  1985. // data and pad bytes.
  1986. //
  1987. // TimeGenerated is the time it was generated at the client.
  1988. // TimeWritten is the time it was put into the log at the server end.
  1989. //
  1990. typedef struct _EVENTLOGRECORD {
  1991.     DWORD  Length;        // Length of full record
  1992.     DWORD  Reserved;      // Used by the service
  1993.     DWORD  RecordNumber;  // Absolute record number
  1994.     DWORD  TimeGenerated; // Seconds since 1-1-1970
  1995.     DWORD  TimeWritten;   // Seconds since 1-1-1970
  1996.     DWORD  EventID;
  1997.     WORD   EventType;
  1998.     WORD   NumStrings;
  1999.     WORD   EventCategory;
  2000.     WORD   ReservedFlags; // For use with paired events (auditing)
  2001.     DWORD  ClosingRecordNumber; // For use with paired events (auditing)
  2002.     DWORD  StringOffset;  // Offset from beginning of record
  2003.     DWORD  UserSidLength;
  2004.     DWORD  UserSidOffset;
  2005.     DWORD  DataLength;
  2006.     DWORD  DataOffset;    // Offset from beginning of record
  2007.     //
  2008.     // Then follow:
  2009.     //
  2010.     // WCHAR SourceName[]
  2011.     // WCHAR Computername[]
  2012.     // SID   UserSid
  2013.     // WCHAR Strings[]
  2014.     // BYTE  Data[]
  2015.     // CHAR  Pad[]
  2016.     // DWORD Length;
  2017.     //
  2018. } EVENTLOGRECORD, *PEVENTLOGRECORD;
  2019. //SS: start of changes to support clustering
  2020. //SS: ideally the
  2021. #define MAXLOGICALLOGNAMESIZE   256
  2022. #if _MSC_VER >= 1200
  2023. #pragma warning(push)
  2024. #endif
  2025. #pragma warning(disable : 4200)
  2026. typedef struct _EVENTSFORLOGFILE{
  2027. DWORD ulSize;
  2028.     WCHAR    szLogicalLogFile[MAXLOGICALLOGNAMESIZE];        //name of the logical file-security/application/system
  2029.     DWORD ulNumRecords;
  2030. EVENTLOGRECORD  pEventLogRecords[];
  2031. }EVENTSFORLOGFILE, *PEVENTSFORLOGFILE;
  2032. typedef struct _PACKEDEVENTINFO{
  2033.     DWORD               ulSize;  //total size of the structure
  2034.     DWORD               ulNumEventsForLogFile; //number of EventsForLogFile structure that follow
  2035.     DWORD  ulOffsets[];           //the offsets from the start of this structure to the EVENTSFORLOGFILE structure
  2036. }PACKEDEVENTINFO, *PPACKEDEVENTINFO;
  2037. #if _MSC_VER >= 1200
  2038. #pragma warning(pop)
  2039. #else
  2040. #pragma warning(default : 4200)
  2041. #endif
  2042. //SS: end of changes to support clustering
  2043. //
  2044. // begin_ntddk begin_wdm begin_nthal
  2045. //
  2046. // Registry Specific Access Rights.
  2047. //
  2048. #define KEY_QUERY_VALUE         (0x0001)
  2049. #define KEY_SET_VALUE           (0x0002)
  2050. #define KEY_CREATE_SUB_KEY      (0x0004)
  2051. #define KEY_ENUMERATE_SUB_KEYS  (0x0008)
  2052. #define KEY_NOTIFY              (0x0010)
  2053. #define KEY_CREATE_LINK         (0x0020)
  2054. #define KEY_WOW64_32KEY         (0x0200)
  2055. #define KEY_WOW64_64KEY         (0x0100)
  2056. #define KEY_WOW64_RES           (0x0300)
  2057. #define KEY_READ                ((STANDARD_RIGHTS_READ       |
  2058.                                   KEY_QUERY_VALUE            |
  2059.                                   KEY_ENUMERATE_SUB_KEYS     |
  2060.                                   KEY_NOTIFY)                 
  2061.                                   &                           
  2062.                                  (~SYNCHRONIZE))
  2063. #define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |
  2064.                                   KEY_SET_VALUE              |
  2065.                                   KEY_CREATE_SUB_KEY)         
  2066.                                   &                           
  2067.                                  (~SYNCHRONIZE))
  2068. #define KEY_EXECUTE             ((KEY_READ)                   
  2069.                                   &                           
  2070.                                  (~SYNCHRONIZE))
  2071. #define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |
  2072.                                   KEY_QUERY_VALUE            |
  2073.                                   KEY_SET_VALUE              |
  2074.                                   KEY_CREATE_SUB_KEY         |
  2075.                                   KEY_ENUMERATE_SUB_KEYS     |
  2076.                                   KEY_NOTIFY                 |
  2077.                                   KEY_CREATE_LINK)            
  2078.                                   &                           
  2079.                                  (~SYNCHRONIZE))
  2080. //
  2081. // Open/Create Options
  2082. //
  2083. #define REG_OPTION_RESERVED         (0x00000000L)   // Parameter is reserved
  2084. #define REG_OPTION_NON_VOLATILE     (0x00000000L)   // Key is preserved
  2085.                                                     // when system is rebooted
  2086. #define REG_OPTION_VOLATILE         (0x00000001L)   // Key is not preserved
  2087.                                                     // when system is rebooted
  2088. #define REG_OPTION_CREATE_LINK      (0x00000002L)   // Created key is a
  2089.                                                     // symbolic link
  2090. #define REG_OPTION_BACKUP_RESTORE   (0x00000004L)   // open for backup or restore
  2091.                                                     // special access rules
  2092.                                                     // privilege required
  2093. #define REG_OPTION_OPEN_LINK        (0x00000008L)   // Open symbolic link
  2094. #define REG_LEGAL_OPTION            
  2095.                 (REG_OPTION_RESERVED            |
  2096.                  REG_OPTION_NON_VOLATILE        |
  2097.                  REG_OPTION_VOLATILE            |
  2098.                  REG_OPTION_CREATE_LINK         |
  2099.                  REG_OPTION_BACKUP_RESTORE      |
  2100.                  REG_OPTION_OPEN_LINK)
  2101. //
  2102. // Key creation/open disposition
  2103. //
  2104. #define REG_CREATED_NEW_KEY         (0x00000001L)   // New Registry Key created
  2105. #define REG_OPENED_EXISTING_KEY     (0x00000002L)   // Existing Key opened
  2106. //
  2107. // hive format to be used by Reg(Nt)SaveKeyEx
  2108. //
  2109. #define REG_STANDARD_FORMAT     1
  2110. #define REG_LATEST_FORMAT       2
  2111. #define REG_NO_COMPRESSION      4
  2112. //
  2113. // Key restore flags
  2114. //
  2115. #define REG_WHOLE_HIVE_VOLATILE     (0x00000001L)   // Restore whole hive volatile
  2116. #define REG_REFRESH_HIVE            (0x00000002L)   // Unwind changes to last flush
  2117. #define REG_NO_LAZY_FLUSH           (0x00000004L)   // Never lazy flush this hive
  2118. #define REG_FORCE_RESTORE           (0x00000008L)   // Force the restore process even when we have open handles on subkeys
  2119. // end_ntddk end_wdm end_nthal
  2120. //
  2121. // Notify filter values
  2122. //
  2123. #define REG_NOTIFY_CHANGE_NAME          (0x00000001L) // Create or delete (child)
  2124. #define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)
  2125. #define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L) // time stamp
  2126. #define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)
  2127. #define REG_LEGAL_CHANGE_FILTER                 
  2128.                 (REG_NOTIFY_CHANGE_NAME          |
  2129.                  REG_NOTIFY_CHANGE_ATTRIBUTES    |
  2130.                  REG_NOTIFY_CHANGE_LAST_SET      |
  2131.                  REG_NOTIFY_CHANGE_SECURITY)
  2132. //
  2133. //
  2134. // Predefined Value Types.
  2135. //
  2136. #define REG_NONE                    ( 0 )   // No value type
  2137. #define REG_SZ                      ( 1 )   // Unicode nul terminated string
  2138. #define REG_EXPAND_SZ               ( 2 )   // Unicode nul terminated string
  2139.                                             // (with environment variable references)
  2140. #define REG_BINARY                  ( 3 )   // Free form binary
  2141. #define REG_DWORD                   ( 4 )   // 32-bit number
  2142. #define REG_DWORD_LITTLE_ENDIAN     ( 4 )   // 32-bit number (same as REG_DWORD)
  2143. #define REG_DWORD_BIG_ENDIAN        ( 5 )   // 32-bit number
  2144. #define REG_LINK                    ( 6 )   // Symbolic Link (unicode)
  2145. #define REG_MULTI_SZ                ( 7 )   // Multiple Unicode strings
  2146. #define REG_RESOURCE_LIST           ( 8 )   // Resource list in the resource map
  2147. #define REG_FULL_RESOURCE_DESCRIPTOR ( 9 )  // Resource list in the hardware description
  2148. #define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )
  2149. #define REG_QWORD                   ( 11 )  // 64-bit number
  2150. #define REG_QWORD_LITTLE_ENDIAN     ( 11 )  // 64-bit number (same as REG_QWORD)
  2151. // end_ntddk end_wdm end_nthal
  2152. // begin_ntddk begin_wdm begin_nthal
  2153. //
  2154. // Service Types (Bit Mask)
  2155. //
  2156. #define SERVICE_KERNEL_DRIVER          0x00000001
  2157. #define SERVICE_FILE_SYSTEM_DRIVER     0x00000002
  2158. #define SERVICE_ADAPTER                0x00000004
  2159. #define SERVICE_RECOGNIZER_DRIVER      0x00000008
  2160. #define SERVICE_DRIVER                 (SERVICE_KERNEL_DRIVER | 
  2161.                                         SERVICE_FILE_SYSTEM_DRIVER | 
  2162.                                         SERVICE_RECOGNIZER_DRIVER)
  2163. #define SERVICE_WIN32_OWN_PROCESS      0x00000010
  2164. #define SERVICE_WIN32_SHARE_PROCESS    0x00000020
  2165. #define SERVICE_WIN32                  (SERVICE_WIN32_OWN_PROCESS | 
  2166.                                         SERVICE_WIN32_SHARE_PROCESS)
  2167. #define SERVICE_INTERACTIVE_PROCESS    0x00000100
  2168. #define SERVICE_TYPE_ALL               (SERVICE_WIN32  | 
  2169.                                         SERVICE_ADAPTER | 
  2170.                                         SERVICE_DRIVER  | 
  2171.                                         SERVICE_INTERACTIVE_PROCESS)
  2172. //
  2173. // Start Type
  2174. //
  2175. #define SERVICE_BOOT_START             0x00000000
  2176. #define SERVICE_SYSTEM_START           0x00000001
  2177. #define SERVICE_AUTO_START             0x00000002
  2178. #define SERVICE_DEMAND_START           0x00000003
  2179. #define SERVICE_DISABLED               0x00000004
  2180. //
  2181. // Error control type
  2182. //
  2183. #define SERVICE_ERROR_IGNORE           0x00000000
  2184. #define SERVICE_ERROR_NORMAL           0x00000001
  2185. #define SERVICE_ERROR_SEVERE           0x00000002
  2186. #define SERVICE_ERROR_CRITICAL         0x00000003
  2187. //
  2188. //
  2189. // Define the registry driver node enumerations
  2190. //
  2191. typedef enum _CM_SERVICE_NODE_TYPE {
  2192.     DriverType               = SERVICE_KERNEL_DRIVER,
  2193.     FileSystemType           = SERVICE_FILE_SYSTEM_DRIVER,
  2194.     Win32ServiceOwnProcess   = SERVICE_WIN32_OWN_PROCESS,
  2195.     Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
  2196.     AdapterType              = SERVICE_ADAPTER,
  2197.     RecognizerType           = SERVICE_RECOGNIZER_DRIVER
  2198. } SERVICE_NODE_TYPE;
  2199. typedef enum _CM_SERVICE_LOAD_TYPE {
  2200.     BootLoad    = SERVICE_BOOT_START,
  2201.     SystemLoad  = SERVICE_SYSTEM_START,
  2202.     AutoLoad    = SERVICE_AUTO_START,
  2203.     DemandLoad  = SERVICE_DEMAND_START,
  2204.     DisableLoad = SERVICE_DISABLED
  2205. } SERVICE_LOAD_TYPE;
  2206. typedef enum _CM_ERROR_CONTROL_TYPE {
  2207.     IgnoreError   = SERVICE_ERROR_IGNORE,
  2208.     NormalError   = SERVICE_ERROR_NORMAL,
  2209.     SevereError   = SERVICE_ERROR_SEVERE,
  2210.     CriticalError = SERVICE_ERROR_CRITICAL
  2211. } SERVICE_ERROR_TYPE;
  2212. //
  2213. // IOCTL_TAPE_ERASE definitions
  2214. //
  2215. #define TAPE_ERASE_SHORT            0L
  2216. #define TAPE_ERASE_LONG             1L
  2217. typedef struct _TAPE_ERASE {
  2218.     DWORD Type;
  2219.     BOOLEAN Immediate;
  2220. } TAPE_ERASE, *PTAPE_ERASE;
  2221. //
  2222. // IOCTL_TAPE_PREPARE definitions
  2223. //
  2224. #define TAPE_LOAD                   0L
  2225. #define TAPE_UNLOAD                 1L
  2226. #define TAPE_TENSION                2L
  2227. #define TAPE_LOCK                   3L
  2228. #define TAPE_UNLOCK                 4L
  2229. #define TAPE_FORMAT                 5L
  2230. typedef struct _TAPE_PREPARE {
  2231.     DWORD Operation;
  2232.     BOOLEAN Immediate;
  2233. } TAPE_PREPARE, *PTAPE_PREPARE;
  2234. //
  2235. // IOCTL_TAPE_WRITE_MARKS definitions
  2236. //
  2237. #define TAPE_SETMARKS               0L
  2238. #define TAPE_FILEMARKS              1L
  2239. #define TAPE_SHORT_FILEMARKS        2L
  2240. #define TAPE_LONG_FILEMARKS         3L
  2241. typedef struct _TAPE_WRITE_MARKS {
  2242.     DWORD Type;
  2243.     DWORD Count;
  2244.     BOOLEAN Immediate;
  2245. } TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;
  2246. //
  2247. // IOCTL_TAPE_GET_POSITION definitions
  2248. //
  2249. #define TAPE_ABSOLUTE_POSITION       0L
  2250. #define TAPE_LOGICAL_POSITION        1L
  2251. #define TAPE_PSEUDO_LOGICAL_POSITION 2L
  2252. typedef struct _TAPE_GET_POSITION {
  2253.     DWORD Type;
  2254.     DWORD Partition;
  2255.     LARGE_INTEGER Offset;
  2256. } TAPE_GET_POSITION, *PTAPE_GET_POSITION;
  2257. //
  2258. // IOCTL_TAPE_SET_POSITION definitions
  2259. //
  2260. #define TAPE_REWIND                 0L
  2261. #define TAPE_ABSOLUTE_BLOCK         1L
  2262. #define TAPE_LOGICAL_BLOCK          2L
  2263. #define TAPE_PSEUDO_LOGICAL_BLOCK   3L
  2264. #define TAPE_SPACE_END_OF_DATA      4L
  2265. #define TAPE_SPACE_RELATIVE_BLOCKS  5L
  2266. #define TAPE_SPACE_FILEMARKS        6L
  2267. #define TAPE_SPACE_SEQUENTIAL_FMKS  7L
  2268. #define TAPE_SPACE_SETMARKS         8L
  2269. #define TAPE_SPACE_SEQUENTIAL_SMKS  9L
  2270. typedef struct _TAPE_SET_POSITION {
  2271.     DWORD Method;
  2272.     DWORD Partition;
  2273.     LARGE_INTEGER Offset;
  2274.     BOOLEAN Immediate;
  2275. } TAPE_SET_POSITION, *PTAPE_SET_POSITION;
  2276. //
  2277. // IOCTL_TAPE_GET_DRIVE_PARAMS definitions
  2278. //
  2279. //
  2280. // Definitions for FeaturesLow parameter
  2281. //
  2282. #define TAPE_DRIVE_FIXED            0x00000001
  2283. #define TAPE_DRIVE_SELECT           0x00000002
  2284. #define TAPE_DRIVE_INITIATOR        0x00000004
  2285. #define TAPE_DRIVE_ERASE_SHORT      0x00000010
  2286. #define TAPE_DRIVE_ERASE_LONG       0x00000020
  2287. #define TAPE_DRIVE_ERASE_BOP_ONLY   0x00000040
  2288. #define TAPE_DRIVE_ERASE_IMMEDIATE  0x00000080
  2289. #define TAPE_DRIVE_TAPE_CAPACITY    0x00000100
  2290. #define TAPE_DRIVE_TAPE_REMAINING   0x00000200
  2291. #define TAPE_DRIVE_FIXED_BLOCK      0x00000400
  2292. #define TAPE_DRIVE_VARIABLE_BLOCK   0x00000800
  2293. #define TAPE_DRIVE_WRITE_PROTECT    0x00001000
  2294. #define TAPE_DRIVE_EOT_WZ_SIZE      0x00002000
  2295. #define TAPE_DRIVE_ECC              0x00010000
  2296. #define TAPE_DRIVE_COMPRESSION      0x00020000
  2297. #define TAPE_DRIVE_PADDING          0x00040000
  2298. #define TAPE_DRIVE_REPORT_SMKS      0x00080000
  2299. #define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x00100000
  2300. #define TAPE_DRIVE_GET_LOGICAL_BLK  0x00200000
  2301. #define TAPE_DRIVE_SET_EOT_WZ_SIZE  0x00400000
  2302. #define TAPE_DRIVE_EJECT_MEDIA      0x01000000
  2303. #define TAPE_DRIVE_CLEAN_REQUESTS   0x02000000
  2304. #define TAPE_DRIVE_SET_CMP_BOP_ONLY 0x04000000
  2305. #define TAPE_DRIVE_RESERVED_BIT     0x80000000  //don't use this bit!
  2306. //                                              //can't be a low features bit!
  2307. //                                              //reserved; high features only
  2308. //
  2309. // Definitions for FeaturesHigh parameter
  2310. //
  2311. #define TAPE_DRIVE_LOAD_UNLOAD      0x80000001
  2312. #define TAPE_DRIVE_TENSION          0x80000002
  2313. #define TAPE_DRIVE_LOCK_UNLOCK      0x80000004
  2314. #define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008
  2315. #define TAPE_DRIVE_SET_BLOCK_SIZE   0x80000010
  2316. #define TAPE_DRIVE_LOAD_UNLD_IMMED  0x80000020
  2317. #define TAPE_DRIVE_TENSION_IMMED    0x80000040
  2318. #define TAPE_DRIVE_LOCK_UNLK_IMMED  0x80000080
  2319. #define TAPE_DRIVE_SET_ECC          0x80000100
  2320. #define TAPE_DRIVE_SET_COMPRESSION  0x80000200
  2321. #define TAPE_DRIVE_SET_PADDING      0x80000400
  2322. #define TAPE_DRIVE_SET_REPORT_SMKS  0x80000800
  2323. #define TAPE_DRIVE_ABSOLUTE_BLK     0x80001000
  2324. #define TAPE_DRIVE_ABS_BLK_IMMED    0x80002000
  2325. #define TAPE_DRIVE_LOGICAL_BLK      0x80004000
  2326. #define TAPE_DRIVE_LOG_BLK_IMMED    0x80008000
  2327. #define TAPE_DRIVE_END_OF_DATA      0x80010000
  2328. #define TAPE_DRIVE_RELATIVE_BLKS    0x80020000
  2329. #define TAPE_DRIVE_FILEMARKS        0x80040000
  2330. #define TAPE_DRIVE_SEQUENTIAL_FMKS  0x80080000
  2331. #define TAPE_DRIVE_SETMARKS         0x80100000
  2332. #define TAPE_DRIVE_SEQUENTIAL_SMKS  0x80200000
  2333. #define TAPE_DRIVE_REVERSE_POSITION 0x80400000
  2334. #define TAPE_DRIVE_SPACE_IMMEDIATE  0x80800000
  2335. #define TAPE_DRIVE_WRITE_SETMARKS   0x81000000
  2336. #define TAPE_DRIVE_WRITE_FILEMARKS  0x82000000
  2337. #define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000
  2338. #define TAPE_DRIVE_WRITE_LONG_FMKS  0x88000000
  2339. #define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000
  2340. #define TAPE_DRIVE_FORMAT           0xA0000000
  2341. #define TAPE_DRIVE_FORMAT_IMMEDIATE 0xC0000000
  2342. #define TAPE_DRIVE_HIGH_FEATURES    0x80000000  //mask for high features flag
  2343. typedef struct _TAPE_GET_DRIVE_PARAMETERS {
  2344.     BOOLEAN ECC;
  2345.     BOOLEAN Compression;
  2346.     BOOLEAN DataPadding;
  2347.     BOOLEAN ReportSetmarks;
  2348.     DWORD DefaultBlockSize;
  2349.     DWORD MaximumBlockSize;
  2350.     DWORD MinimumBlockSize;
  2351.     DWORD MaximumPartitionCount;
  2352.     DWORD FeaturesLow;
  2353.     DWORD FeaturesHigh;
  2354.     DWORD EOTWarningZoneSize;
  2355. } TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;
  2356. //
  2357. // IOCTL_TAPE_SET_DRIVE_PARAMETERS definitions
  2358. //
  2359. typedef struct _TAPE_SET_DRIVE_PARAMETERS {
  2360.     BOOLEAN ECC;
  2361.     BOOLEAN Compression;
  2362.     BOOLEAN DataPadding;
  2363.     BOOLEAN ReportSetmarks;
  2364.     DWORD EOTWarningZoneSize;
  2365. } TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;
  2366. //
  2367. // IOCTL_TAPE_GET_MEDIA_PARAMETERS definitions
  2368. //
  2369. typedef struct _TAPE_GET_MEDIA_PARAMETERS {
  2370.     LARGE_INTEGER Capacity;
  2371.     LARGE_INTEGER Remaining;
  2372.     DWORD BlockSize;
  2373.     DWORD PartitionCount;
  2374.     BOOLEAN WriteProtected;
  2375. } TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;
  2376. //
  2377. // IOCTL_TAPE_SET_MEDIA_PARAMETERS definitions
  2378. //
  2379. typedef struct _TAPE_SET_MEDIA_PARAMETERS {
  2380.     DWORD BlockSize;
  2381. } TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;
  2382. //
  2383. // IOCTL_TAPE_CREATE_PARTITION definitions
  2384. //
  2385. #define TAPE_FIXED_PARTITIONS       0L
  2386. #define TAPE_SELECT_PARTITIONS      1L
  2387. #define TAPE_INITIATOR_PARTITIONS   2L
  2388. typedef struct _TAPE_CREATE_PARTITION {
  2389.     DWORD Method;
  2390.     DWORD Count;
  2391.     DWORD Size;
  2392. } TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;
  2393. //
  2394. // WMI Methods
  2395. //
  2396. #define TAPE_QUERY_DRIVE_PARAMETERS       0L
  2397. #define TAPE_QUERY_MEDIA_CAPACITY         1L
  2398. #define TAPE_CHECK_FOR_DRIVE_PROBLEM      2L
  2399. #define TAPE_QUERY_IO_ERROR_DATA          3L
  2400. #define TAPE_QUERY_DEVICE_ERROR_DATA      4L
  2401. typedef struct _TAPE_WMI_OPERATIONS {
  2402.    DWORD Method;
  2403.    DWORD DataBufferSize;
  2404.    PVOID DataBuffer;
  2405. } TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
  2406. //
  2407. // Type of drive errors
  2408. //
  2409. typedef enum _TAPE_DRIVE_PROBLEM_TYPE {
  2410.    TapeDriveProblemNone, TapeDriveReadWriteWarning,
  2411.    TapeDriveReadWriteError, TapeDriveReadWarning,
  2412.    TapeDriveWriteWarning, TapeDriveReadError,
  2413.    TapeDriveWriteError, TapeDriveHardwareError,
  2414.    TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError,
  2415.    TapeDriveTimetoClean, TapeDriveCleanDriveNow,
  2416.    TapeDriveMediaLifeExpired, TapeDriveSnappedTape
  2417. } TAPE_DRIVE_PROBLEM_TYPE;
  2418. #if defined(_M_AMD64) && !defined(__midl)
  2419. __forceinline
  2420. PVOID
  2421. GetCurrentFiber (
  2422.     VOID
  2423.     )
  2424. {
  2425.     return (PVOID)__readgsqword(FIELD_OFFSET(NT_TIB, FiberData));
  2426. }
  2427. __forceinline
  2428. PVOID
  2429. GetFiberData (
  2430.     VOID
  2431.     )
  2432. {
  2433.     return *(PVOID *)GetCurrentFiber();
  2434. }
  2435. #endif // _M_AMD64 && !defined(__midl)
  2436. #if (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100) || ISOLATION_AWARE_ENABLED // winnt_only
  2437. #define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION         (1)
  2438. #define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION              (2)
  2439. #define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION     (3)
  2440. #define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION       (4)
  2441. #define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION    (5)
  2442. #define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION (6)
  2443. #define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION       (7)
  2444. #define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE   (8)
  2445. #endif // winnt_only
  2446. #ifdef __cplusplus
  2447. }
  2448. #endif
  2449. #endif /* _WINNT_ */