|
|
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.