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 Mller,
|
---|
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
|
---|
28 | extern "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)
|
---|
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)
|
---|
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 |
|
---|