0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __LINUX_PE_H
0009 #define __LINUX_PE_H
0010
0011 #include <linux/types.h>
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 #define LINUX_EFISTUB_MAJOR_VERSION 0x1
0032 #define LINUX_EFISTUB_MINOR_VERSION 0x0
0033
0034 #define MZ_MAGIC 0x5a4d
0035
0036 #define PE_MAGIC 0x00004550
0037 #define PE_OPT_MAGIC_PE32 0x010b
0038 #define PE_OPT_MAGIC_PE32_ROM 0x0107
0039 #define PE_OPT_MAGIC_PE32PLUS 0x020b
0040
0041
0042 #define IMAGE_FILE_MACHINE_UNKNOWN 0x0000
0043 #define IMAGE_FILE_MACHINE_AM33 0x01d3
0044 #define IMAGE_FILE_MACHINE_AMD64 0x8664
0045 #define IMAGE_FILE_MACHINE_ARM 0x01c0
0046 #define IMAGE_FILE_MACHINE_ARMV7 0x01c4
0047 #define IMAGE_FILE_MACHINE_ARM64 0xaa64
0048 #define IMAGE_FILE_MACHINE_EBC 0x0ebc
0049 #define IMAGE_FILE_MACHINE_I386 0x014c
0050 #define IMAGE_FILE_MACHINE_IA64 0x0200
0051 #define IMAGE_FILE_MACHINE_M32R 0x9041
0052 #define IMAGE_FILE_MACHINE_MIPS16 0x0266
0053 #define IMAGE_FILE_MACHINE_MIPSFPU 0x0366
0054 #define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466
0055 #define IMAGE_FILE_MACHINE_POWERPC 0x01f0
0056 #define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
0057 #define IMAGE_FILE_MACHINE_R4000 0x0166
0058 #define IMAGE_FILE_MACHINE_RISCV32 0x5032
0059 #define IMAGE_FILE_MACHINE_RISCV64 0x5064
0060 #define IMAGE_FILE_MACHINE_RISCV128 0x5128
0061 #define IMAGE_FILE_MACHINE_SH3 0x01a2
0062 #define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
0063 #define IMAGE_FILE_MACHINE_SH3E 0x01a4
0064 #define IMAGE_FILE_MACHINE_SH4 0x01a6
0065 #define IMAGE_FILE_MACHINE_SH5 0x01a8
0066 #define IMAGE_FILE_MACHINE_THUMB 0x01c2
0067 #define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169
0068
0069
0070 #define IMAGE_FILE_RELOCS_STRIPPED 0x0001
0071 #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
0072 #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
0073 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
0074 #define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010
0075 #define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
0076 #define IMAGE_FILE_16BIT_MACHINE 0x0040
0077 #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
0078 #define IMAGE_FILE_32BIT_MACHINE 0x0100
0079 #define IMAGE_FILE_DEBUG_STRIPPED 0x0200
0080 #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
0081 #define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
0082 #define IMAGE_FILE_SYSTEM 0x1000
0083 #define IMAGE_FILE_DLL 0x2000
0084 #define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
0085 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
0086
0087 #define IMAGE_FILE_OPT_ROM_MAGIC 0x107
0088 #define IMAGE_FILE_OPT_PE32_MAGIC 0x10b
0089 #define IMAGE_FILE_OPT_PE32_PLUS_MAGIC 0x20b
0090
0091 #define IMAGE_SUBSYSTEM_UNKNOWN 0
0092 #define IMAGE_SUBSYSTEM_NATIVE 1
0093 #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
0094 #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
0095 #define IMAGE_SUBSYSTEM_POSIX_CUI 7
0096 #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
0097 #define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
0098 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
0099 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
0100 #define IMAGE_SUBSYSTEM_EFI_ROM_IMAGE 13
0101 #define IMAGE_SUBSYSTEM_XBOX 14
0102
0103 #define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 0x0040
0104 #define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY 0x0080
0105 #define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 0x0100
0106 #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
0107 #define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
0108 #define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
0109 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
0110 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
0111
0112
0113 #define IMAGE_SCN_RESERVED_0 0x00000001
0114 #define IMAGE_SCN_RESERVED_1 0x00000002
0115 #define IMAGE_SCN_RESERVED_2 0x00000004
0116 #define IMAGE_SCN_TYPE_NO_PAD 0x00000008
0117 #define IMAGE_SCN_RESERVED_3 0x00000010
0118 #define IMAGE_SCN_CNT_CODE 0x00000020
0119 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
0120 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
0121 #define IMAGE_SCN_LNK_OTHER 0x00000100
0122 #define IMAGE_SCN_LNK_INFO 0x00000200
0123 #define IMAGE_SCN_RESERVED_4 0x00000400
0124 #define IMAGE_SCN_LNK_REMOVE 0x00000800
0125 #define IMAGE_SCN_LNK_COMDAT 0x00001000
0126 #define IMAGE_SCN_RESERVED_5 0x00002000
0127 #define IMAGE_SCN_RESERVED_6 0x00004000
0128 #define IMAGE_SCN_GPREL 0x00008000
0129
0130 #define IMAGE_SCN_MEM_PURGEABLE 0x00010000
0131 #define IMAGE_SCN_16BIT 0x00020000
0132 #define IMAGE_SCN_LOCKED 0x00040000
0133 #define IMAGE_SCN_PRELOAD 0x00080000
0134
0135 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000
0136 #define IMAGE_SCN_ALIGN_2BYTES 0x00200000
0137 #define IMAGE_SCN_ALIGN_4BYTES 0x00300000
0138 #define IMAGE_SCN_ALIGN_8BYTES 0x00400000
0139 #define IMAGE_SCN_ALIGN_16BYTES 0x00500000
0140 #define IMAGE_SCN_ALIGN_32BYTES 0x00600000
0141 #define IMAGE_SCN_ALIGN_64BYTES 0x00700000
0142 #define IMAGE_SCN_ALIGN_128BYTES 0x00800000
0143 #define IMAGE_SCN_ALIGN_256BYTES 0x00900000
0144 #define IMAGE_SCN_ALIGN_512BYTES 0x00a00000
0145 #define IMAGE_SCN_ALIGN_1024BYTES 0x00b00000
0146 #define IMAGE_SCN_ALIGN_2048BYTES 0x00c00000
0147 #define IMAGE_SCN_ALIGN_4096BYTES 0x00d00000
0148 #define IMAGE_SCN_ALIGN_8192BYTES 0x00e00000
0149 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
0150 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
0151 #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
0152 #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
0153 #define IMAGE_SCN_MEM_SHARED 0x10000000
0154 #define IMAGE_SCN_MEM_EXECUTE 0x20000000
0155 #define IMAGE_SCN_MEM_READ 0x40000000
0156 #define IMAGE_SCN_MEM_WRITE 0x80000000
0157
0158 #define IMAGE_DEBUG_TYPE_CODEVIEW 2
0159
0160 #ifndef __ASSEMBLY__
0161
0162 struct mz_hdr {
0163 uint16_t magic;
0164 uint16_t lbsize;
0165 uint16_t blocks;
0166 uint16_t relocs;
0167 uint16_t hdrsize;
0168 uint16_t min_extra_pps;
0169 uint16_t max_extra_pps;
0170 uint16_t ss;
0171 uint16_t sp;
0172 uint16_t checksum;
0173 uint16_t ip;
0174 uint16_t cs;
0175 uint16_t reloc_table_offset;
0176 uint16_t overlay_num;
0177 uint16_t reserved0[4];
0178 uint16_t oem_id;
0179 uint16_t oem_info;
0180 uint16_t reserved1[10];
0181 uint32_t peaddr;
0182 char message[];
0183 };
0184
0185 struct mz_reloc {
0186 uint16_t offset;
0187 uint16_t segment;
0188 };
0189
0190 struct pe_hdr {
0191 uint32_t magic;
0192 uint16_t machine;
0193 uint16_t sections;
0194 uint32_t timestamp;
0195 uint32_t symbol_table;
0196 uint32_t symbols;
0197 uint16_t opt_hdr_size;
0198 uint16_t flags;
0199 };
0200
0201
0202
0203 struct pe32_opt_hdr {
0204
0205 uint16_t magic;
0206 uint8_t ld_major;
0207 uint8_t ld_minor;
0208 uint32_t text_size;
0209 uint32_t data_size;
0210 uint32_t bss_size;
0211 uint32_t entry_point;
0212 uint32_t code_base;
0213 uint32_t data_base;
0214
0215 uint32_t image_base;
0216 uint32_t section_align;
0217 uint32_t file_align;
0218 uint16_t os_major;
0219 uint16_t os_minor;
0220 uint16_t image_major;
0221 uint16_t image_minor;
0222 uint16_t subsys_major;
0223 uint16_t subsys_minor;
0224 uint32_t win32_version;
0225 uint32_t image_size;
0226 uint32_t header_size;
0227
0228 uint32_t csum;
0229 uint16_t subsys;
0230 uint16_t dll_flags;
0231 uint32_t stack_size_req;
0232 uint32_t stack_size;
0233 uint32_t heap_size_req;
0234 uint32_t heap_size;
0235 uint32_t loader_flags;
0236 uint32_t data_dirs;
0237 };
0238
0239 struct pe32plus_opt_hdr {
0240 uint16_t magic;
0241 uint8_t ld_major;
0242 uint8_t ld_minor;
0243 uint32_t text_size;
0244 uint32_t data_size;
0245 uint32_t bss_size;
0246 uint32_t entry_point;
0247 uint32_t code_base;
0248
0249 uint64_t image_base;
0250 uint32_t section_align;
0251 uint32_t file_align;
0252 uint16_t os_major;
0253 uint16_t os_minor;
0254 uint16_t image_major;
0255 uint16_t image_minor;
0256 uint16_t subsys_major;
0257 uint16_t subsys_minor;
0258 uint32_t win32_version;
0259 uint32_t image_size;
0260 uint32_t header_size;
0261
0262 uint32_t csum;
0263 uint16_t subsys;
0264 uint16_t dll_flags;
0265 uint64_t stack_size_req;
0266 uint64_t stack_size;
0267 uint64_t heap_size_req;
0268 uint64_t heap_size;
0269 uint32_t loader_flags;
0270 uint32_t data_dirs;
0271 };
0272
0273 struct data_dirent {
0274 uint32_t virtual_address;
0275 uint32_t size;
0276 };
0277
0278 struct data_directory {
0279 struct data_dirent exports;
0280 struct data_dirent imports;
0281 struct data_dirent resources;
0282 struct data_dirent exceptions;
0283 struct data_dirent certs;
0284 struct data_dirent base_relocations;
0285 struct data_dirent debug;
0286 struct data_dirent arch;
0287 struct data_dirent global_ptr;
0288 struct data_dirent tls;
0289 struct data_dirent load_config;
0290 struct data_dirent bound_imports;
0291 struct data_dirent import_addrs;
0292 struct data_dirent delay_imports;
0293 struct data_dirent clr_runtime_hdr;
0294 struct data_dirent reserved;
0295 };
0296
0297 struct section_header {
0298 char name[8];
0299 uint32_t virtual_size;
0300 uint32_t virtual_address;
0301 uint32_t raw_data_size;
0302 uint32_t data_addr;
0303 uint32_t relocs;
0304 uint32_t line_numbers;
0305 uint16_t num_relocs;
0306 uint16_t num_lin_numbers;
0307 uint32_t flags;
0308 };
0309
0310 enum x64_coff_reloc_type {
0311 IMAGE_REL_AMD64_ABSOLUTE = 0,
0312 IMAGE_REL_AMD64_ADDR64,
0313 IMAGE_REL_AMD64_ADDR32,
0314 IMAGE_REL_AMD64_ADDR32N,
0315 IMAGE_REL_AMD64_REL32,
0316 IMAGE_REL_AMD64_REL32_1,
0317 IMAGE_REL_AMD64_REL32_2,
0318 IMAGE_REL_AMD64_REL32_3,
0319 IMAGE_REL_AMD64_REL32_4,
0320 IMAGE_REL_AMD64_REL32_5,
0321 IMAGE_REL_AMD64_SECTION,
0322 IMAGE_REL_AMD64_SECREL,
0323 IMAGE_REL_AMD64_SECREL7,
0324 IMAGE_REL_AMD64_TOKEN,
0325 IMAGE_REL_AMD64_SREL32,
0326 IMAGE_REL_AMD64_PAIR,
0327 IMAGE_REL_AMD64_SSPAN32,
0328 };
0329
0330 enum arm_coff_reloc_type {
0331 IMAGE_REL_ARM_ABSOLUTE,
0332 IMAGE_REL_ARM_ADDR32,
0333 IMAGE_REL_ARM_ADDR32N,
0334 IMAGE_REL_ARM_BRANCH2,
0335 IMAGE_REL_ARM_BRANCH1,
0336 IMAGE_REL_ARM_SECTION,
0337 IMAGE_REL_ARM_SECREL,
0338 };
0339
0340 enum sh_coff_reloc_type {
0341 IMAGE_REL_SH3_ABSOLUTE,
0342 IMAGE_REL_SH3_DIRECT16,
0343 IMAGE_REL_SH3_DIRECT32,
0344 IMAGE_REL_SH3_DIRECT8,
0345 IMAGE_REL_SH3_DIRECT8_WORD,
0346 IMAGE_REL_SH3_DIRECT8_LONG,
0347 IMAGE_REL_SH3_DIRECT4,
0348 IMAGE_REL_SH3_DIRECT4_WORD,
0349 IMAGE_REL_SH3_DIRECT4_LONG,
0350 IMAGE_REL_SH3_PCREL8_WORD,
0351 IMAGE_REL_SH3_PCREL8_LONG,
0352 IMAGE_REL_SH3_PCREL12_WORD,
0353 IMAGE_REL_SH3_STARTOF_SECTION,
0354 IMAGE_REL_SH3_SIZEOF_SECTION,
0355 IMAGE_REL_SH3_SECTION,
0356 IMAGE_REL_SH3_SECREL,
0357 IMAGE_REL_SH3_DIRECT32_NB,
0358 IMAGE_REL_SH3_GPREL4_LONG,
0359 IMAGE_REL_SH3_TOKEN,
0360 IMAGE_REL_SHM_PCRELPT,
0361 IMAGE_REL_SHM_REFLO,
0362 IMAGE_REL_SHM_REFHALF,
0363 IMAGE_REL_SHM_RELLO,
0364 IMAGE_REL_SHM_RELHALF,
0365 IMAGE_REL_SHM_PAIR,
0366 IMAGE_REL_SHM_NOMODE,
0367 };
0368
0369 enum ppc_coff_reloc_type {
0370 IMAGE_REL_PPC_ABSOLUTE,
0371 IMAGE_REL_PPC_ADDR64,
0372 IMAGE_REL_PPC_ADDR32,
0373 IMAGE_REL_PPC_ADDR24,
0374 IMAGE_REL_PPC_ADDR16,
0375 IMAGE_REL_PPC_ADDR14,
0376 IMAGE_REL_PPC_REL24,
0377 IMAGE_REL_PPC_REL14,
0378 IMAGE_REL_PPC_ADDR32N,
0379 IMAGE_REL_PPC_SECREL,
0380 IMAGE_REL_PPC_SECTION,
0381 IMAGE_REL_PPC_SECREL16,
0382 IMAGE_REL_PPC_REFHI,
0383 IMAGE_REL_PPC_REFLO,
0384 IMAGE_REL_PPC_PAIR,
0385 IMAGE_REL_PPC_SECRELLO,
0386 IMAGE_REL_PPC_GPREL,
0387 IMAGE_REL_PPC_TOKEN,
0388 };
0389
0390 enum x86_coff_reloc_type {
0391 IMAGE_REL_I386_ABSOLUTE,
0392 IMAGE_REL_I386_DIR16,
0393 IMAGE_REL_I386_REL16,
0394 IMAGE_REL_I386_DIR32,
0395 IMAGE_REL_I386_DIR32NB,
0396 IMAGE_REL_I386_SEG12,
0397 IMAGE_REL_I386_SECTION,
0398 IMAGE_REL_I386_SECREL,
0399 IMAGE_REL_I386_TOKEN,
0400 IMAGE_REL_I386_SECREL7,
0401 IMAGE_REL_I386_REL32,
0402 };
0403
0404 enum ia64_coff_reloc_type {
0405 IMAGE_REL_IA64_ABSOLUTE,
0406 IMAGE_REL_IA64_IMM14,
0407 IMAGE_REL_IA64_IMM22,
0408 IMAGE_REL_IA64_IMM64,
0409 IMAGE_REL_IA64_DIR32,
0410 IMAGE_REL_IA64_DIR64,
0411 IMAGE_REL_IA64_PCREL21B,
0412 IMAGE_REL_IA64_PCREL21M,
0413 IMAGE_REL_IA64_PCREL21F,
0414 IMAGE_REL_IA64_GPREL22,
0415 IMAGE_REL_IA64_LTOFF22,
0416 IMAGE_REL_IA64_SECTION,
0417 IMAGE_REL_IA64_SECREL22,
0418 IMAGE_REL_IA64_SECREL64I,
0419 IMAGE_REL_IA64_SECREL32,
0420 IMAGE_REL_IA64_DIR32NB,
0421 IMAGE_REL_IA64_SREL14,
0422 IMAGE_REL_IA64_SREL22,
0423 IMAGE_REL_IA64_SREL32,
0424 IMAGE_REL_IA64_UREL32,
0425 IMAGE_REL_IA64_PCREL60X,
0426 IMAGE_REL_IA64_PCREL60B,
0427 IMAGE_REL_IA64_PCREL60F,
0428 IMAGE_REL_IA64_PCREL60I,
0429 IMAGE_REL_IA64_PCREL60M,
0430 IMAGE_REL_IA64_IMMGPREL6,
0431 IMAGE_REL_IA64_TOKEN,
0432 IMAGE_REL_IA64_GPREL32,
0433 IMAGE_REL_IA64_ADDEND,
0434 };
0435
0436 struct coff_reloc {
0437 uint32_t virtual_address;
0438 uint32_t symbol_table_index;
0439 union {
0440 enum x64_coff_reloc_type x64_type;
0441 enum arm_coff_reloc_type arm_type;
0442 enum sh_coff_reloc_type sh_type;
0443 enum ppc_coff_reloc_type ppc_type;
0444 enum x86_coff_reloc_type x86_type;
0445 enum ia64_coff_reloc_type ia64_type;
0446 uint16_t data;
0447 };
0448 };
0449
0450
0451
0452
0453 #define WIN_CERT_TYPE_PKCS_SIGNED_DATA 0x0002
0454 #define WIN_CERT_TYPE_EFI_OKCS115 0x0EF0
0455 #define WIN_CERT_TYPE_EFI_GUID 0x0EF1
0456
0457 #define WIN_CERT_REVISION_1_0 0x0100
0458 #define WIN_CERT_REVISION_2_0 0x0200
0459
0460 struct win_certificate {
0461 uint32_t length;
0462 uint16_t revision;
0463 uint16_t cert_type;
0464 };
0465
0466 #endif
0467
0468 #endif