source: branches/branch-1-0/include/helpers/exeh.h@ 443

Last change on this file since 443 was 262, checked in by pr, 21 years ago

XWP bug 583

  • Property svn:eol-style set to CRLF
  • Property svn:keywords set to Author Date Id Revision
File size: 55.7 KB
Line 
1
2/*
3 *@@sourcefile exeh.h:
4 * header file for exeh.c. See remarks there.
5 *
6 * Note: Version numbering in this file relates to XWorkplace version
7 * numbering.
8 *
9 *@@include #include <os2.h>
10 *@@include #include "helpers\dosh.h"
11 *@@include #include "helpers\exeh.h"
12 */
13
14/* This file Copyright (C) 2000-2002 Ulrich M”ller,
15 * Martin Lafaix.
16 * This file is part of the "XWorkplace helpers" source package.
17 * This is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published
19 * by the Free Software Foundation, in version 2 as it comes in the
20 * "COPYING" file of the XWorkplace main distribution.
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 */
26
27#if __cplusplus
28extern "C" {
29#endif
30
31#ifndef EXEH_HEADER_INCLUDED
32 #define EXEH_HEADER_INCLUDED
33
34 #pragma pack(1)
35
36 /********************************************************************
37 *
38 * DOS exe header
39 *
40 ********************************************************************/
41
42 /*
43 *@@ DOSEXEHEADER:
44 * old DOS EXE header at offset 0
45 * in any EXE file.
46 *
47 *@@changed V0.9.7 (2000-12-20) [umoeller]: fixed NE offset
48 *@@changed V0.9.9 (2001-04-06) [lafaix]: additional fields defined
49 */
50
51 typedef struct _DOSEXEHEADER
52 {
53 USHORT usDosExeID; // 00: DOS exeid (0x5a4d)
54 USHORT usFileLenMod512; // 02: filelen mod 512
55 USHORT usFileLenDiv512; // 04: filelen div 512
56 USHORT usSegFix; // 06: count of segment adds to fix
57 USHORT usHdrPargCnt; // 08: size of header in paragrphs
58 USHORT usMinAddPargCnt; // 0a: minimum addtl paragraphs count
59 USHORT usMaxAddPargCnt; // 0c: max addtl paragraphs count
60 USHORT usSSStartup; // 0e: SS at startup
61 USHORT usSPStartup; // 10: SP at startup
62 USHORT usHdrChecksum; // 12: header checksum
63 USHORT usIPStartup; // 14: IP at startup
64 USHORT usCodeSegOfs; // 16: code segment offset from EXE start
65 USHORT usRelocTableOfs; // 18: reloc table ofs.header (Win: >= 0x40 || 0)
66 USHORT usOverlayNo; // 1a: overlay no.
67 USHORT usLinkerVersion; // 1c: linker version (if 0x18 > 0x28)
68 USHORT usUnused1; // 1e: unused
69 USHORT usBehaviorBits; // 20: exe.h says this field contains
70 // 'behavior bits'
71 USHORT usUnused2; // 22: unused
72 USHORT usOEMIdentifier; // 24: OEM identifier
73 USHORT usOEMInformation; // 26: OEM information
74 ULONG ulUnused3; // 28:
75 ULONG ulUnused4; // 2c:
76 ULONG ulUnused5; // 30:
77 ULONG ulUnused6; // 34:
78 ULONG ulUnused7; // 38:
79 ULONG ulNewHeaderOfs; // 3c: new header ofs (if 0x18 >= 0x40 || 0)
80 // fixed this from USHORT, thanks Martin Lafaix
81 // V0.9.7 (2000-12-20) [umoeller]
82 } DOSEXEHEADER, *PDOSEXEHEADER;
83
84 /********************************************************************
85 *
86 * New Executable (NE)
87 *
88 ********************************************************************/
89
90 // NE and LX OS types
91 #define NEOS_UNKNOWN 0
92 #define NEOS_OS2 1 // Win16 SDK says: "reserved"...
93 #define NEOS_WIN16 2
94 #define NEOS_DOS4 3 // Win16 SDK says: "reserved"...
95 #define NEOS_WIN386 4 // Win16 SDK says: "reserved"...
96
97 /*
98 *@@ NEHEADER:
99 * linear executable (LX) header format,
100 * which comes after the DOS header in the
101 * EXE file (at DOSEXEHEADER.ulNewHeaderOfs).
102 *
103 *@@changed V0.9.9 (2001-04-06) [lafaix]: fixed typo in usMoveableEntries
104 */
105
106 typedef struct _NEHEADER
107 {
108 CHAR achNE[2]; // 00: "NE" magic ne_magic
109 BYTE bLinkerVersion; // 02: linker version ne_ver
110 BYTE bLinkerRevision; // 03: linker revision ne_rev
111 USHORT usEntryTblOfs; // 04: ofs from this to entrytable ne_enttab
112 USHORT usEntryTblLen; // 06: length of entrytable ne_cbenttab
113 ULONG ulChecksum; // 08: MS: reserved, OS/2: checksum ne_crc
114 USHORT usFlags; // 0c: flags ne_flags
115 #ifndef NENOTP // do not conflict with toolkit exe defs
116 #define NENOTP 0x8000 // Not a process == library
117 #define NENOTMPSAFE 0x4000 // Process is not multi-processor safe
118 // (Win3.1 SDK: "reserved")
119 #define NEIERR 0x2000 // Errors in image
120 #define NEBOUND 0x0800 // Bound Family/API
121 // (Win3.1 SDK: "first segment contains code
122 // that loads the application")
123 #define NEAPPTYP 0x0700 // Application type mask
124 // (Win3.1 SDK: "reserved")
125 #define NENOTWINCOMPAT 0x0100 // Not compatible with P.M. Windowing
126 // (Win3.1 SDK: "reserved")
127 #define NEWINCOMPAT 0x0200 // Compatible with P.M. Windowing
128 // (Win3.1 SDK: "reserved")
129 #define NEWINAPI 0x0300 // Uses P.M. Windowing API
130 // (Win3.1 SDK: "reserved")
131 #define NEFLTP 0x0080 // Floating-point instructions
132 #define NEI386 0x0040 // 386 instructions
133 #define NEI286 0x0020 // 286 instructions
134 #define NEI086 0x0010 // 8086 instructions
135 #define NEPROT 0x0008 // Runs in protected mode only
136 // (Win3.1 SDK: "reserved")
137 #define NEPPLI 0x0004 // Per-Process Library Initialization
138 // (Win3.1 SDK: "reserved")
139 #define NEINST 0x0002 // Instance data
140 #define NESOLO 0x0001 // Solo data (single data)
141 #endif
142 USHORT usAutoDataSegNo; // 0e: auto-data seg no. ne_autodata
143 // (Win3.1 SDK: "0 if both NEINST and NESOLO are cleared")
144 USHORT usInitlHeapSize; // 10: initl. heap size ne_heap
145 // (Win3.1 SDK: "0 if no local allocation")
146 USHORT usInitlStackSize; // 12: initl. stack size ne_stack
147 // (Win3.1 SDK: "0 if SS != DS")
148 ULONG ulCSIP; // 14: CS:IP ne_csip
149 ULONG ulSSSP; // 18: SS:SP ne_sssp
150 USHORT usSegTblEntries; // 1c: segment tbl entry count ne_cseg
151 USHORT usModuleTblEntries; // 1e: module ref. table entry count ne_cmod
152 USHORT usNonResdTblLen; // 20: non-resd. name tbl length ne_cbnrestab
153 USHORT usSegTblOfs; // 22: segment tbl ofs ne_segtab
154 // (from start of NEHEADER)
155 USHORT usResTblOfs; // 24: resource tbl ofs ne_rsrctab
156 // (from start of NEHEADER)
157 USHORT usResdNameTblOfs; // 26: resd. name tbl ofs ne_restab
158 // (from start of NEHEADER)
159 USHORT usModRefTblOfs; // 28: module ref. table ofs ne_modtab
160 // (from start of NEHEADER)
161 USHORT usImportTblOfs; // 2a: import name tbl ofs ne_imptab
162 // (from start of NEHEADER)
163 ULONG ulNonResdTblOfs; // 2c: non-resd. name tbl ofs ne_nrestab
164 // (from start of EXE!)
165 USHORT usMoveableEntries; // 30: moveable entry points count ne_cmovent
166 USHORT usLogicalSectShift; // 32: logcl. sector shift ne_align
167 // (Win3.1 SDK: "typically 4, but default is 9")
168 USHORT usResSegmCount; // 34: resource segm. count ne_cres
169 BYTE bTargetOS; // 36: target OS (NEOS_* flags) ne_exetyp
170 BYTE bFlags2; // 37: addtl. flags ne_flagsothers
171 // Win3.1 SDK:
172 // bit 1 --> Win2.x, but runs in Win3.x protected mode
173 // bit 2 --> Win2.x that supports prop. fonts
174 // bit 3 --> exec contains fastload area
175 /*
176 #define NELONGNAMES 0x01
177 #define NEWINISPROT 0x02
178 #define NEWINGETPROPFON 0x04
179 #define NEWLOAPPL 0x80
180 */
181 // the following are not listed in newexe.h, but are documented for Win3.x
182 USHORT usFastLoadOfs; // 38: fast-load area ofs
183 USHORT usFastLoadLen; // 3a: fast-load area length
184 USHORT usReserved; // 3c: MS: 'reserved'
185 USHORT usReqWinVersion; // 3e: Win-only: min. Win version
186 } NEHEADER, *PNEHEADER;
187
188 /*
189 *@@ OS2NERESTBLENTRY:
190 * OS/2 NE resource table entry.
191 *
192 *@@added V0.9.16 (2001-12-08) [umoeller]
193 */
194
195 typedef struct _OS2NERESTBLENTRY
196 {
197 USHORT usType;
198 USHORT usID;
199 } OS2NERESTBLENTRY, *POS2NERESTBLENTRY;
200
201 /*
202 *@@ OS2NESEGMENT:
203 * OS/2 NE segment definition.
204 *
205 *@@added V0.9.16 (2001-12-08) [umoeller]
206 */
207
208 typedef struct _OS2NESEGMENT // New .EXE segment table entry
209 {
210 USHORT ns_sector; // File sector of start of segment
211 USHORT ns_cbseg; // Number of bytes in file
212 USHORT ns_flags; // Attribute flags
213 USHORT ns_minalloc; // Minimum allocation in bytes
214 } OS2NESEGMENT, *POS2NESEGMENT;
215
216 /********************************************************************
217 *
218 * Linear Executable (LX)
219 *
220 ********************************************************************/
221
222 /*
223 *@@ LXHEADER:
224 * linear executable (LX) header format,
225 * which comes after the DOS header in the
226 * EXE file (at DOSEXEHEADER.ulNewHeaderOfs).
227 *
228 *@@changed V0.9.9 (2001-04-06) [lafaix]: fixed auto data object and ulinstanceDemdCnt
229 */
230
231 typedef struct _LXHEADER
232 {
233 CHAR achLX[2]; // 00: e32_magic "LX" or "LE" magic
234 // this is "LX" for 32-bit OS/2 programs, but
235 // "LE" for MS-DOS progs which use this format
236 // (e.g. WINDOWS\SMARTDRV.EXE). IBM says the
237 // LE format was never released and superceded
238 // by LX... I am unsure what the differences are.
239 BYTE fByteBigEndian; // 02: e32_border byte ordering (1 = big endian)
240 BYTE fWordBigEndian; // 03: e32_worder word ordering (1 = big endian)
241 ULONG ulFormatLevel; // 04: e32_level exe format level (0)
242 USHORT usCPU; // 08: e32_cpu CPU type
243 USHORT usTargetOS; // 0a: e32_os OS type (NEOS_* flags)
244 ULONG ulModuleVersion; // 0c: e32_ver module version
245 ULONG ulFlags; // 10: e32_mflags module flags
246 #ifndef E32NOTP // do not conflict with toolkit exe defs
247 #define E32NOTP 0x8000L // Library Module - used as NENOTP
248 #define E32NOLOAD 0x2000L // Module not Loadable
249 #define E32PMAPI 0x0300L // Uses PM Windowing API
250 #define E32PMW 0x0200L // Compatible with PM Windowing
251 #define E32NOPMW 0x0100L // Incompatible with PM Windowing
252 #define E32NOEXTFIX 0x0020L // NO External Fixups in .EXE
253 #define E32NOINTFIX 0x0010L // NO Internal Fixups in .EXE
254 #define E32SYSDLL 0x0008L // System DLL, Internal Fixups discarded
255 #define E32LIBINIT 0x0004L // Per-Process Library Initialization
256 #define E32LIBTERM 0x40000000L // Per-Process Library Termination
257 #define E32APPMASK 0x0300L // Application Type Mask
258 #endif
259 ULONG ulPageCount; // 14: e32_mpages no. of pages in module
260 ULONG ulEIPRelObj; // 18: e32_startobj obj # for IP
261 // object to which EIP is relative
262 ULONG ulEIPEntryAddr; // 1c: e32_eip EIP entry addr
263 ULONG ulESPObj; // 20: e32_stackobj ESP object
264 ULONG ulESP; // 24: e32_esp ESP
265 ULONG ulPageSize; // 28: e32_pagesize page size (4K)
266 ULONG ulPageLeftShift; // 2c: e32_pageshift page left-shift
267 ULONG ulFixupTblLen; // 30: e32_fixupsize fixup section total size
268 ULONG ulFixupTblChecksum; // 34: e32_fixupsum fixup section checksum
269 ULONG ulLoaderLen; // 38: e32_ldrsize size req. for loader section
270 ULONG ulLoaderChecksum; // 3c: e32_ldrsum loader section checksum
271 ULONG ulObjTblOfs; // 40: e32_objtab object table offset
272 ULONG ulObjCount; // 44: e32_objcnt object count
273 ULONG ulObjPageTblOfs; // 48: e32_objmap object page table ofs
274 ULONG ulObjIterPagesOfs; // 4c: e32_itermap object iter pages ofs
275 ULONG ulResTblOfs; // 50: e32_rsrctab resource table ofs
276 ULONG ulResTblCnt; // 54: e32_rsrccnt resource entry count
277 ULONG ulResdNameTblOfs; // 58: e32_restab resident name tbl ofs
278 ULONG ulEntryTblOfs; // 5c: e32_enttab entry tbl ofs
279 ULONG ulModDirectivesOfs; // 60: e32_dirtab module directives ofs
280 ULONG ulModDirectivesCnt; // 64: e32_dircnt module directives count
281 ULONG ulFixupPagePageTblOfs;// 68: e32_fpagetab fixup page tbl ofs
282 ULONG ulFixupRecTblOfs; // 6c: e32_frectab fixup record tbl ofs
283 ULONG ulImportModTblOfs; // 70: e32_impmod import modl tbl ofs
284 ULONG ulImportModTblCnt; // 74: e32_impmodcnt import modl tbl count
285 ULONG ulImportProcTblOfs; // 78: e32_impproc import proc tbl ofs
286 ULONG ulPerPageCSOfs; // 7c: e32_pagesum per page checksum ofs
287 ULONG ulDataPagesOfs; // 80: e32_datapage data pages ofs
288 ULONG ulPreloadPagesCnt; // 84: e32_preload preload pages count
289 ULONG ulNonResdNameTblOfs; // 88: e32_nrestab non-resdnt name tbl ofs
290 ULONG ulNonResdNameTblLen; // 8c: e32_cbnrestab non-resdnt name tbl length
291 ULONG ulNonResdNameTblCS; // 90: e32_nressum non-res name tbl checksum
292 ULONG ulAutoDataSegObj; // 94: e32_autodata auto dataseg object
293 ULONG ulDebugOfs; // 98: e32_debuginfo debug info ofs
294 ULONG ulDebugLen; // 9c: e32_debuglen debug info length
295 ULONG ulInstancePrelCnt; // a0: e32_instpreload instance preload count
296 ULONG ulInstanceDemdCnt; // a0: e32_instdemand instance demand count
297 ULONG ulHeapSize16; // a8: e32_heapsize heap size (16-bit)
298 ULONG ulStackSize; // ac: e32_stacksize stack size
299 BYTE e32_res3[20];
300 // Pad structure to 196 bytes
301 } LXHEADER, *PLXHEADER;
302
303 // additional LX structures
304
305 /*
306 *@@ RESOURCETABLEENTRY:
307 * LX resource table entry.
308 *
309 *@@added V0.9.16 (2001-12-08) [umoeller]
310 */
311
312 typedef struct _RESOURCETABLEENTRY // rsrc32
313 {
314 USHORT type; // Resource type
315 USHORT name; // Resource name
316 ULONG cb; // Resource size
317 USHORT obj; // Object number
318 ULONG offset; // Offset within object
319 } RESOURCETABLEENTRY;
320
321 /*
322 *@@ OBJECTTABLEENTRY:
323 * LX object table entry.
324 *
325 *@@added V0.9.16 (2001-12-08) [umoeller]
326 */
327
328 typedef struct _OBJECTTABLEENTRY // o32_obj
329 {
330 ULONG o32_size; // Object virtual size
331 ULONG o32_base; // Object base virtual address
332 ULONG o32_flags; // Attribute flags
333 ULONG o32_pagemap; // Object page map index
334 ULONG o32_mapsize; // Number of entries in object page map
335 ULONG o32_reserved; // Reserved
336 } OBJECTTABLEENTRY;
337
338 /*
339 *@@ OBJECTPAGETABLEENTRY:
340 * LX object _page_ table entry, sometimes
341 * referred to as map entry.
342 *
343 *@@added V0.9.16 (2001-12-08) [umoeller]
344 */
345
346 typedef struct _OBJECTPAGETABLEENTRY // o32_map
347 {
348 ULONG o32_pagedataoffset; // file offset of page
349 USHORT o32_pagesize; // # of real bytes of page data
350 USHORT o32_pageflags; // Per-Page attributes
351 } OBJECTPAGETABLEENTRY;
352
353 /*
354 *@@ LXITER:
355 * iteration Record format for 'EXEPACK'ed pages.
356 *
357 *@@added V0.9.16 (2001-12-08) [umoeller]
358 */
359
360 typedef struct _LXITER
361 {
362 USHORT LX_nIter; // number of iterations
363 USHORT LX_nBytes; // number of bytes
364 unsigned char LX_Iterdata; // iterated data byte(s)
365 } LXITER, *PLXITER;
366
367 // object/segment flags (in NE and LX)
368 #define OBJWRITE 0x0002L // Writeable Object
369 #define OBJDISCARD 0x0010L // Object is Discardable
370 #define OBJSHARED 0x0020L // Object is Shared
371 #define OBJPRELOAD 0x0040L // Object has preload pages
372
373 // resource flags
374 #define RNMOVE 0x0010 // Moveable resource
375 #define RNPURE 0x0020 // Pure (read-only) resource
376 #define RNPRELOAD 0x0040 // Preloaded resource
377 #define RNDISCARD 0xF000 // Discard priority level for resource
378
379 /********************************************************************
380 *
381 * Portable Executable (PE)
382 *
383 ********************************************************************/
384
385 /*
386 *@@ IMAGE_FILE_HEADER:
387 * first part of PE header (standard header).
388 *
389 *@@added V0.9.16 (2002-01-09) [umoeller]
390 */
391
392 typedef struct _IMAGE_FILE_HEADER
393 {
394 USHORT usMachine; // CPU type
395 #define IMAGE_FILE_MACHINE_UNKNOWN 0
396 #define IMAGE_FILE_MACHINE_I860 0x14d
397 #define IMAGE_FILE_MACHINE_I386 0x14c
398 #define IMAGE_FILE_MACHINE_R3000 0x162
399 #define IMAGE_FILE_MACHINE_R4000 0x166
400 #define IMAGE_FILE_MACHINE_R10000 0x168
401 #define IMAGE_FILE_MACHINE_ALPHA 0x184
402 #define IMAGE_FILE_MACHINE_POWERPC 0x1F0
403 USHORT usNumberOfSections;
404 ULONG ulTimeDateStamp;
405 ULONG ulPointerToSymbolTable;
406 ULONG ulNumberOfSymbols;
407 USHORT usSizeOfOptionalHeader;
408 USHORT fsCharacteristics;
409 #define IMAGE_FILE_RELOCS_STRIPPED 1 // No relocation info
410 #define IMAGE_FILE_EXECUTABLE_IMAGE 2
411 #define IMAGE_FILE_LINE_NUMS_STRIPPED 4
412 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 8
413 #define IMAGE_FILE_16BIT_MACHINE 0x40
414 #define IMAGE_FILE_BYTES_REVERSED_LO 0x80
415 #define IMAGE_FILE_32BIT_MACHINE 0x100
416 #define IMAGE_FILE_DEBUG_STRIPPED 0x200
417 #define IMAGE_FILE_SYSTEM 0x1000
418 #define IMAGE_FILE_DLL 0x2000
419 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
420 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
421
422 typedef struct _IMAGE_DATA_DIRECTORY
423 {
424 ULONG VirtualAddress;
425 ULONG Size;
426 } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
427
428 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
429
430 /*
431 *@@ IMAGE_OPTIONAL_HEADER:
432 * second part of PE header (optional header).
433 *
434 *@@added V0.9.16 (2002-01-09) [umoeller]
435 */
436
437 typedef struct _IMAGE_OPTIONAL_HEADER
438 {
439 // Standard fields
440 USHORT Magic; // 00
441 #define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
442 #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
443 BYTE MajorLinkerVersion; // 02
444 BYTE MinorLinkerVersion; // 03
445 ULONG SizeOfCode; // 04
446 ULONG SizeOfInitializedData; // 08
447 ULONG SizeOfUninitializedData; // 0C
448 ULONG AddressOfEntryPoint; // 10
449 ULONG BaseOfCode; // 14
450 ULONG BaseOfData; // 18
451
452 // NT additional fields
453 ULONG ImageBase; // 1C
454 ULONG SectionAlignment; // 20
455 ULONG FileAlignment; // 24
456 USHORT MajorOperatingSystemVersion; // 28
457 USHORT MinorOperatingSystemVersion; // 2A
458 USHORT MajorImageVersion; // 2C
459 USHORT MinorImageVersion; // 2E
460 USHORT MajorSubsystemVersion; // 30
461 USHORT MinorSubsystemVersion; // 32
462 ULONG Reserved1; // 34
463 ULONG SizeOfImage; // 38
464 ULONG SizeOfHeaders; // 3C
465 ULONG CheckSum; // 40
466 USHORT usSubsystem; // 44
467 #define IMAGE_SUBSYSTEM_UNKNOWN 0
468 #define IMAGE_SUBSYSTEM_NATIVE 1
469 #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Windows GUI subsystem
470 #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Windows character subsystem
471 #define IMAGE_SUBSYSTEM_OS2_CUI 5
472 #define IMAGE_SUBSYSTEM_POSIX_CUI 7
473 USHORT DllCharacteristics; // 46
474 ULONG SizeOfStackReserve; // 48
475 ULONG SizeOfStackCommit; // 4C
476 ULONG SizeOfHeapReserve; // 50
477 ULONG SizeOfHeapCommit; // 54
478 ULONG LoaderFlags; // 58
479 ULONG NumberOfRvaAndSizes; // 5C
480 // 60:
481 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
482 } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
483
484 // indices into the DataDirectory array
485 #define IMAGE_FILE_EXPORT_DIRECTORY 0
486 #define IMAGE_FILE_IMPORT_DIRECTORY 1
487 #define IMAGE_FILE_RESOURCE_DIRECTORY 2
488 #define IMAGE_FILE_EXCEPTION_DIRECTORY 3
489 #define IMAGE_FILE_SECURITY_DIRECTORY 4
490 #define IMAGE_FILE_BASE_RELOCATION_TABLE 5
491 #define IMAGE_FILE_DEBUG_DIRECTORY 6
492 #define IMAGE_FILE_DESCRIPTION_STRING 7
493 #define IMAGE_FILE_MACHINE_VALUE 8 // Mips
494 #define IMAGE_FILE_THREAD_LOCAL_STORAGE 9
495 #define IMAGE_FILE_CALLBACK_DIRECTORY 10
496
497 // directory entries, indices into the DataDirectory array
498 #define IMAGE_DIRECTORY_ENTRY_EXPORT 0
499 #define IMAGE_DIRECTORY_ENTRY_IMPORT 1
500 #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
501 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
502 #define IMAGE_DIRECTORY_ENTRY_SECURITY 4
503 #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
504 #define IMAGE_DIRECTORY_ENTRY_DEBUG 6
505 #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
506 #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // (MIPS GP)
507 #define IMAGE_DIRECTORY_ENTRY_TLS 9
508 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
509 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
510 #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table
511 #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13
512 #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
513
514 /*
515 *@@ PEHEADER:
516 * portable executable (PE) header format,
517 * which comes after the DOS header in the
518 * EXE file (at DOSEXEHEADER.ulNewHeaderOfs).
519 *
520 *@@added V0.9.16 (2002-01-09) [umoeller]
521 */
522
523 typedef struct _PEHEADER
524 {
525 // standard header
526 ULONG ulSignature; // 00: 'P', 'E', 0, 0
527 IMAGE_FILE_HEADER // 04
528 FileHeader;
529 IMAGE_OPTIONAL_HEADER // 18
530 OptionalHeader;
531
532 } PEHEADER, *PPEHEADER;
533
534 /*
535 #define PE_HEADER(module) \
536 ((IMAGE_NT_HEADERS*)((LPBYTE)(module) + \
537 (((IMAGE_DOS_HEADER*)(module))->e_lfanew)))
538
539 #define PE_SECTIONS(module) \
540 ((IMAGE_SECTION_HEADER*)((LPBYTE)&PE_HEADER(module)->OptionalHeader + \
541 PE_HEADER(module)->FileHeader.SizeOfOptionalHeader))
542
543 #define RVA_PTR(module,field) ((LPBYTE)(module) + PE_HEADER(module)->field)
544 */
545
546 // Section header format
547
548 #define IMAGE_SIZEOF_SHORT_NAME 8
549
550 /*
551 *@@ IMAGE_SECTION_HEADER:
552 * comes right after PEHEADER in executable.
553 *
554 *@@added V0.9.16 (2002-01-09) [umoeller]
555 */
556
557 typedef struct _IMAGE_SECTION_HEADER
558 {
559 BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 00:
560 union
561 {
562 ULONG PhysicalAddress; // 04:
563 ULONG VirtualSize; // 04:
564 } Misc;
565 ULONG VirtualAddress; // 08:
566 ULONG ulSizeOfRawData; // 0C:
567 ULONG ulPointerToRawData; // 10:
568 ULONG PointerToRelocations; // 14:
569 ULONG PointerToLinenumbers; // 18:
570 USHORT NumberOfRelocations; // 1C:
571 USHORT NumberOfLinenumbers; // 1E:
572 ULONG flCharacteristics; // 20:
573 // #define IMAGE_SCN_TYPE_REG 0x00000000 - Reserved
574 // #define IMAGE_SCN_TYPE_DSECT 0x00000001 - Reserved
575 // #define IMAGE_SCN_TYPE_NOLOAD 0x00000002 - Reserved
576 // #define IMAGE_SCN_TYPE_GROUP 0x00000004 - Reserved
577 // #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 - Reserved
578 // #define IMAGE_SCN_TYPE_COPY 0x00000010 - Reserved
579 #define IMAGE_SCN_CNT_CODE 0x00000020
580 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
581 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
582 #define IMAGE_SCN_LNK_OTHER 0x00000100
583 #define IMAGE_SCN_LNK_INFO 0x00000200
584 // #define IMAGE_SCN_TYPE_OVER 0x00000400 - Reserved
585 #define IMAGE_SCN_LNK_REMOVE 0x00000800
586 #define IMAGE_SCN_LNK_COMDAT 0x00001000
587 // 0x00002000 - Reserved
588 // #define IMAGE_SCN_MEM_PROTECTED 0x00004000 - Obsolete
589 #define IMAGE_SCN_MEM_FARDATA 0x00008000
590 // #define IMAGE_SCN_MEM_SYSHEAP 0x00010000 - Obsolete
591 #define IMAGE_SCN_MEM_PURGEABLE 0x00020000
592 #define IMAGE_SCN_MEM_16BIT 0x00020000
593 #define IMAGE_SCN_MEM_LOCKED 0x00040000
594 #define IMAGE_SCN_MEM_PRELOAD 0x00080000
595 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000
596 #define IMAGE_SCN_ALIGN_2BYTES 0x00200000
597 #define IMAGE_SCN_ALIGN_4BYTES 0x00300000
598 #define IMAGE_SCN_ALIGN_8BYTES 0x00400000
599 #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default
600 #define IMAGE_SCN_ALIGN_32BYTES 0x00600000
601 #define IMAGE_SCN_ALIGN_64BYTES 0x00700000
602 // 0x00800000 - Unused
603 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
604 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
605 #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
606 #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
607 #define IMAGE_SCN_MEM_SHARED 0x10000000
608 #define IMAGE_SCN_MEM_EXECUTE 0x20000000
609 #define IMAGE_SCN_MEM_READ 0x40000000
610 #define IMAGE_SCN_MEM_WRITE 0x80000000
611 // 24:
612 } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
613
614 #define IMAGE_SIZEOF_SECTION_HEADER 40
615
616 /*
617 *@@ IMAGE_IMPORT_BY_NAME:
618 * import name entry.
619 *
620 *@@added V0.9.16 (2002-01-09) [umoeller]
621 */
622
623 typedef struct _IMAGE_IMPORT_BY_NAME
624 {
625 USHORT Hint;
626 BYTE Name[1];
627 } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
628
629 /*
630 *@@ IMAGE_THUNK_DATA:
631 * import thunk.
632 *
633 *@@added V0.9.16 (2002-01-09) [umoeller]
634 */
635
636 typedef struct _IMAGE_THUNK_DATA
637 {
638 union
639 {
640 PBYTE ForwarderString;
641 PFN Function;
642 ULONG Ordinal;
643 PIMAGE_IMPORT_BY_NAME
644 AddressOfData;
645 } u1;
646 } IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;
647
648 /*
649 *@@ IMAGE_IMPORT_DESCRIPTOR:
650 * import module directory.
651 *
652 *@@added V0.9.16 (2002-01-09) [umoeller]
653 */
654
655 typedef struct _IMAGE_IMPORT_DESCRIPTOR
656 {
657 union
658 {
659 ULONG Characteristics; // 0 for terminating null import descriptor
660 PIMAGE_THUNK_DATA
661 OriginalFirstThunk; // RVA to original unbound IAT
662 } u;
663 ULONG TimeDateStamp; // 0 if not bound,
664 // -1 if bound, and real date\time stamp
665 // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
666 // (new BIND)
667 // otherwise date/time stamp of DLL bound to
668 // (Old BIND)
669 ULONG ForwarderChain; // -1 if no forwarders
670 ULONG Name;
671 // RVA to IAT (if bound this IAT has actual addresses)
672 PIMAGE_THUNK_DATA
673 FirstThunk;
674 } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
675
676 #define IMAGE_ORDINAL_FLAG 0x80000000
677 #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
678 #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
679
680 /*
681 *@@ IMAGE_EXPORT_DIRECTORY:
682 * export module directory
683 *
684 *@@added V0.9.16 (2002-01-09) [umoeller]
685 */
686
687 typedef struct _IMAGE_EXPORT_DIRECTORY
688 {
689 ULONG Characteristics;
690 ULONG TimeDateStamp;
691 USHORT MajorVersion;
692 USHORT MinorVersion;
693 ULONG Name;
694 ULONG Base;
695 ULONG NumberOfFunctions;
696 ULONG NumberOfNames;
697 PULONG *AddressOfFunctions;
698 PULONG *AddressOfNames;
699 PUSHORT *AddressOfNameOrdinals;
700 // u_char ModuleName[1];
701 } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
702
703 /*
704 *@@ IMAGE_RESOURCE_DIRECTORY:
705 *
706 *@@added V0.9.16 (2002-01-09) [umoeller]
707 */
708
709 typedef struct _IMAGE_RESOURCE_DIRECTORY
710 {
711 ULONG Characteristics;
712 ULONG TimeDateStamp;
713 USHORT MajorVersion;
714 USHORT MinorVersion;
715 USHORT NumberOfNamedEntries;
716 USHORT NumberOfIdEntries;
717 // IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
718 } IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
719
720 #define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
721 #define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
722
723 /*
724 *@@ IMAGE_RESOURCE_DIRECTORY_ENTRY:
725 *
726 *@@added V0.9.16 (2002-01-09) [umoeller]
727 */
728
729 typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY
730 {
731 union
732 {
733 struct
734 {
735 unsigned NameOffset:31;
736 unsigned NameIsString:1;
737 } s;
738 ULONG Name;
739 USHORT Id;
740 } u1;
741 union
742 {
743 ULONG OffsetToData;
744 struct
745 {
746 unsigned OffsetToDirectory:31;
747 unsigned DataIsDirectory:1;
748 } s;
749 } u2;
750 } IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
751
752 /*
753 *@@ IMAGE_RESOURCE_DIRECTORY_STRING:
754 *
755 *@@added V0.9.16 (2002-01-09) [umoeller]
756 */
757
758 typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING
759 {
760 USHORT Length;
761 CHAR NameString[1];
762 } IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
763
764 typedef USHORT WCHAR;
765
766 /*
767 *@@ IMAGE_RESOURCE_DIR_STRING_U:
768 *
769 *@@added V0.9.16 (2002-01-09) [umoeller]
770 */
771
772 typedef struct _IMAGE_RESOURCE_DIR_STRING_U
773 {
774 USHORT Length;
775 WCHAR NameString[ 1 ];
776 } IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;
777
778 /*
779 *@@ IMAGE_RESOURCE_DATA_ENTRY:
780 *
781 *@@added V0.9.16 (2002-01-09) [umoeller]
782 */
783
784 typedef struct _IMAGE_RESOURCE_DATA_ENTRY
785 {
786 ULONG OffsetToData;
787 ULONG Size;
788 ULONG CodePage;
789 ULONG ResourceHandle;
790 } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
791
792 /*
793 *@@ IMAGE_BASE_RELOCATION:
794 *
795 *@@added V0.9.16 (2002-01-09) [umoeller]
796 */
797
798 typedef struct _IMAGE_BASE_RELOCATION
799 {
800 ULONG VirtualAddress;
801 ULONG SizeOfBlock;
802 USHORT TypeOffset[1];
803 } IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
804
805 /*
806 *@@ IMAGE_LOAD_CONFIG_DIRECTORY:
807 *
808 *@@added V0.9.16 (2002-01-09) [umoeller]
809 */
810
811 typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY
812 {
813 ULONG Characteristics;
814 ULONG TimeDateStamp;
815 USHORT MajorVersion;
816 USHORT MinorVersion;
817 ULONG GlobalFlagsClear;
818 ULONG GlobalFlagsSet;
819 ULONG CriticalSectionDefaultTimeout;
820 ULONG DeCommitFreeBlockThreshold;
821 ULONG DeCommitTotalFreeThreshold;
822 PVOID LockPrefixTable;
823 ULONG MaximumAllocationSize;
824 ULONG VirtualMemoryThreshold;
825 ULONG ProcessHeapFlags;
826 ULONG Reserved[ 4 ];
827 } IMAGE_LOAD_CONFIG_DIRECTORY,*PIMAGE_LOAD_CONFIG_DIRECTORY;
828
829 typedef VOID (* /* CALLBACK */ PIMAGE_TLS_CALLBACK)(PVOID DllHandle,
830 ULONG Reason,
831 PVOID Reserved);
832
833 /*
834 *@@ IMAGE_TLS_DIRECTORY:
835 *
836 *@@added V0.9.16 (2002-01-09) [umoeller]
837 */
838
839 typedef struct _IMAGE_TLS_DIRECTORY
840 {
841 ULONG StartAddressOfRawData;
842 ULONG EndAddressOfRawData;
843 PULONG AddressOfIndex;
844 PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
845 ULONG SizeOfZeroFill;
846 ULONG Characteristics;
847 } IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY;
848
849 /*
850 *@@ IMAGE_DEBUG_DIRECTORY:
851 * the IMAGE_DEBUG_DIRECTORY data directory points
852 * to an array of these structures.
853 *
854 *@@added V0.9.16 (2002-01-09) [umoeller]
855 */
856
857 typedef struct _IMAGE_DEBUG_DIRECTORY
858 {
859 ULONG Characteristics;
860 ULONG TimeDateStamp;
861 USHORT MajorVersion;
862 USHORT MinorVersion;
863 ULONG Type;
864 ULONG SizeOfData;
865 ULONG AddressOfRawData;
866 ULONG ulPointerToRawData;
867 } IMAGE_DEBUG_DIRECTORY,*PIMAGE_DEBUG_DIRECTORY;
868
869 /*
870 * The type field above can take these (plus a few other
871 * irrelevant) values.
872 */
873 #define IMAGE_DEBUG_TYPE_UNKNOWN 0
874 #define IMAGE_DEBUG_TYPE_COFF 1
875 #define IMAGE_DEBUG_TYPE_CODEVIEW 2
876 #define IMAGE_DEBUG_TYPE_FPO 3
877 #define IMAGE_DEBUG_TYPE_MISC 4
878 #define IMAGE_DEBUG_TYPE_EXCEPTION 5
879 #define IMAGE_DEBUG_TYPE_FIXUP 6
880 #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
881 #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
882
883 // generic relocation types
884 #define IMAGE_REL_BASED_ABSOLUTE 0
885 #define IMAGE_REL_BASED_HIGH 1
886 #define IMAGE_REL_BASED_LOW 2
887 #define IMAGE_REL_BASED_HIGHLOW 3
888 #define IMAGE_REL_BASED_HIGHADJ 4
889 #define IMAGE_REL_BASED_MIPS_JMPADDR 5
890 #define IMAGE_REL_BASED_SECTION 6
891 #define IMAGE_REL_BASED_REL 7
892 #define IMAGE_REL_BASED_MIPS_JMPADDR16 9
893 #define IMAGE_REL_BASED_IA64_IMM64 9 // yes, 9 too
894 #define IMAGE_REL_BASED_DIR64 10
895 #define IMAGE_REL_BASED_HIGH3ADJ 11
896
897 // I386 relocation types
898 #define IMAGE_REL_I386_ABSOLUTE 0
899 #define IMAGE_REL_I386_DIR16 1
900 #define IMAGE_REL_I386_REL16 2
901 #define IMAGE_REL_I386_DIR 6
902 #define IMAGE_REL_I386_DIR32NB 7
903 #define IMAGE_REL_I386_SEG12 9
904 #define IMAGE_REL_I386_SECTION 10
905 #define IMAGE_REL_I386_SECREL 11
906 #define IMAGE_REL_I386_REL 20
907
908 // MIPS relocation types
909 #define IMAGE_REL_MIPS_ABSOLUTE 0x0000
910 #define IMAGE_REL_MIPS_REFHALF 0x0001
911 #define IMAGE_REL_MIPS_REFWORD 0x0002
912 #define IMAGE_REL_MIPS_JMPADDR 0x0003
913 #define IMAGE_REL_MIPS_REFHI 0x0004
914 #define IMAGE_REL_MIPS_REFLO 0x0005
915 #define IMAGE_REL_MIPS_GPREL 0x0006
916 #define IMAGE_REL_MIPS_LITERAL 0x0007
917 #define IMAGE_REL_MIPS_SECTION 0x000A
918 #define IMAGE_REL_MIPS_SECREL 0x000B
919 #define IMAGE_REL_MIPS_SECRELLO 0x000C
920 #define IMAGE_REL_MIPS_SECRELHI 0x000D
921 #define IMAGE_REL_MIPS_JMPADDR16 0x0010
922 #define IMAGE_REL_MIPS_REFWORDNB 0x0022
923 #define IMAGE_REL_MIPS_PAIR 0x0025
924
925 // ALPHA relocation types
926 #define IMAGE_REL_ALPHA_ABSOLUTE 0x0000
927 #define IMAGE_REL_ALPHA_REFLONG 0x0001
928 #define IMAGE_REL_ALPHA_REFQUAD 0x0002
929 #define IMAGE_REL_ALPHA_GPREL 0x0003
930 #define IMAGE_REL_ALPHA_LITERAL 0x0004
931 #define IMAGE_REL_ALPHA_LITUSE 0x0005
932 #define IMAGE_REL_ALPHA_GPDISP 0x0006
933 #define IMAGE_REL_ALPHA_BRADDR 0x0007
934 #define IMAGE_REL_ALPHA_HINT 0x0008
935 #define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009
936 #define IMAGE_REL_ALPHA_REFHI 0x000A
937 #define IMAGE_REL_ALPHA_REFLO 0x000B
938 #define IMAGE_REL_ALPHA_PAIR 0x000C
939 #define IMAGE_REL_ALPHA_MATCH 0x000D
940 #define IMAGE_REL_ALPHA_SECTION 0x000E
941 #define IMAGE_REL_ALPHA_SECREL 0x000F
942 #define IMAGE_REL_ALPHA_REFLONGNB 0x0010
943 #define IMAGE_REL_ALPHA_SECRELLO 0x0011
944 #define IMAGE_REL_ALPHA_SECRELHI 0x0012
945 #define IMAGE_REL_ALPHA_REFQ3 0x0013
946 #define IMAGE_REL_ALPHA_REFQ2 0x0014
947 #define IMAGE_REL_ALPHA_REFQ1 0x0015
948 #define IMAGE_REL_ALPHA_GPRELLO 0x0016
949 #define IMAGE_REL_ALPHA_GPRELHI 0x0017
950
951 // PowerPC relocation types
952 #define IMAGE_REL_PPC_ABSOLUTE 0x0000
953 #define IMAGE_REL_PPC_ADDR64 0x0001
954 #define IMAGE_REL_PPC_ADDR 0x0002
955 #define IMAGE_REL_PPC_ADDR24 0x0003
956 #define IMAGE_REL_PPC_ADDR16 0x0004
957 #define IMAGE_REL_PPC_ADDR14 0x0005
958 #define IMAGE_REL_PPC_REL24 0x0006
959 #define IMAGE_REL_PPC_REL14 0x0007
960 #define IMAGE_REL_PPC_TOCREL16 0x0008
961 #define IMAGE_REL_PPC_TOCREL14 0x0009
962 #define IMAGE_REL_PPC_ADDR32NB 0x000A
963 #define IMAGE_REL_PPC_SECREL 0x000B
964 #define IMAGE_REL_PPC_SECTION 0x000C
965 #define IMAGE_REL_PPC_IFGLUE 0x000D
966 #define IMAGE_REL_PPC_IMGLUE 0x000E
967 #define IMAGE_REL_PPC_SECREL16 0x000F
968 #define IMAGE_REL_PPC_REFHI 0x0010
969 #define IMAGE_REL_PPC_REFLO 0x0011
970 #define IMAGE_REL_PPC_PAIR 0x0012
971 #define IMAGE_REL_PPC_SECRELLO 0x0013
972 #define IMAGE_REL_PPC_SECRELHI 0x0014
973 #define IMAGE_REL_PPC_GPREL 0x0015
974 #define IMAGE_REL_PPC_TYPEMASK 0x00FF
975 // modifier bits
976 #define IMAGE_REL_PPC_NEG 0x0100
977 #define IMAGE_REL_PPC_BRTAKEN 0x0200
978 #define IMAGE_REL_PPC_BRNTAKEN 0x0400
979 #define IMAGE_REL_PPC_TOCDEFN 0x0800
980
981 // SH3 ? relocation type
982 #define IMAGE_REL_SH3_ABSOLUTE 0x0000
983 #define IMAGE_REL_SH3_DIRECT16 0x0001
984 #define IMAGE_REL_SH3_DIRECT 0x0002
985 #define IMAGE_REL_SH3_DIRECT8 0x0003
986 #define IMAGE_REL_SH3_DIRECT8_WORD 0x0004
987 #define IMAGE_REL_SH3_DIRECT8_LONG 0x0005
988 #define IMAGE_REL_SH3_DIRECT4 0x0006
989 #define IMAGE_REL_SH3_DIRECT4_WORD 0x0007
990 #define IMAGE_REL_SH3_DIRECT4_LONG 0x0008
991 #define IMAGE_REL_SH3_PCREL8_WORD 0x0009
992 #define IMAGE_REL_SH3_PCREL8_LONG 0x000A
993 #define IMAGE_REL_SH3_PCREL12_WORD 0x000B
994 #define IMAGE_REL_SH3_STARTOF_SECTION 0x000C
995 #define IMAGE_REL_SH3_SIZEOF_SECTION 0x000D
996 #define IMAGE_REL_SH3_SECTION 0x000E
997 #define IMAGE_REL_SH3_SECREL 0x000F
998 #define IMAGE_REL_SH3_DIRECT32_NB 0x0010
999
1000 // ARM (Archimedes?) relocation types
1001 #define IMAGE_REL_ARM_ABSOLUTE 0x0000
1002 #define IMAGE_REL_ARM_ADDR 0x0001
1003 #define IMAGE_REL_ARM_ADDR32NB 0x0002
1004 #define IMAGE_REL_ARM_BRANCH24 0x0003
1005 #define IMAGE_REL_ARM_BRANCH11 0x0004
1006 #define IMAGE_REL_ARM_SECTION 0x000E
1007 #define IMAGE_REL_ARM_SECREL 0x000F
1008
1009 // IA64 relocation types
1010 #define IMAGE_REL_IA64_ABSOLUTE 0x0000
1011 #define IMAGE_REL_IA64_IMM14 0x0001
1012 #define IMAGE_REL_IA64_IMM22 0x0002
1013 #define IMAGE_REL_IA64_IMM64 0x0003
1014 #define IMAGE_REL_IA64_DIR 0x0004
1015 #define IMAGE_REL_IA64_DIR64 0x0005
1016 #define IMAGE_REL_IA64_PCREL21B 0x0006
1017 #define IMAGE_REL_IA64_PCREL21M 0x0007
1018 #define IMAGE_REL_IA64_PCREL21F 0x0008
1019 #define IMAGE_REL_IA64_GPREL22 0x0009
1020 #define IMAGE_REL_IA64_LTOFF22 0x000A
1021 #define IMAGE_REL_IA64_SECTION 0x000B
1022 #define IMAGE_REL_IA64_SECREL22 0x000C
1023 #define IMAGE_REL_IA64_SECREL64I 0x000D
1024 #define IMAGE_REL_IA64_SECREL 0x000E
1025 #define IMAGE_REL_IA64_LTOFF64 0x000F
1026 #define IMAGE_REL_IA64_DIR32NB 0x0010
1027 #define IMAGE_REL_IA64_RESERVED_11 0x0011
1028 #define IMAGE_REL_IA64_RESERVED_12 0x0012
1029 #define IMAGE_REL_IA64_RESERVED_13 0x0013
1030 #define IMAGE_REL_IA64_RESERVED_14 0x0014
1031 #define IMAGE_REL_IA64_RESERVED_15 0x0015
1032 #define IMAGE_REL_IA64_RESERVED_16 0x0016
1033 #define IMAGE_REL_IA64_ADDEND 0x001F
1034
1035 /*
1036 *@@ IMAGE_SEPARATE_DEBUG_HEADER:
1037 * structure that appears at the very start of a .DBG file.
1038 *
1039 *@@added V0.9.16 (2002-01-09) [umoeller]
1040 */
1041
1042 typedef struct _IMAGE_SEPARATE_DEBUG_HEADER
1043 {
1044 USHORT Signature;
1045 USHORT Flags;
1046 USHORT Machine;
1047 USHORT Characteristics;
1048 ULONG TimeDateStamp;
1049 ULONG CheckSum;
1050 ULONG ImageBase;
1051 ULONG SizeOfImage;
1052 ULONG NumberOfSections;
1053 ULONG ExportedNamesSize;
1054 ULONG DebugDirectorySize;
1055 ULONG Reserved[ 3 ];
1056 } IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER;
1057
1058 #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
1059
1060 /*
1061 *@@ MESSAGE_RESOURCE_ENTRY:
1062 *
1063 *@@added V0.9.16 (2002-01-09) [umoeller]
1064 */
1065
1066 typedef struct tagMESSAGE_RESOURCE_ENTRY
1067 {
1068 USHORT Length;
1069 USHORT Flags;
1070 BYTE Text[1];
1071 } MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY;
1072 #define MESSAGE_RESOURCE_UNICODE 0x0001
1073
1074 /*
1075 *@@ MESSAGE_RESOURCE_BLOCK:
1076 *
1077 *@@added V0.9.16 (2002-01-09) [umoeller]
1078 */
1079
1080 typedef struct tagMESSAGE_RESOURCE_BLOCK
1081 {
1082 ULONG LowId;
1083 ULONG HighId;
1084 ULONG OffsetToEntries;
1085 } MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
1086
1087 /*
1088 *@@ MESSAGE_RESOURCE_DATA:
1089 *
1090 *@@added V0.9.16 (2002-01-09) [umoeller]
1091 */
1092
1093 typedef struct tagMESSAGE_RESOURCE_DATA
1094 {
1095 ULONG NumberOfBlocks;
1096 MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
1097 } MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;
1098
1099 /*
1100 *@@ IMAGE_IMPORT_MODULE_DIRECTORY:
1101 *
1102 *@@added V0.9.16 (2002-01-09) [umoeller]
1103 */
1104
1105 typedef struct _IMAGE_IMPORT_MODULE_DIRECTORY // tagImportDirectory
1106 {
1107 ULONG dwRVAFunctionNameList;
1108 ULONG dwUseless1;
1109 ULONG dwUseless2;
1110 ULONG dwRVAModuleName;
1111 ULONG dwRVAFunctionAddressList;
1112 } IMAGE_IMPORT_MODULE_DIRECTORY, *PIMAGE_IMPORT_MODULE_DIRECTORY;
1113
1114 #pragma pack()
1115
1116 /********************************************************************
1117 *
1118 * Declarations and APIs
1119 *
1120 ********************************************************************/
1121
1122#ifndef __STRIP_DOWN_EXECUTABLE__
1123// for mini stubs in warpin, which has its own
1124// implementation of this
1125
1126 /*
1127 *@@ EXECUTABLE:
1128 * structure used with all the exeh*
1129 * functions.
1130 */
1131
1132 typedef struct _EXECUTABLE
1133 {
1134 // executable opened by doshOpen;
1135 // note, NULL for .COM, .BAT, .CMD files (V0.9.16)
1136 PXFILE pFile;
1137
1138 // Most of the following fields are set by
1139 // exehOpen if NO_ERROR is returned:
1140
1141 // old DOS EXE header;
1142 // warning, this is NULL if
1143 // -- the executable has a new header only
1144 // (NOSTUB, V0.9.12);
1145 // -- for .COM, .BAT, .CMD files (V0.9.16)
1146 PDOSEXEHEADER pDosExeHeader;
1147 ULONG cbDosExeHeader;
1148
1149 // New Executable (NE) header, if ulExeFormat == EXEFORMAT_NE
1150 PNEHEADER pNEHeader;
1151 ULONG cbNEHeader;
1152
1153 // Linear Executable (LX) header, if ulExeFormat == EXEFORMAT_LX
1154 PLXHEADER pLXHeader;
1155 ULONG cbLXHeader;
1156
1157 // Portable Executable (PE) header, if ulExeFormat == EXEFORMAT_PE
1158 PPEHEADER pPEHeader;
1159 ULONG cbPEHeader;
1160 // note, this one may vary; however, all Win32 programs
1161 // will have sizeof(PEHEADER) in here since they all
1162 // use both the standard and the optional PE header
1163
1164 // module analysis (always set, otherwise error would be
1165 // returned by exehOpen):
1166 ULONG ulExeFormat;
1167#endif
1168 #define EXEFORMAT_OLDDOS 1
1169 #define EXEFORMAT_NE 2
1170 #define EXEFORMAT_PE 3
1171 #define EXEFORMAT_LX 4
1172 #define EXEFORMAT_TEXT_BATCH 5
1173 #define EXEFORMAT_TEXT_CMD 6 // REXX or plain OS/2 batch
1174 #define EXEFORMAT_COM 7 // added V0.9.16 (2002-01-04) [umoeller]
1175
1176#ifndef __STRIP_DOWN_EXECUTABLE__
1177 BOOL fLibrary, // TRUE if this is a DLL
1178 // (works for NE, LX, PE)
1179 f32Bits; // TRUE if this a 32-bits module
1180 // (TRUE always for PE)
1181
1182 ULONG ulOS;
1183#endif
1184 // target operating system as flagged in one of
1185 // the EXE headers; one of:
1186 #define EXEOS_UNKNOWN 0
1187 // set for non-standard PE files too
1188 #define EXEOS_DOS3 1
1189 #define EXEOS_DOS4 2
1190 // there is a flag for this in NE
1191 #define EXEOS_OS2 3
1192 #define EXEOS_WIN16 4
1193 #define EXEOS_WIN386 5
1194 // according to IBM, there are flags
1195 // for this both in NE and LX
1196 #define EXEOS_WIN32_GUI 6
1197 // Win32 GUI (see IMAGE_OPTIONAL_HEADER.usSubsystem),
1198 // if PE optional header was successfully read
1199 #define EXEOS_WIN32_CLI 7
1200 // Win32 command line (see IMAGE_OPTIONAL_HEADER.usSubsystem),
1201 // if PE optional header was successfully read
1202
1203#ifndef __STRIP_DOWN_EXECUTABLE__
1204 // The following fields are only set after
1205 // an extra call to exehQueryBldLevel (NE and LX only):
1206
1207 PSZ pszDescription;
1208 // whole string (first non-res name tbl entry)
1209 PSZ pszVendor;
1210 // vendor substring (if IBM BLDLEVEL format)
1211 PSZ pszVersion;
1212 // version substring (if IBM BLDLEVEL format)
1213
1214 PSZ pszInfo;
1215 // module info substring (if IBM BLDLEVEL format)
1216
1217 // if pszInfo is extended DESCRIPTION field, the following
1218 // are set as well:
1219 PSZ pszBuildDateTime,
1220 pszBuildMachine,
1221 pszASD,
1222 pszLanguage,
1223 pszCountry,
1224 pszRevision,
1225 pszUnknown,
1226 pszFixpak;
1227
1228 // the following fields are set after exehLoadLXMaps (LX only)
1229 BOOL fLXMapsLoaded; // TRUE after good exehLoadLXMaps
1230 RESOURCETABLEENTRY *pRsTbl; // pLXHeader->ulResTblCnt
1231 OBJECTTABLEENTRY *pObjTbl; // pLXHeader->ulObjCount
1232 OBJECTPAGETABLEENTRY *pObjPageTbl; // pLXHeader->ulPageCount
1233
1234 // the following fields are set after exehLoadOS2NEMaps (OS/2 NE only)
1235 BOOL fOS2NEMapsLoaded; // TRUE after good exehLoadOS2NEMaps
1236 POS2NERESTBLENTRY paOS2NEResTblEntry;
1237 POS2NESEGMENT paOS2NESegments;
1238 } EXECUTABLE, *PEXECUTABLE;
1239
1240 APIRET exehOpen(const char* pcszExecutable,
1241 PEXECUTABLE* ppExec);
1242
1243 APIRET exehQueryBldLevel(PEXECUTABLE pExec);
1244
1245 /*
1246 *@@ FSYSMODULE:
1247 *
1248 *@@added V0.9.9 (2001-03-11) [lafaix]
1249 */
1250
1251 typedef struct _FSYSMODULE
1252 {
1253 CHAR achModuleName[256];
1254 } FSYSMODULE, *PFSYSMODULE;
1255
1256 APIRET exehQueryImportedModules(PEXECUTABLE pExec,
1257 PFSYSMODULE *ppaModules,
1258 PULONG pcModules);
1259
1260 APIRET exehFreeImportedModules(PFSYSMODULE paModules);
1261
1262 /*
1263 *@@ FSYSFUNCTION:
1264 *
1265 *@@added V0.9.9 (2001-03-11) [lafaix]
1266 */
1267
1268 typedef struct _FSYSFUNCTION
1269 {
1270 ULONG ulOrdinal;
1271 ULONG ulType;
1272 CHAR achFunctionName[256];
1273 } FSYSFUNCTION, *PFSYSFUNCTION;
1274
1275 APIRET exehQueryExportedFunctions(PEXECUTABLE pExec,
1276 PFSYSFUNCTION *ppaFunctions,
1277 PULONG pcFunctions);
1278
1279 APIRET exehFreeExportedFunctions(PFSYSFUNCTION paFunctions);
1280
1281 #define WINRT_CURSOR 1
1282 #define WINRT_BITMAP 2
1283 #define WINRT_ICON 3
1284 #define WINRT_MENU 4
1285 #define WINRT_DIALOG 5
1286 #define WINRT_STRING 6
1287 #define WINRT_FONTDIR 7
1288 #define WINRT_FONT 8
1289 #define WINRT_ACCELERATOR 9
1290 #define WINRT_RCDATA 10
1291 #define WINRT_MESSAGELIST 11 // Win32
1292 #define WINRT_GROUP_CURSOR 12 // Win32
1293 #define WINRT_GROUP_ICON 13 // Win32
1294
1295 /*
1296 *@@ FSYSRESOURCE:
1297 *
1298 *@@added V0.9.7 (2000-12-18) [lafaix]
1299 */
1300
1301 typedef struct _FSYSRESOURCE
1302 {
1303 ULONG ulID; // resource ID
1304 ULONG ulType; // resource type
1305 ULONG ulSize; // resource size in bytes
1306 ULONG ulFlag; // resource flags
1307
1308 } FSYSRESOURCE, *PFSYSRESOURCE;
1309
1310 APIRET exehQueryResources(PEXECUTABLE pExec,
1311 PFSYSRESOURCE *ppaResources,
1312 PULONG pcResources);
1313
1314 APIRET exehFreeResources(PFSYSRESOURCE paResources);
1315
1316 APIRET exehLoadLXMaps(PEXECUTABLE pExec);
1317
1318 VOID exehFreeLXMaps(PEXECUTABLE pExec);
1319
1320 APIRET exehLoadLXResource(PEXECUTABLE pExec,
1321 ULONG ulType,
1322 ULONG idResource,
1323 PBYTE *ppbResData,
1324 PULONG pcbResData);
1325
1326 APIRET exehLoadOS2NEMaps(PEXECUTABLE pExec);
1327
1328 VOID exehFreeNEMaps(PEXECUTABLE pExec);
1329
1330 APIRET exehLoadOS2NEResource(PEXECUTABLE pExec,
1331 ULONG ulType,
1332 ULONG idResource,
1333 PBYTE *ppbResData,
1334 PULONG pcbResData);
1335
1336 APIRET exehClose(PEXECUTABLE *ppExec);
1337
1338#endif
1339
1340#endif
1341
1342#if __cplusplus
1343}
1344#endif
1345
Note: See TracBrowser for help on using the repository browser.