|
|
1.1 ! root 1: /*++ BUILD Version: 0004 // Increment this if a change has global effects ! 2: ! 3: Copyright (c) 1989 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: ntimage.h ! 8: ! 9: Abstract: ! 10: ! 11: This is the include file that describes all image structures. ! 12: ! 13: Author: ! 14: ! 15: Mike O'Leary (mikeol) 21-Mar-1991 ! 16: ! 17: Revision History: ! 18: ! 19: --*/ ! 20: ! 21: #ifndef _NTIMAGE_ ! 22: #define _NTIMAGE_ ! 23: ! 24: // ! 25: // Define the linker version number. This is temporary to aid ! 26: // in debugging with people trying to load images built with ! 27: // an older linker. This is not required in the final product. ! 28: // ! 29: ! 30: #define IMAGE_MAJOR_LINKER_VERSION 2 ! 31: ! 32: // begin_winnt ! 33: ! 34: ! 35: // ! 36: // Image Format ! 37: // ! 38: ! 39: #ifndef RC_INVOKED ! 40: #pragma pack (1) ! 41: #endif // !RC_INVOKED ! 42: ! 43: #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ ! 44: #define IMAGE_OS2_SIGNATURE 0x454E // NE ! 45: #define IMAGE_OS2_SIGNATURE_LE 0x454C // LE ! 46: #define IMAGE_NT_SIGNATURE 0x00004550 // PE00 ! 47: ! 48: typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header ! 49: USHORT e_magic; // Magic number ! 50: USHORT e_cblp; // Bytes on last page of file ! 51: USHORT e_cp; // Pages in file ! 52: USHORT e_crlc; // Relocations ! 53: USHORT e_cparhdr; // Size of header in paragraphs ! 54: USHORT e_minalloc; // Minimum extra paragraphs needed ! 55: USHORT e_maxalloc; // Maximum extra paragraphs needed ! 56: USHORT e_ss; // Initial (relative) SS value ! 57: USHORT e_sp; // Initial SP value ! 58: USHORT e_csum; // Checksum ! 59: USHORT e_ip; // Initial IP value ! 60: USHORT e_cs; // Initial (relative) CS value ! 61: USHORT e_lfarlc; // File address of relocation table ! 62: USHORT e_ovno; // Overlay number ! 63: USHORT e_res[4]; // Reserved words ! 64: USHORT e_oemid; // OEM identifier (for e_oeminfo) ! 65: USHORT e_oeminfo; // OEM information; e_oemid specific ! 66: USHORT e_res2[10]; // Reserved words ! 67: LONG e_lfanew; // File address of new exe header ! 68: } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; ! 69: ! 70: typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header ! 71: USHORT ne_magic; // Magic number ! 72: CHAR ne_ver; // Version number ! 73: CHAR ne_rev; // Revision number ! 74: USHORT ne_enttab; // Offset of Entry Table ! 75: USHORT ne_cbenttab; // Number of bytes in Entry Table ! 76: LONG ne_crc; // Checksum of whole file ! 77: USHORT ne_flags; // Flag word ! 78: USHORT ne_autodata; // Automatic data segment number ! 79: USHORT ne_heap; // Initial heap allocation ! 80: USHORT ne_stack; // Initial stack allocation ! 81: LONG ne_csip; // Initial CS:IP setting ! 82: LONG ne_sssp; // Initial SS:SP setting ! 83: USHORT ne_cseg; // Count of file segments ! 84: USHORT ne_cmod; // Entries in Module Reference Table ! 85: USHORT ne_cbnrestab; // Size of non-resident name table ! 86: USHORT ne_segtab; // Offset of Segment Table ! 87: USHORT ne_rsrctab; // Offset of Resource Table ! 88: USHORT ne_restab; // Offset of resident name table ! 89: USHORT ne_modtab; // Offset of Module Reference Table ! 90: USHORT ne_imptab; // Offset of Imported Names Table ! 91: LONG ne_nrestab; // Offset of Non-resident Names Table ! 92: USHORT ne_cmovent; // Count of movable entries ! 93: USHORT ne_align; // Segment alignment shift count ! 94: USHORT ne_cres; // Count of resource segments ! 95: UCHAR ne_exetyp; // Target Operating system ! 96: UCHAR ne_flagsothers; // Other .EXE flags ! 97: USHORT ne_pretthunks; // offset to return thunks ! 98: USHORT ne_psegrefbytes; // offset to segment ref. bytes ! 99: USHORT ne_swaparea; // Minimum code swap area size ! 100: USHORT ne_expver; // Expected Windows version number ! 101: } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER; ! 102: ! 103: // ! 104: // File header format. ! 105: // ! 106: ! 107: typedef struct _IMAGE_FILE_HEADER { ! 108: USHORT Machine; ! 109: USHORT NumberOfSections; ! 110: ULONG TimeDateStamp; ! 111: ULONG PointerToSymbolTable; ! 112: ULONG NumberOfSymbols; ! 113: USHORT SizeOfOptionalHeader; ! 114: USHORT Characteristics; ! 115: } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; ! 116: ! 117: #define IMAGE_SIZEOF_FILE_HEADER 20 ! 118: ! 119: #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file. ! 120: #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references). ! 121: #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file. ! 122: #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file. ! 123: #define IMAGE_FILE_MINIMAL_OBJECT 0x0010 // Reserved. ! 124: #define IMAGE_FILE_UPDATE_OBJECT 0x0020 // Reserved. ! 125: #define IMAGE_FILE_16BIT_MACHINE 0x0040 // 16 bit word machine. ! 126: #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed. ! 127: #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine. ! 128: #define IMAGE_FILE_PATCH 0x0400 // Reserved. ! 129: #define IMAGE_FILE_SYSTEM 0x1000 // System File. ! 130: #define IMAGE_FILE_DLL 0x2000 // File is a DLL. ! 131: #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed. ! 132: ! 133: #define IMAGE_FILE_MACHINE_UNKNOWN 0 ! 134: #define IMAGE_FILE_MACHINE_I860 0x14d // Intel 860. ! 135: #define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386. ! 136: #define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian ! 137: #define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian ! 138: ! 139: // ! 140: // Directory format. ! 141: // ! 142: ! 143: typedef struct _IMAGE_DATA_DIRECTORY { ! 144: ULONG VirtualAddress; ! 145: ULONG Size; ! 146: } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; ! 147: ! 148: #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 ! 149: ! 150: // ! 151: // Optional header format. ! 152: // ! 153: ! 154: typedef struct _IMAGE_OPTIONAL_HEADER { ! 155: // ! 156: // Standard fields. ! 157: // ! 158: ! 159: USHORT Magic; ! 160: UCHAR MajorLinkerVersion; ! 161: UCHAR MinorLinkerVersion; ! 162: ULONG SizeOfCode; ! 163: ULONG SizeOfInitializedData; ! 164: ULONG SizeOfUninitializedData; ! 165: ULONG AddressOfEntryPoint; ! 166: ULONG BaseOfCode; ! 167: ULONG BaseOfData; ! 168: ! 169: // ! 170: // NT additional fields. ! 171: // ! 172: ! 173: ULONG ImageBase; ! 174: ULONG SectionAlignment; ! 175: ULONG FileAlignment; ! 176: USHORT MajorOperatingSystemVersion; ! 177: USHORT MinorOperatingSystemVersion; ! 178: USHORT MajorImageVersion; ! 179: USHORT MinorImageVersion; ! 180: USHORT MajorSubsystemVersion; ! 181: USHORT MinorSubsystemVersion; ! 182: ULONG Reserved1; ! 183: ULONG SizeOfImage; ! 184: ULONG SizeOfHeaders; ! 185: ULONG CheckSum; ! 186: USHORT Subsystem; ! 187: USHORT DllCharacteristics; ! 188: ULONG SizeOfStackReserve; ! 189: ULONG SizeOfStackCommit; ! 190: ULONG SizeOfHeapReserve; ! 191: ULONG SizeOfHeapCommit; ! 192: ULONG AddressOfTlsIndex; ! 193: ULONG NumberOfRvaAndSizes; ! 194: IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; ! 195: } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; ! 196: ! 197: #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 ! 198: #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224 ! 199: ! 200: typedef struct _IMAGE_NT_HEADERS { ! 201: ULONG Signature; ! 202: IMAGE_FILE_HEADER FileHeader; ! 203: IMAGE_OPTIONAL_HEADER OptionalHeader; ! 204: } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; ! 205: ! 206: #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \ ! 207: ((ULONG)ntheader + \ ! 208: FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \ ! 209: ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \ ! 210: )) ! 211: ! 212: ! 213: // Subsystem Values ! 214: ! 215: #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem. ! 216: #define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem. ! 217: #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem. ! 218: #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem. ! 219: #define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem. ! 220: #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image run in the Posix character subsystem. ! 221: ! 222: // Dll Characteristics ! 223: ! 224: #define IMAGE_LIBRARY_PROCESS_INIT 1 // Dll has a process initialization routine. ! 225: #define IMAGE_LIBRARY_PROCESS_TERM 2 // Dll has a thread termination routine. ! 226: #define IMAGE_LIBRARY_THREAD_INIT 4 // Dll has a thread initialization routine. ! 227: #define IMAGE_LIBRARY_THREAD_TERM 8 // Dll has a thread termination routine. ! 228: ! 229: // Directory Entries ! 230: ! 231: #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory ! 232: #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory ! 233: #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory ! 234: #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory ! 235: #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory ! 236: #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table ! 237: #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory ! 238: #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String ! 239: #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP) ! 240: #define IMAGE_DIRECTORY_ENTRY_THREAD_SPACE 9 // Thread Local Storage ! 241: #define IMAGE_DIRECTORY_ENTRY_CALLBACKS 10 // Other interesting entrypoints ! 242: ! 243: // ! 244: // Section header format. ! 245: // ! 246: ! 247: #define IMAGE_SIZEOF_SHORT_NAME 8 ! 248: ! 249: typedef struct _IMAGE_SECTION_HEADER { ! 250: UCHAR Name[IMAGE_SIZEOF_SHORT_NAME]; ! 251: union { ! 252: ULONG PhysicalAddress; ! 253: ULONG VirtualSize; ! 254: } Misc; ! 255: ULONG VirtualAddress; ! 256: ULONG SizeOfRawData; ! 257: ULONG PointerToRawData; ! 258: ULONG PointerToRelocations; ! 259: ULONG PointerToLinenumbers; ! 260: USHORT NumberOfRelocations; ! 261: USHORT NumberOfLinenumbers; ! 262: ULONG Characteristics; ! 263: } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; ! 264: ! 265: #define IMAGE_SIZEOF_SECTION_HEADER 40 ! 266: ! 267: #define IMAGE_SCN_TYPE_REGULAR 0x00000000 // ! 268: #define IMAGE_SCN_TYPE_DUMMY 0x00000001 // Reserved. ! 269: #define IMAGE_SCN_TYPE_NO_LOAD 0x00000002 // ! 270: #define IMAGE_SCN_TYPE_GROUPED 0x00000004 // Used for 16-bit offset code. ! 271: #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Specifies if section should not be padded to next boundary. ! 272: #define IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved. ! 273: #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code. ! 274: #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data. ! 275: #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. ! 276: #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. ! 277: #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information. ! 278: #define IMAGE_SCN_LNK_OVERLAY 0x00000400 // Section contains an overlay. ! 279: #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. ! 280: #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat. ! 281: #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded. ! 282: #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable. ! 283: #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable. ! 284: #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable. ! 285: #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable. ! 286: #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable. ! 287: #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable. ! 288: ! 289: // ! 290: // Symbol format. ! 291: // ! 292: ! 293: typedef struct _IMAGE_SYMBOL { ! 294: union { ! 295: UCHAR ShortName[8]; ! 296: struct { ! 297: ULONG Short; // if 0, use LongName ! 298: ULONG Long; // offset into string table ! 299: } Name; ! 300: PUCHAR LongName[2]; ! 301: } N; ! 302: ULONG Value; ! 303: SHORT SectionNumber; ! 304: USHORT Type; ! 305: UCHAR StorageClass; ! 306: UCHAR NumberOfAuxSymbols; ! 307: } IMAGE_SYMBOL; ! 308: typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL; ! 309: ! 310: #define IMAGE_SIZEOF_SYMBOL 18 ! 311: ! 312: // ! 313: // Section values. ! 314: // ! 315: // Symbols have a section number of the section in which they are ! 316: // defined. Otherwise, section numbers have the following meanings: ! 317: // ! 318: ! 319: #define IMAGE_SYM_UNDEFINED (SHORT)0 // Symbol is undefined or is common. ! 320: #define IMAGE_SYM_ABSOLUTE (SHORT)-1 // Symbol is an absolute value. ! 321: #define IMAGE_SYM_DEBUG (SHORT)-2 // Symbol is a special debug item. ! 322: ! 323: // ! 324: // Type (fundamental) values. ! 325: // ! 326: ! 327: #define IMAGE_SYM_TYPE_NULL 0 // no type. ! 328: #define IMAGE_SYM_TYPE_VOID 1 // ! 329: #define IMAGE_SYM_TYPE_CHAR 2 // type character. ! 330: #define IMAGE_SYM_TYPE_SHORT 3 // type short integer. ! 331: #define IMAGE_SYM_TYPE_INT 4 // ! 332: #define IMAGE_SYM_TYPE_LONG 5 // ! 333: #define IMAGE_SYM_TYPE_FLOAT 6 // ! 334: #define IMAGE_SYM_TYPE_DOUBLE 7 // ! 335: #define IMAGE_SYM_TYPE_STRUCT 8 // ! 336: #define IMAGE_SYM_TYPE_UNION 9 // ! 337: #define IMAGE_SYM_TYPE_ENUM 10 // enumeration. ! 338: #define IMAGE_SYM_TYPE_MOE 11 // member of enumeration. ! 339: #define IMAGE_SYM_TYPE_UCHAR 12 // ! 340: #define IMAGE_SYM_TYPE_USHORT 13 // ! 341: #define IMAGE_SYM_TYPE_UINT 14 // ! 342: #define IMAGE_SYM_TYPE_ULONG 15 // ! 343: ! 344: // ! 345: // Type (derived) values. ! 346: // ! 347: ! 348: #define IMAGE_SYM_DTYPE_NULL 0 // no derived type. ! 349: #define IMAGE_SYM_DTYPE_POINTER 1 // pointer. ! 350: #define IMAGE_SYM_DTYPE_FUNCTION 2 // function. ! 351: #define IMAGE_SYM_DTYPE_ARRAY 3 // array. ! 352: ! 353: // ! 354: // Storage classes. ! 355: // ! 356: ! 357: #define IMAGE_SYM_CLASS_END_OF_FUNCTION (UCHAR)-1 ! 358: #define IMAGE_SYM_CLASS_NULL 0 ! 359: #define IMAGE_SYM_CLASS_AUTOMATIC 1 ! 360: #define IMAGE_SYM_CLASS_EXTERNAL 2 ! 361: #define IMAGE_SYM_CLASS_STATIC 3 ! 362: #define IMAGE_SYM_CLASS_REGISTER 4 ! 363: #define IMAGE_SYM_CLASS_EXTERNAL_DEF 5 ! 364: #define IMAGE_SYM_CLASS_LABEL 6 ! 365: #define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 ! 366: #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 ! 367: #define IMAGE_SYM_CLASS_ARGUMENT 9 ! 368: #define IMAGE_SYM_CLASS_STRUCT_TAG 10 ! 369: #define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 ! 370: #define IMAGE_SYM_CLASS_UNION_TAG 12 ! 371: #define IMAGE_SYM_CLASS_TYPE_DEFINITION 13 ! 372: #define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 ! 373: #define IMAGE_SYM_CLASS_ENUM_TAG 15 ! 374: #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 ! 375: #define IMAGE_SYM_CLASS_REGISTER_PARAM 17 ! 376: #define IMAGE_SYM_CLASS_BIT_FIELD 18 ! 377: #define IMAGE_SYM_CLASS_BLOCK 100 ! 378: #define IMAGE_SYM_CLASS_FUNCTION 101 ! 379: #define IMAGE_SYM_CLASS_END_OF_STRUCT 102 ! 380: #define IMAGE_SYM_CLASS_FILE 103 ! 381: // new ! 382: #define IMAGE_SYM_CLASS_SECTION 104 ! 383: #define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 ! 384: ! 385: // type packing constants ! 386: ! 387: #define N_BTMASK 017 ! 388: #define N_TMASK 060 ! 389: #define N_TMASK1 0300 ! 390: #define N_TMASK2 0360 ! 391: #define N_BTSHFT 4 ! 392: #define N_TSHIFT 2 ! 393: ! 394: // MACROS ! 395: ! 396: // Basic Type of x ! 397: #define BTYPE(x) ((x) & N_BTMASK) ! 398: ! 399: // Is x a pointer? ! 400: #ifndef ISPTR ! 401: #define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT)) ! 402: #endif ! 403: ! 404: // Is x a function? ! 405: #ifndef ISFCN ! 406: #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT)) ! 407: #endif ! 408: ! 409: // Is x an array? ! 410: ! 411: #ifndef ISARY ! 412: #define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT)) ! 413: #endif ! 414: ! 415: // Is x a structure, union, or enumeration TAG? ! 416: #ifndef ISTAG ! 417: #define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG) ! 418: #endif ! 419: ! 420: #ifndef INCREF ! 421: #define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|(x&N_BTMASK)) ! 422: #endif ! 423: #ifndef DECREF ! 424: #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK)) ! 425: #endif ! 426: ! 427: // ! 428: // Auxiliary entry format. ! 429: // ! 430: ! 431: typedef union _IMAGE_AUX_SYMBOL { ! 432: struct { ! 433: ULONG TagIndex; // struct, union, or enum tag index ! 434: union { ! 435: struct { ! 436: USHORT Linenumber; // declaration line number ! 437: USHORT Size; // size of struct, union, or enum ! 438: } LnSz; ! 439: ULONG TotalSize; ! 440: } Misc; ! 441: union { ! 442: struct { // if ISFCN, tag, or .bb ! 443: ULONG PointerToLinenumber; ! 444: ULONG PointerToNextFunction; ! 445: } Function; ! 446: struct { // if ISARY, up to 4 dimen. ! 447: USHORT Dimension[4]; ! 448: } Array; ! 449: } FcnAry; ! 450: USHORT TvIndex; // tv index ! 451: } Sym; ! 452: struct { ! 453: UCHAR Name[IMAGE_SIZEOF_SYMBOL]; ! 454: } File; ! 455: struct { ! 456: ULONG Length; // section length ! 457: USHORT NumberOfRelocations; // number of relocation entries ! 458: USHORT NumberOfLinenumbers; // number of line numbers ! 459: ULONG CheckSum; // checksum for communal ! 460: SHORT Number; // section number to associate with ! 461: UCHAR Selection; // communal selection type ! 462: } Section; ! 463: } IMAGE_AUX_SYMBOL; ! 464: typedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL; ! 465: ! 466: #define IMAGE_SIZEOF_AUX_SYMBOL 18 ! 467: ! 468: // ! 469: // Communal selection types. ! 470: // ! 471: ! 472: #define IMAGE_COMDAT_SELECT_UNKNOWN 0 ! 473: #define IMAGE_COMDAT_SELECT_NODUPLICATES 1 ! 474: #define IMAGE_COMDAT_SELECT_ANY 2 ! 475: #define IMAGE_COMDAT_SELECT_SAME_SIZE 3 ! 476: #define IMAGE_COMDAT_SELECT_EXACT_MATCH 4 ! 477: #define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 ! 478: ! 479: #define IMAGE_WEAK_EXTERN_SEARCH_UNKNOWN 0 ! 480: #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 ! 481: #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 ! 482: ! 483: ! 484: // ! 485: // Relocation format. ! 486: // ! 487: ! 488: typedef struct _IMAGE_RELOCATION { ! 489: ULONG VirtualAddress; ! 490: ULONG SymbolTableIndex; ! 491: USHORT Type; ! 492: } IMAGE_RELOCATION; ! 493: typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION; ! 494: ! 495: #define IMAGE_SIZEOF_RELOCATION 10 ! 496: ! 497: // ! 498: // I860 relocation types. ! 499: // ! 500: ! 501: #define IMAGE_REL_I860_ABSOLUTE 0 // Reference is absolute, no relocation is necessary ! 502: #define IMAGE_REL_I860_DIR32 06 // Direct 32-bit reference to the symbols virtual address ! 503: #define IMAGE_REL_I860_DIR32NB 07 ! 504: #define IMAGE_REL_I860_SECTION 012 ! 505: #define IMAGE_REL_I860_SECREL 013 ! 506: #define IMAGE_REL_I860_PAIR 034 ! 507: #define IMAGE_REL_I860_HIGH 036 ! 508: #define IMAGE_REL_I860_LOW0 037 ! 509: #define IMAGE_REL_I860_LOW1 040 ! 510: #define IMAGE_REL_I860_LOW2 041 ! 511: #define IMAGE_REL_I860_LOW3 042 ! 512: #define IMAGE_REL_I860_LOW4 043 ! 513: #define IMAGE_REL_I860_SPLIT0 044 ! 514: #define IMAGE_REL_I860_SPLIT1 045 ! 515: #define IMAGE_REL_I860_SPLIT2 046 ! 516: #define IMAGE_REL_I860_HIGHADJ 047 ! 517: #define IMAGE_REL_I860_BRADDR 050 ! 518: ! 519: // ! 520: // I386 relocation types. ! 521: // ! 522: ! 523: #define IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary ! 524: #define IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address ! 525: #define IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address ! 526: #define IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address ! 527: #define IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included ! 528: #define IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address ! 529: #define IMAGE_REL_I386_SECTION 012 ! 530: #define IMAGE_REL_I386_SECREL 013 ! 531: #define IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address ! 532: ! 533: // ! 534: // MIPS relocation types. ! 535: // ! 536: ! 537: #define IMAGE_REL_MIPS_ABSOLUTE 0 // Reference is absolute, no relocation is necessary ! 538: #define IMAGE_REL_MIPS_REFHALF 01 ! 539: #define IMAGE_REL_MIPS_REFWORD 02 ! 540: #define IMAGE_REL_MIPS_JMPADDR 03 ! 541: #define IMAGE_REL_MIPS_REFHI 04 ! 542: #define IMAGE_REL_MIPS_REFLO 05 ! 543: #define IMAGE_REL_MIPS_GPREL 06 ! 544: #define IMAGE_REL_MIPS_LITERAL 07 ! 545: #define IMAGE_REL_MIPS_SECTION 012 ! 546: #define IMAGE_REL_MIPS_SECREL 013 ! 547: #define IMAGE_REL_MIPS_REFWORDNB 042 ! 548: #define IMAGE_REL_MIPS_PAIR 045 ! 549: ! 550: // ! 551: // Based relocation format. ! 552: // ! 553: ! 554: typedef struct _IMAGE_BASE_RELOCATION { ! 555: ULONG VirtualAddress; ! 556: ULONG SizeOfBlock; ! 557: // USHORT TypeOffset[1]; ! 558: } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; ! 559: ! 560: #define IMAGE_SIZEOF_BASE_RELOCATION 8 ! 561: ! 562: // ! 563: // Based relocation types. ! 564: // ! 565: ! 566: #define IMAGE_REL_BASED_ABSOLUTE 0 ! 567: #define IMAGE_REL_BASED_HIGH 1 ! 568: #define IMAGE_REL_BASED_LOW 2 ! 569: #define IMAGE_REL_BASED_HIGHLOW 3 ! 570: #define IMAGE_REL_BASED_HIGHADJ 4 ! 571: #define IMAGE_REL_BASED_MIPS_JMPADDR 5 ! 572: #define IMAGE_REL_BASED_I860_BRADDR 6 ! 573: #define IMAGE_REL_BASED_I860_SPLIT 7 ! 574: ! 575: // ! 576: // Line number format. ! 577: // ! 578: ! 579: typedef struct _IMAGE_LINENUMBER { ! 580: union { ! 581: ULONG SymbolTableIndex; // Symbol table index of function name if Linenumber is 0. ! 582: ULONG VirtualAddress; // Virtual address of line number. ! 583: } Type; ! 584: USHORT Linenumber; // Line number. ! 585: } IMAGE_LINENUMBER; ! 586: typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER; ! 587: ! 588: #define IMAGE_SIZEOF_LINENUMBER 6 ! 589: ! 590: // ! 591: // Archive format. ! 592: // ! 593: ! 594: #define IMAGE_ARCHIVE_START_SIZE 8 ! 595: #define IMAGE_ARCHIVE_START "!<arch>\n" ! 596: #define IMAGE_ARCHIVE_END "`\n" ! 597: #define IMAGE_ARCHIVE_PAD "\n" ! 598: #define IMAGE_ARCHIVE_LINKER_MEMBER "/ " ! 599: #define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " ! 600: ! 601: typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER { ! 602: UCHAR Name[16]; // File member name - `/' terminated. ! 603: UCHAR Date[12]; // File member date - decimal. ! 604: UCHAR UserID[6]; // File member user id - decimal. ! 605: UCHAR GroupID[6]; // File member group id - decimal. ! 606: UCHAR Mode[8]; // File member mode - octal. ! 607: UCHAR Size[10]; // File member size - decimal. ! 608: UCHAR EndHeader[2]; // String to end header. ! 609: } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER; ! 610: ! 611: #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 ! 612: ! 613: // ! 614: // DLL support. ! 615: // ! 616: ! 617: // ! 618: // Export Format ! 619: // ! 620: ! 621: typedef struct _IMAGE_EXPORT_DIRECTORY { ! 622: ULONG Characteristics; ! 623: ULONG TimeDateStamp; ! 624: USHORT MajorVersion; ! 625: USHORT MinorVersion; ! 626: ULONG Name; ! 627: ULONG Base; ! 628: ULONG NumberOfFunctions; ! 629: ULONG NumberOfNames; ! 630: PULONG *AddressOfFunctions; ! 631: PULONG *AddressOfNames; ! 632: PUSHORT *AddressOfNameOrdinals; ! 633: } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; ! 634: ! 635: // ! 636: // Import Format ! 637: // ! 638: ! 639: typedef struct _IMAGE_IMPORT_BY_NAME { ! 640: USHORT Hint; ! 641: UCHAR Name[1]; ! 642: } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; ! 643: ! 644: typedef struct _IMAGE_THUNK_DATA { ! 645: union { ! 646: PULONG Function; ! 647: ULONG Ordinal; ! 648: PIMAGE_IMPORT_BY_NAME AddressOfData; ! 649: } u1; ! 650: } IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA; ! 651: ! 652: #define IMAGE_ORDINAL_FLAG 0x80000000 ! 653: #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0) ! 654: #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) ! 655: ! 656: typedef struct _IMAGE_IMPORT_DESCRIPTOR { ! 657: ULONG Characteristics; ! 658: ULONG TimeDateStamp; ! 659: USHORT MajorVersion; ! 660: USHORT MinorVersion; ! 661: ULONG Name; ! 662: PIMAGE_THUNK_DATA FirstThunk; ! 663: } IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR; ! 664: ! 665: // ! 666: // Resource Format. ! 667: // ! 668: ! 669: // ! 670: // Resource directory consists of two counts, following by a variable length ! 671: // array of directory entries. The first count is the number of entries at ! 672: // beginning of the array that have actual names associated with each entry. ! 673: // The entries are in ascending order, case insensitive strings. The second ! 674: // count is the number of entries that immediately follow the named entries. ! 675: // This second count identifies the number of entries that have 31-bit integer ! 676: // Ids as their name. These entries are also sorted in ascending order. ! 677: // ! 678: // This structure allows fast lookup by either name or number, but for any ! 679: // given resource entry only one form of lookup is supported, not both. ! 680: // This is consistant with the syntax of the .RC file and the .RES file. ! 681: // ! 682: ! 683: typedef struct _IMAGE_RESOURCE_DIRECTORY { ! 684: ULONG Characteristics; ! 685: ULONG TimeDateStamp; ! 686: USHORT MajorVersion; ! 687: USHORT MinorVersion; ! 688: USHORT NumberOfNamedEntries; ! 689: USHORT NumberOfIdEntries; ! 690: // IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; ! 691: } IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY; ! 692: ! 693: #define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000 ! 694: #define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000 ! 695: ! 696: // ! 697: // Each directory contains the 32-bit Name of the entry and an offset, ! 698: // relative to the beginning of the resource directory of the data associated ! 699: // with this directory entry. If the name of the entry is an actual text ! 700: // string instead of an integer Id, then the high order bit of the name field ! 701: // is set to one and the low order 31-bits are an offset, relative to the ! 702: // beginning of the resource directory of the string, which is of type ! 703: // IMAGE_RESOURCE_DIRECTORY_STRING. Otherwise the high bit is clear and the ! 704: // low-order 31-bits are the integer Id that identify this resource directory ! 705: // entry. If the directory entry is yet another resource directory (i.e. a ! 706: // subdirectory), then the high order bit of the offset field will be ! 707: // set to indicate this. Otherwise the high bit is clear and the offset ! 708: // field points to a resource data entry. ! 709: // ! 710: ! 711: typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY { ! 712: ULONG Name; ! 713: ULONG OffsetToData; ! 714: } IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY; ! 715: ! 716: // ! 717: // For resource directory entries that have actual string names, the Name ! 718: // field of the directory entry points to an object of the following type. ! 719: // All of these string objects are stored together after the last resource ! 720: // directory entry and before the first resource data object. This minimizes ! 721: // the impact of these variable length objects on the alignment of the fixed ! 722: // size directory entry objects. ! 723: // ! 724: ! 725: typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING { ! 726: USHORT Length; ! 727: CHAR NameString[ 1 ]; ! 728: } IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING; ! 729: ! 730: ! 731: typedef struct _IMAGE_RESOURCE_DIR_STRING_U { ! 732: USHORT Length; ! 733: WCHAR NameString[ 1 ]; ! 734: } IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U; ! 735: ! 736: ! 737: // ! 738: // Each resource data entry describes a leaf node in the resource directory ! 739: // tree. It contains an offset, relative to the beginning of the resource ! 740: // directory of the data for the resource, a size field that gives the number ! 741: // of bytes of data at that offset, a CodePage that should be used when ! 742: // decoding code point values within the resource data. Typically for new ! 743: // applications the code page would be the unicode code page. ! 744: // ! 745: ! 746: typedef struct _IMAGE_RESOURCE_DATA_ENTRY { ! 747: ULONG OffsetToData; ! 748: ULONG Size; ! 749: ULONG CodePage; ! 750: ULONG Reserved; ! 751: } IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY; ! 752: ! 753: // ! 754: // Debug Format ! 755: // ! 756: ! 757: typedef struct _IMAGE_DEBUG_DIRECTORY { ! 758: ULONG Characteristics; ! 759: ULONG TimeDateStamp; ! 760: USHORT MajorVersion; ! 761: USHORT MinorVersion; ! 762: ULONG Type; ! 763: ULONG SizeOfData; ! 764: ULONG AddressOfRawData; ! 765: ULONG PointerToRawData; ! 766: } IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY; ! 767: ! 768: #define IMAGE_DEBUG_TYPE_UNKNOWN 0 ! 769: #define IMAGE_DEBUG_TYPE_COFF 1 ! 770: #define IMAGE_DEBUG_TYPE_CODEVIEW 2 ! 771: ! 772: typedef struct _IMAGE_DEBUG_INFO { ! 773: ULONG NumberOfSymbols; ! 774: ULONG LvaToFirstSymbol; ! 775: ULONG NumberOfLinenumbers; ! 776: ULONG LvaToFirstLinenumber; ! 777: ULONG RvaToFirstByteOfCode; ! 778: ULONG RvaToLastByteOfCode; ! 779: ULONG RvaToFirstByteOfData; ! 780: ULONG RvaToLastByteOfData; ! 781: } IMAGE_DEBUG_INFO, *PIMAGE_DEBUG_INFO; ! 782: ! 783: #ifndef RC_INVOKED ! 784: #pragma pack () ! 785: #endif // !RC_INVOKED ! 786: ! 787: // ! 788: // End Image Format ! 789: // ! 790: ! 791: // end_winnt ! 792: ! 793: #endif // _NTIMAGE_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.