Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/elftoolchain/libpe/pe.h
39478 views
1
/*-
2
* Copyright (c) 2015 Kai Wang
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*
26
* $Id: pe.h 3441 2016-04-07 15:04:20Z emaste $
27
*/
28
29
#ifndef _PE_H_
30
#define _PE_H_
31
32
#include <stdint.h>
33
34
/*
35
* MS-DOS header.
36
*/
37
38
typedef struct _PE_DosHdr {
39
char dh_magic[2];
40
uint16_t dh_lastsize;
41
uint16_t dh_nblock;
42
uint16_t dh_nreloc;
43
uint16_t dh_hdrsize;
44
uint16_t dh_minalloc;
45
uint16_t dh_maxalloc;
46
uint16_t dh_ss;
47
uint16_t dh_sp;
48
uint16_t dh_checksum;
49
uint16_t dh_ip;
50
uint16_t dh_cs;
51
uint16_t dh_relocpos;
52
uint16_t dh_noverlay;
53
uint16_t dh_reserved1[4];
54
uint16_t dh_oemid;
55
uint16_t dh_oeminfo;
56
uint16_t dh_reserved2[10];
57
uint32_t dh_lfanew;
58
} PE_DosHdr;
59
60
/*
61
* Rich header.
62
*/
63
64
typedef struct _PE_RichHdr {
65
uint32_t rh_xor;
66
uint32_t rh_total;
67
uint32_t *rh_compid;
68
uint32_t *rh_cnt;
69
} PE_RichHdr;
70
71
/*
72
* COFF header: Machine Types.
73
*/
74
75
#define IMAGE_FILE_MACHINE_UNKNOWN 0x0 /* not specified */
76
#define IMAGE_FILE_MACHINE_AM33 0x1d3 /* Matsushita AM33 */
77
#define IMAGE_FILE_MACHINE_AMD64 0x8664 /* x86-64 */
78
#define IMAGE_FILE_MACHINE_ARM 0x1c0 /* ARM LE */
79
#define IMAGE_FILE_MACHINE_ARMNT 0x1c4 /* ARMv7(or higher) Thumb */
80
#define IMAGE_FILE_MACHINE_ARM64 0xaa64 /* ARMv8 64-bit */
81
#define IMAGE_FILE_MACHINE_EBC 0xebc /* EFI byte code */
82
#define IMAGE_FILE_MACHINE_I386 0x14c /* x86 */
83
#define IMAGE_FILE_MACHINE_IA64 0x200 /* IA64 */
84
#define IMAGE_FILE_MACHINE_LOONGARCH32 0x6232 /* LoongArch 32-bit */
85
#define IMAGE_FILE_MACHINE_LOONGARCH64 0x6264 /* LoongArch 64-bit */
86
#define IMAGE_FILE_MACHINE_M32R 0x9041 /* Mitsubishi M32R LE */
87
#define IMAGE_FILE_MACHINE_MIPS16 0x266 /* MIPS16 */
88
#define IMAGE_FILE_MACHINE_MIPSFPU 0x366 /* MIPS with FPU */
89
#define IMAGE_FILE_MACHINE_MIPSFPU16 0x466 /* MIPS16 with FPU */
90
#define IMAGE_FILE_MACHINE_POWERPC 0x1f0 /* Power PC LE */
91
#define IMAGE_FILE_MACHINE_POWERPCFP 0x1f1 /* Power PC floating point */
92
#define IMAGE_FILE_MACHINE_R4000 0x166 /* MIPS R4000 LE */
93
#define IMAGE_FILE_MACHINE_RISCV32 0x5032 /* RISC-V 32-bit */
94
#define IMAGE_FILE_MACHINE_RISCV64 0x5064 /* RISC-V 64-bit */
95
#define IMAGE_FILE_MACHINE_RISCV128 0x5128 /* RISC-V 128-bit */
96
#define IMAGE_FILE_MACHINE_SH3 0x1a2 /* Hitachi SH3 */
97
#define IMAGE_FILE_MACHINE_SH3DSP 0x1a3 /* Hitachi SH3 DSP */
98
#define IMAGE_FILE_MACHINE_SH4 0x1a6 /* Hitachi SH4 */
99
#define IMAGE_FILE_MACHINE_SH5 0x1a8 /* Hitachi SH5 */
100
#define IMAGE_FILE_MACHINE_THUMB 0x1c2 /* ARM or Thumb interworking */
101
#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x169 /* MIPS LE WCE v2 */
102
103
/*
104
* COFF header: Characteristics
105
*/
106
107
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
108
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
109
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
110
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
111
#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010
112
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
113
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
114
#define IMAGE_FILE_32BIT_MACHINE 0x0100
115
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
116
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
117
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
118
#define IMAGE_FILE_SYSTEM 0x1000
119
#define IMAGE_FILE_DLL 0x2000
120
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
121
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
122
123
/*
124
* COFF Header.
125
*/
126
127
typedef struct _PE_CoffHdr {
128
uint16_t ch_machine;
129
uint16_t ch_nsec;
130
uint32_t ch_timestamp;
131
uint32_t ch_symptr;
132
uint32_t ch_nsym;
133
uint16_t ch_optsize;
134
uint16_t ch_char;
135
} PE_CoffHdr;
136
137
138
/*
139
* Optional Header: Subsystem.
140
*/
141
142
#define IMAGE_SUBSYSTEM_UNKNOWN 0
143
#define IMAGE_SUBSYSTEM_NATIVE 1
144
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
145
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
146
#define IMAGE_SUBSYSTEM_POSIX_CUI 7
147
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
148
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
149
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
150
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
151
#define IMAGE_SUBSYSTEM_EFI_ROM 13
152
#define IMAGE_SUBSYSTEM_XBOX 14
153
154
/*
155
* Optional Header: DLL Characteristics
156
*/
157
158
#define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 0x0040
159
#define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY 0x0080
160
#define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 0x0100
161
#define IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION 0x0200
162
#define IMAGE_DLL_CHARACTERISTICS_NO_SEH 0x0400
163
#define IMAGE_DLL_CHARACTERISTICS_NO_BIND 0x0800
164
#define IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER 0x2000
165
#define IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
166
167
/*
168
* Optional Header.
169
*/
170
171
#define PE_FORMAT_ROM 0x107
172
#define PE_FORMAT_32 0x10b
173
#define PE_FORMAT_32P 0x20b
174
175
typedef struct _PE_OptHdr {
176
uint16_t oh_magic;
177
uint8_t oh_ldvermajor;
178
uint8_t oh_ldverminor;
179
uint32_t oh_textsize;
180
uint32_t oh_datasize;
181
uint32_t oh_bsssize;
182
uint32_t oh_entry;
183
uint32_t oh_textbase;
184
uint32_t oh_database;
185
uint64_t oh_imgbase;
186
uint32_t oh_secalign;
187
uint32_t oh_filealign;
188
uint16_t oh_osvermajor;
189
uint16_t oh_osverminor;
190
uint16_t oh_imgvermajor;
191
uint16_t oh_imgverminor;
192
uint16_t oh_subvermajor;
193
uint16_t oh_subverminor;
194
uint32_t oh_win32ver;
195
uint32_t oh_imgsize;
196
uint32_t oh_hdrsize;
197
uint32_t oh_checksum;
198
uint16_t oh_subsystem;
199
uint16_t oh_dllchar;
200
uint64_t oh_stacksizer;
201
uint64_t oh_stacksizec;
202
uint64_t oh_heapsizer;
203
uint64_t oh_heapsizec;
204
uint32_t oh_ldrflags;
205
uint32_t oh_ndatadir;
206
} PE_OptHdr;
207
208
/*
209
* Optional Header: Data Directories.
210
*/
211
212
#define PE_DD_EXPORT 0
213
#define PE_DD_IMPORT 1
214
#define PE_DD_RESROUCE 2
215
#define PE_DD_EXCEPTION 3
216
#define PE_DD_CERTIFICATE 4
217
#define PE_DD_BASERELOC 5
218
#define PE_DD_DEBUG 6
219
#define PE_DD_ARCH 7
220
#define PE_DD_GLOBALPTR 8
221
#define PE_DD_TLS 9
222
#define PE_DD_LOADCONFIG 10
223
#define PE_DD_BOUNDIMPORT 11
224
#define PE_DD_IAT 12
225
#define PE_DD_DELAYIMPORT 13
226
#define PE_DD_CLRRUNTIME 14
227
#define PE_DD_RESERVED 15
228
#define PE_DD_MAX 16
229
230
typedef struct _PE_DataDirEntry {
231
uint32_t de_addr;
232
uint32_t de_size;
233
} PE_DataDirEntry;
234
235
typedef struct _PE_DataDir {
236
PE_DataDirEntry dd_e[PE_DD_MAX];
237
uint32_t dd_total;
238
} PE_DataDir;
239
240
/*
241
* Section Headers: Section flags.
242
*/
243
244
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008
245
#define IMAGE_SCN_CNT_CODE 0x00000020
246
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
247
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
248
#define IMAGE_SCN_LNK_OTHER 0x00000100
249
#define IMAGE_SCN_LNK_INFO 0x00000200
250
#define IMAGE_SCN_LNK_REMOVE 0x00000800
251
#define IMAGE_SCN_LNK_COMDAT 0x00001000
252
#define IMAGE_SCN_GPREL 0x00008000
253
#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
254
#define IMAGE_SCN_MEM_16BIT 0x00020000
255
#define IMAGE_SCN_MEM_LOCKED 0x00040000
256
#define IMAGE_SCN_MEM_PRELOAD 0x00080000
257
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
258
#define IMAGE_SCN_ALIGN_2BYTES 0x00200000
259
#define IMAGE_SCN_ALIGN_4BYTES 0x00300000
260
#define IMAGE_SCN_ALIGN_8BYTES 0x00400000
261
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000
262
#define IMAGE_SCN_ALIGN_32BYTES 0x00600000
263
#define IMAGE_SCN_ALIGN_64BYTES 0x00700000
264
#define IMAGE_SCN_ALIGN_128BYTES 0x00800000
265
#define IMAGE_SCN_ALIGN_256BYTES 0x00900000
266
#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000
267
#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000
268
#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000
269
#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000
270
#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000
271
#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
272
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
273
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
274
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
275
#define IMAGE_SCN_MEM_SHARED 0x10000000
276
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
277
#define IMAGE_SCN_MEM_READ 0x40000000
278
#define IMAGE_SCN_MEM_WRITE 0x80000000
279
280
/*
281
* Section Headers.
282
*/
283
284
typedef struct _PE_SecHdr {
285
char sh_name[8];
286
uint32_t sh_virtsize;
287
uint32_t sh_addr;
288
uint32_t sh_rawsize;
289
uint32_t sh_rawptr;
290
uint32_t sh_relocptr;
291
uint32_t sh_lineptr;
292
uint16_t sh_nreloc;
293
uint16_t sh_nline;
294
uint32_t sh_char;
295
} PE_SecHdr;
296
297
#endif /* !_PE_H_ */
298
299