#![allow(missing_docs)]
use core::convert::TryInto;
#[cfg(feature = "names")]
use crate::constants::{ConstantNames, FlagNames};
use crate::endian::{I32, LittleEndian as LE, U16, U32, U64};
use crate::pod::Pod;
#[cfg(feature = "names")]
#[derive(Debug)]
#[non_exhaustive]
pub struct Names {
pub rel: &'static FlagNames<RelocationType>,
pub rel_based: &'static ConstantNames<BaseRelocationType>,
}
#[cfg(feature = "names")]
pub const fn names() -> &'static Names {
Base::names()
}
#[cfg(feature = "names")]
pub const fn machine_names(machine: Machine) -> &'static Names {
match machine {
IMAGE_FILE_MACHINE_I386 => I386::names(),
IMAGE_FILE_MACHINE_MIPS16 | IMAGE_FILE_MACHINE_MIPSFPU | IMAGE_FILE_MACHINE_MIPSFPU16 => {
Mips::names()
}
IMAGE_FILE_MACHINE_ALPHA | IMAGE_FILE_MACHINE_ALPHA64 => Alpha::names(),
IMAGE_FILE_MACHINE_POWERPC
| IMAGE_FILE_MACHINE_POWERPCFP
| IMAGE_FILE_MACHINE_POWERPCBE => Ppc::names(),
IMAGE_FILE_MACHINE_SH3
| IMAGE_FILE_MACHINE_SH3DSP
| IMAGE_FILE_MACHINE_SH3E
| IMAGE_FILE_MACHINE_SH4
| IMAGE_FILE_MACHINE_SH5 => Sh::names(),
IMAGE_FILE_MACHINE_ARM => Arm::names(),
IMAGE_FILE_MACHINE_AM33 => Am::names(),
IMAGE_FILE_MACHINE_ARM64 => Arm64::names(),
IMAGE_FILE_MACHINE_AMD64 => Amd64::names(),
IMAGE_FILE_MACHINE_IA64 => Ia64::names(),
IMAGE_FILE_MACHINE_CEF => Cef::names(),
IMAGE_FILE_MACHINE_CEE => Cee::names(),
IMAGE_FILE_MACHINE_M32R => M32r::names(),
IMAGE_FILE_MACHINE_EBC => Ebc::names(),
IMAGE_FILE_MACHINE_RISCV32 | IMAGE_FILE_MACHINE_RISCV64 | IMAGE_FILE_MACHINE_RISCV128 => {
Riscv::names()
}
_ => Base::names(),
}
}
names! {
struct Base;
flags rel: RelocationType = {};
consts rel_based = NAMES_REL_BASED;
}
pub const IMAGE_DOS_SIGNATURE: u16 = 0x5A4D;
pub const IMAGE_OS2_SIGNATURE: u16 = 0x454E;
pub const IMAGE_OS2_SIGNATURE_LE: u16 = 0x454C;
pub const IMAGE_VXD_SIGNATURE: u16 = 0x454C;
pub const IMAGE_NT_SIGNATURE: u32 = 0x0000_4550;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDosHeader {
pub e_magic: U16<LE>,
pub e_cblp: U16<LE>,
pub e_cp: U16<LE>,
pub e_crlc: U16<LE>,
pub e_cparhdr: U16<LE>,
pub e_minalloc: U16<LE>,
pub e_maxalloc: U16<LE>,
pub e_ss: U16<LE>,
pub e_sp: U16<LE>,
pub e_csum: U16<LE>,
pub e_ip: U16<LE>,
pub e_cs: U16<LE>,
pub e_lfarlc: U16<LE>,
pub e_ovno: U16<LE>,
pub e_res: [U16<LE>; 4],
pub e_oemid: U16<LE>,
pub e_oeminfo: U16<LE>,
pub e_res2: [U16<LE>; 10],
pub e_lfanew: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageOs2Header {
pub ne_magic: U16<LE>,
pub ne_ver: i8,
pub ne_rev: i8,
pub ne_enttab: U16<LE>,
pub ne_cbenttab: U16<LE>,
pub ne_crc: I32<LE>,
pub ne_flags: U16<LE>,
pub ne_autodata: U16<LE>,
pub ne_heap: U16<LE>,
pub ne_stack: U16<LE>,
pub ne_csip: I32<LE>,
pub ne_sssp: I32<LE>,
pub ne_cseg: U16<LE>,
pub ne_cmod: U16<LE>,
pub ne_cbnrestab: U16<LE>,
pub ne_segtab: U16<LE>,
pub ne_rsrctab: U16<LE>,
pub ne_restab: U16<LE>,
pub ne_modtab: U16<LE>,
pub ne_imptab: U16<LE>,
pub ne_nrestab: I32<LE>,
pub ne_cmovent: U16<LE>,
pub ne_align: U16<LE>,
pub ne_cres: U16<LE>,
pub ne_exetyp: u8,
pub ne_flagsothers: u8,
pub ne_pretthunks: U16<LE>,
pub ne_psegrefbytes: U16<LE>,
pub ne_swaparea: U16<LE>,
pub ne_expver: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageVxdHeader {
pub e32_magic: U16<LE>,
pub e32_border: u8,
pub e32_worder: u8,
pub e32_level: U32<LE>,
pub e32_cpu: U16<LE>,
pub e32_os: U16<LE>,
pub e32_ver: U32<LE>,
pub e32_mflags: U32<LE>,
pub e32_mpages: U32<LE>,
pub e32_startobj: U32<LE>,
pub e32_eip: U32<LE>,
pub e32_stackobj: U32<LE>,
pub e32_esp: U32<LE>,
pub e32_pagesize: U32<LE>,
pub e32_lastpagesize: U32<LE>,
pub e32_fixupsize: U32<LE>,
pub e32_fixupsum: U32<LE>,
pub e32_ldrsize: U32<LE>,
pub e32_ldrsum: U32<LE>,
pub e32_objtab: U32<LE>,
pub e32_objcnt: U32<LE>,
pub e32_objmap: U32<LE>,
pub e32_itermap: U32<LE>,
pub e32_rsrctab: U32<LE>,
pub e32_rsrccnt: U32<LE>,
pub e32_restab: U32<LE>,
pub e32_enttab: U32<LE>,
pub e32_dirtab: U32<LE>,
pub e32_dircnt: U32<LE>,
pub e32_fpagetab: U32<LE>,
pub e32_frectab: U32<LE>,
pub e32_impmod: U32<LE>,
pub e32_impmodcnt: U32<LE>,
pub e32_impproc: U32<LE>,
pub e32_pagesum: U32<LE>,
pub e32_datapage: U32<LE>,
pub e32_preload: U32<LE>,
pub e32_nrestab: U32<LE>,
pub e32_cbnrestab: U32<LE>,
pub e32_nressum: U32<LE>,
pub e32_autodata: U32<LE>,
pub e32_debuginfo: U32<LE>,
pub e32_debuglen: U32<LE>,
pub e32_instpreload: U32<LE>,
pub e32_instdemand: U32<LE>,
pub e32_heapsize: U32<LE>,
pub e32_res3: [u8; 12],
pub e32_winresoff: U32<LE>,
pub e32_winreslen: U32<LE>,
pub e32_devid: U16<LE>,
pub e32_ddkver: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct MaskedRichHeaderEntry {
pub masked_comp_id: U32<LE>,
pub masked_count: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageFileHeader {
pub machine: U16<LE, Machine>,
pub number_of_sections: U16<LE>,
pub time_date_stamp: U32<LE>,
pub pointer_to_symbol_table: U32<LE>,
pub number_of_symbols: U32<LE>,
pub size_of_optional_header: U16<LE>,
pub characteristics: U16<LE, FileFlags>,
}
pub const IMAGE_SIZEOF_FILE_HEADER: usize = 20;
newtype!(
struct FileFlags(u16);
);
newtype_flag_names!(NAMES_FILE_FLAGS: FileFlags(u16) = {
IMAGE_FILE_RELOCS_STRIPPED = 0x0001,
IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002,
IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004,
IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008,
IMAGE_FILE_AGGRESIVE_WS_TRIM = 0x0010,
IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020,
IMAGE_FILE_BYTES_REVERSED_LO = 0x0080,
IMAGE_FILE_32BIT_MACHINE = 0x0100,
IMAGE_FILE_DEBUG_STRIPPED = 0x0200,
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400,
IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800,
IMAGE_FILE_SYSTEM = 0x1000,
IMAGE_FILE_DLL = 0x2000,
IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000,
IMAGE_FILE_BYTES_REVERSED_HI = 0x8000,
});
newtype!(
struct Machine(u16);
);
newtype_constant_names!(NAMES_MACHINE: Machine(u16) = {
IMAGE_FILE_MACHINE_UNKNOWN = 0,
IMAGE_FILE_MACHINE_TARGET_HOST = 0x0001,
IMAGE_FILE_MACHINE_I386 = 0x014c,
IMAGE_FILE_MACHINE_R3000 = 0x0162,
IMAGE_FILE_MACHINE_R4000 = 0x0166,
IMAGE_FILE_MACHINE_R10000 = 0x0168,
IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x0169,
IMAGE_FILE_MACHINE_ALPHA = 0x0184,
IMAGE_FILE_MACHINE_SH3 = 0x01a2,
IMAGE_FILE_MACHINE_SH3DSP = 0x01a3,
IMAGE_FILE_MACHINE_SH3E = 0x01a4,
IMAGE_FILE_MACHINE_SH4 = 0x01a6,
IMAGE_FILE_MACHINE_SH5 = 0x01a8,
IMAGE_FILE_MACHINE_ARM = 0x01c0,
IMAGE_FILE_MACHINE_THUMB = 0x01c2,
IMAGE_FILE_MACHINE_ARMNT = 0x01c4,
IMAGE_FILE_MACHINE_AM33 = 0x01d3,
IMAGE_FILE_MACHINE_POWERPC = 0x01F0,
IMAGE_FILE_MACHINE_POWERPCFP = 0x01f1,
IMAGE_FILE_MACHINE_POWERPCBE = 0x01f2,
IMAGE_FILE_MACHINE_IA64 = 0x0200,
IMAGE_FILE_MACHINE_MIPS16 = 0x0266,
IMAGE_FILE_MACHINE_ALPHA64 = 0x0284,
IMAGE_FILE_MACHINE_MIPSFPU = 0x0366,
IMAGE_FILE_MACHINE_MIPSFPU16 = 0x0466,
IMAGE_FILE_MACHINE_AXP64 = IMAGE_FILE_MACHINE_ALPHA64.0,
IMAGE_FILE_MACHINE_TRICORE = 0x0520,
IMAGE_FILE_MACHINE_CEF = 0x0CEF,
IMAGE_FILE_MACHINE_EBC = 0x0EBC,
IMAGE_FILE_MACHINE_AMD64 = 0x8664,
IMAGE_FILE_MACHINE_M32R = 0x9041,
IMAGE_FILE_MACHINE_ARM64 = 0xAA64,
IMAGE_FILE_MACHINE_ARM64EC = 0xA641,
IMAGE_FILE_MACHINE_CEE = 0xC0EE,
IMAGE_FILE_MACHINE_RISCV32 = 0x5032,
IMAGE_FILE_MACHINE_RISCV64 = 0x5064,
IMAGE_FILE_MACHINE_RISCV128 = 0x5128,
IMAGE_FILE_MACHINE_ARM64X = 0xA64E,
IMAGE_FILE_MACHINE_CHPE_X86 = 0x3A64,
});
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDataDirectory {
pub virtual_address: U32<LE>,
pub size: U32<LE>,
}
pub const IMAGE_NUMBEROF_DIRECTORY_ENTRIES: usize = 16;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageOptionalHeader32 {
pub magic: U16<LE>,
pub major_linker_version: u8,
pub minor_linker_version: u8,
pub size_of_code: U32<LE>,
pub size_of_initialized_data: U32<LE>,
pub size_of_uninitialized_data: U32<LE>,
pub address_of_entry_point: U32<LE>,
pub base_of_code: U32<LE>,
pub base_of_data: U32<LE>,
pub image_base: U32<LE>,
pub section_alignment: U32<LE>,
pub file_alignment: U32<LE>,
pub major_operating_system_version: U16<LE>,
pub minor_operating_system_version: U16<LE>,
pub major_image_version: U16<LE>,
pub minor_image_version: U16<LE>,
pub major_subsystem_version: U16<LE>,
pub minor_subsystem_version: U16<LE>,
pub win32_version_value: U32<LE>,
pub size_of_image: U32<LE>,
pub size_of_headers: U32<LE>,
pub check_sum: U32<LE>,
pub subsystem: U16<LE, Subsystem>,
pub dll_characteristics: U16<LE, DllFlags>,
pub size_of_stack_reserve: U32<LE>,
pub size_of_stack_commit: U32<LE>,
pub size_of_heap_reserve: U32<LE>,
pub size_of_heap_commit: U32<LE>,
pub loader_flags: U32<LE>,
pub number_of_rva_and_sizes: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageRomOptionalHeader {
pub magic: U16<LE>,
pub major_linker_version: u8,
pub minor_linker_version: u8,
pub size_of_code: U32<LE>,
pub size_of_initialized_data: U32<LE>,
pub size_of_uninitialized_data: U32<LE>,
pub address_of_entry_point: U32<LE>,
pub base_of_code: U32<LE>,
pub base_of_data: U32<LE>,
pub base_of_bss: U32<LE>,
pub gpr_mask: U32<LE>,
pub cpr_mask: [U32<LE>; 4],
pub gp_value: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageOptionalHeader64 {
pub magic: U16<LE>,
pub major_linker_version: u8,
pub minor_linker_version: u8,
pub size_of_code: U32<LE>,
pub size_of_initialized_data: U32<LE>,
pub size_of_uninitialized_data: U32<LE>,
pub address_of_entry_point: U32<LE>,
pub base_of_code: U32<LE>,
pub image_base: U64<LE>,
pub section_alignment: U32<LE>,
pub file_alignment: U32<LE>,
pub major_operating_system_version: U16<LE>,
pub minor_operating_system_version: U16<LE>,
pub major_image_version: U16<LE>,
pub minor_image_version: U16<LE>,
pub major_subsystem_version: U16<LE>,
pub minor_subsystem_version: U16<LE>,
pub win32_version_value: U32<LE>,
pub size_of_image: U32<LE>,
pub size_of_headers: U32<LE>,
pub check_sum: U32<LE>,
pub subsystem: U16<LE, Subsystem>,
pub dll_characteristics: U16<LE, DllFlags>,
pub size_of_stack_reserve: U64<LE>,
pub size_of_stack_commit: U64<LE>,
pub size_of_heap_reserve: U64<LE>,
pub size_of_heap_commit: U64<LE>,
pub loader_flags: U32<LE>,
pub number_of_rva_and_sizes: U32<LE>,
}
pub const IMAGE_NT_OPTIONAL_HDR32_MAGIC: u16 = 0x10b;
pub const IMAGE_NT_OPTIONAL_HDR64_MAGIC: u16 = 0x20b;
pub const IMAGE_ROM_OPTIONAL_HDR_MAGIC: u16 = 0x107;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageNtHeaders64 {
pub signature: U32<LE>,
pub file_header: ImageFileHeader,
pub optional_header: ImageOptionalHeader64,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageNtHeaders32 {
pub signature: U32<LE>,
pub file_header: ImageFileHeader,
pub optional_header: ImageOptionalHeader32,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageRomHeaders {
pub file_header: ImageFileHeader,
pub optional_header: ImageRomOptionalHeader,
}
newtype!(
struct Subsystem(u16);
);
newtype_constant_names!(NAMES_SUBSYSTEM: Subsystem(u16) = {
IMAGE_SUBSYSTEM_UNKNOWN = 0,
IMAGE_SUBSYSTEM_NATIVE = 1,
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2,
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3,
IMAGE_SUBSYSTEM_OS2_CUI = 5,
IMAGE_SUBSYSTEM_POSIX_CUI = 7,
IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8,
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9,
IMAGE_SUBSYSTEM_EFI_APPLICATION = 10,
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11,
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12,
IMAGE_SUBSYSTEM_EFI_ROM = 13,
IMAGE_SUBSYSTEM_XBOX = 14,
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16,
IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG = 17,
});
newtype!(
struct DllFlags(u16);
);
newtype_flag_names!(NAMES_DLL_FLAGS: DllFlags(u16) = {
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020,
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040,
IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY = 0x0080,
IMAGE_DLLCHARACTERISTICS_NX_COMPAT = 0x0100,
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x0200,
IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x0400,
IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x0800,
IMAGE_DLLCHARACTERISTICS_APPCONTAINER = 0x1000,
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000,
IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000,
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000,
});
constant_names!(
pub NAMES_DIRECTORY_ENTRY: usize = {
IMAGE_DIRECTORY_ENTRY_EXPORT = 0,
IMAGE_DIRECTORY_ENTRY_IMPORT = 1,
IMAGE_DIRECTORY_ENTRY_RESOURCE = 2,
IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3,
IMAGE_DIRECTORY_ENTRY_SECURITY = 4,
IMAGE_DIRECTORY_ENTRY_BASERELOC = 5,
IMAGE_DIRECTORY_ENTRY_DEBUG = 6,
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE = 7,
IMAGE_DIRECTORY_ENTRY_GLOBALPTR = 8,
IMAGE_DIRECTORY_ENTRY_TLS = 9,
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG = 10,
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11,
IMAGE_DIRECTORY_ENTRY_IAT = 12,
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT = 13,
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR = 14,
});
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(C)]
pub struct Guid(pub [u8; 16]);
impl Guid {
#[inline]
pub fn data1(self) -> U32<LE> {
U32::from_bytes(self.0[0..4].try_into().unwrap())
}
#[inline]
pub fn data2(self) -> U16<LE> {
U16::from_bytes(self.0[4..6].try_into().unwrap())
}
#[inline]
pub fn data3(self) -> U16<LE> {
U16::from_bytes(self.0[6..8].try_into().unwrap())
}
#[inline]
pub fn data4(self) -> [u8; 8] {
self.0[8..16].try_into().unwrap()
}
}
pub use Guid as ClsId;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct AnonObjectHeader {
pub sig1: U16<LE, Machine>,
pub sig2: U16<LE>,
pub version: U16<LE>,
pub machine: U16<LE, Machine>,
pub time_date_stamp: U32<LE>,
pub class_id: ClsId,
pub size_of_data: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct AnonObjectHeaderV2 {
pub sig1: U16<LE, Machine>,
pub sig2: U16<LE>,
pub version: U16<LE>,
pub machine: U16<LE, Machine>,
pub time_date_stamp: U32<LE>,
pub class_id: ClsId,
pub size_of_data: U32<LE>,
pub flags: U32<LE>,
pub meta_data_size: U32<LE>,
pub meta_data_offset: U32<LE>,
}
pub const ANON_OBJECT_HEADER_BIGOBJ_CLASS_ID: ClsId = ClsId([
0xC7, 0xA1, 0xBA, 0xD1, 0xEE, 0xBA, 0xA9, 0x4B, 0xAF, 0x20, 0xFA, 0xF6, 0x6A, 0xA4, 0xDC, 0xB8,
]);
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct AnonObjectHeaderBigobj {
pub sig1: U16<LE, Machine>,
pub sig2: U16<LE>,
pub version: U16<LE>,
pub machine: U16<LE, Machine>,
pub time_date_stamp: U32<LE>,
pub class_id: ClsId,
pub size_of_data: U32<LE>,
pub flags: U32<LE>,
pub meta_data_size: U32<LE>,
pub meta_data_offset: U32<LE>,
pub number_of_sections: U32<LE>,
pub pointer_to_symbol_table: U32<LE>,
pub number_of_symbols: U32<LE>,
}
pub const IMAGE_SIZEOF_SHORT_NAME: usize = 8;
#[derive(Debug, Default, Clone, Copy)]
#[repr(C)]
pub struct ImageSectionHeader {
pub name: [u8; IMAGE_SIZEOF_SHORT_NAME],
pub virtual_size: U32<LE>,
pub virtual_address: U32<LE>,
pub size_of_raw_data: U32<LE>,
pub pointer_to_raw_data: U32<LE>,
pub pointer_to_relocations: U32<LE>,
pub pointer_to_linenumbers: U32<LE>,
pub number_of_relocations: U16<LE>,
pub number_of_linenumbers: U16<LE>,
pub characteristics: U32<LE, SectionFlags>,
}
pub const IMAGE_SIZEOF_SECTION_HEADER: usize = 40;
newtype!(
struct SectionFlags(u32);
);
impl SectionFlags {
pub fn align(self) -> SectionFlags {
SectionFlags(self.0 & IMAGE_SCN_ALIGN_MASK)
}
pub fn with_align(self, align: SectionFlags) -> SectionFlags {
SectionFlags(self.0 & !IMAGE_SCN_ALIGN_MASK | align.0 & IMAGE_SCN_ALIGN_MASK)
}
}
newtype_flag_names!(NAMES_SCN_FLAGS: SectionFlags(u32) = {
IMAGE_SCN_TYPE_NO_PAD = 0x0000_0008,
IMAGE_SCN_CNT_CODE = 0x0000_0020,
IMAGE_SCN_CNT_INITIALIZED_DATA = 0x0000_0040,
IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x0000_0080,
IMAGE_SCN_LNK_OTHER = 0x0000_0100,
IMAGE_SCN_LNK_INFO = 0x0000_0200,
IMAGE_SCN_LNK_REMOVE = 0x0000_0800,
IMAGE_SCN_LNK_COMDAT = 0x0000_1000,
IMAGE_SCN_NO_DEFER_SPEC_EXC = 0x0000_4000,
IMAGE_SCN_GPREL = 0x0000_8000,
IMAGE_SCN_MEM_FARDATA = 0x0000_8000,
IMAGE_SCN_MEM_PURGEABLE = 0x0002_0000,
IMAGE_SCN_MEM_16BIT = 0x0002_0000,
IMAGE_SCN_MEM_LOCKED = 0x0004_0000,
IMAGE_SCN_MEM_PRELOAD = 0x0008_0000,
IMAGE_SCN_ALIGN_MASK = 0x00F0_0000 => NAMES_SCN_ALIGN,
IMAGE_SCN_LNK_NRELOC_OVFL = 0x0100_0000,
IMAGE_SCN_MEM_DISCARDABLE = 0x0200_0000,
IMAGE_SCN_MEM_NOT_CACHED = 0x0400_0000,
IMAGE_SCN_MEM_NOT_PAGED = 0x0800_0000,
IMAGE_SCN_MEM_SHARED = 0x1000_0000,
IMAGE_SCN_MEM_EXECUTE = 0x2000_0000,
IMAGE_SCN_MEM_READ = 0x4000_0000,
IMAGE_SCN_MEM_WRITE = 0x8000_0000,
});
constant_names!(NAMES_SCN_ALIGN: SectionFlags(u32) = {
IMAGE_SCN_ALIGN_1BYTES = 0x0010_0000,
IMAGE_SCN_ALIGN_2BYTES = 0x0020_0000,
IMAGE_SCN_ALIGN_4BYTES = 0x0030_0000,
IMAGE_SCN_ALIGN_8BYTES = 0x0040_0000,
IMAGE_SCN_ALIGN_16BYTES = 0x0050_0000,
IMAGE_SCN_ALIGN_32BYTES = 0x0060_0000,
IMAGE_SCN_ALIGN_64BYTES = 0x0070_0000,
IMAGE_SCN_ALIGN_128BYTES = 0x0080_0000,
IMAGE_SCN_ALIGN_256BYTES = 0x0090_0000,
IMAGE_SCN_ALIGN_512BYTES = 0x00A0_0000,
IMAGE_SCN_ALIGN_1024BYTES = 0x00B0_0000,
IMAGE_SCN_ALIGN_2048BYTES = 0x00C0_0000,
IMAGE_SCN_ALIGN_4096BYTES = 0x00D0_0000,
IMAGE_SCN_ALIGN_8192BYTES = 0x00E0_0000,
});
pub const IMAGE_SCN_SCALE_INDEX: u32 = 0x0000_0001;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageSymbol {
pub name: [u8; 8],
pub value: U32<LE>,
pub section_number: U16<LE>,
pub typ: U16<LE, SymbolType>,
pub storage_class: SymbolClass,
pub number_of_aux_symbols: u8,
}
pub const IMAGE_SIZEOF_SYMBOL: usize = 18;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageSymbolBytes(pub [u8; IMAGE_SIZEOF_SYMBOL]);
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageSymbolEx {
pub name: [u8; 8],
pub value: U32<LE>,
pub section_number: I32<LE, SymbolSection>,
pub typ: U16<LE, SymbolType>,
pub storage_class: SymbolClass,
pub number_of_aux_symbols: u8,
}
pub const IMAGE_SIZEOF_SYMBOL_EX: usize = 20;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageSymbolExBytes(pub [u8; IMAGE_SIZEOF_SYMBOL_EX]);
newtype!(
struct SymbolSection(i32);
);
impl SymbolSection {
pub fn is_reserved(self) -> bool {
self.0 <= 0
}
pub fn index(self) -> Option<u32> {
if self.0 > 0 {
Some(self.0 as u32)
} else {
None
}
}
}
newtype_constant_names!(NAMES_IMAGE_SYM: SymbolSection(i32) = {
IMAGE_SYM_UNDEFINED = 0,
IMAGE_SYM_ABSOLUTE = -1,
IMAGE_SYM_DEBUG = -2,
});
pub const IMAGE_SYM_SECTION_MAX: u16 = 0xFEFF;
pub const IMAGE_SYM_SECTION_MAX_EX: u32 = 0x7fff_ffff;
newtype!(
struct SymbolType(u16);
);
impl SymbolType {
pub fn new(base_type: SymbolBaseType, derived_type: SymbolDerivedType) -> Self {
SymbolType(SymbolType::from(base_type).0 | SymbolType::from(derived_type).0)
}
pub fn base_type(self) -> SymbolBaseType {
SymbolBaseType(self.0 & N_BTMASK)
}
pub fn derived_type(self) -> SymbolDerivedType {
SymbolDerivedType((self.0 & N_TMASK) >> N_BTSHFT)
}
}
newtype_flag_names!(NAMES_SYMBOL_TYPE: SymbolType(u16) = {
_ = N_BTMASK => NAMES_IMAGE_SYM_TYPE,
_ = N_TMASK => NAMES_IMAGE_SYM_DTYPE,
IMAGE_SYM_TYPE_PCODE = 0x8000,
});
newtype!(
struct SymbolBaseType(u16);
);
impl From<SymbolBaseType> for SymbolType {
fn from(base: SymbolBaseType) -> Self {
SymbolType(base.0 & N_BTMASK)
}
}
impl From<SymbolType> for SymbolBaseType {
fn from(value: SymbolType) -> Self {
value.base_type()
}
}
pub const IMAGE_SYM_TYPE_NULL: SymbolBaseType = SymbolBaseType(0);
newtype_constant_names!(NAMES_IMAGE_SYM_TYPE: SymbolBaseType(u16) = {
IMAGE_SYM_TYPE_VOID = 0x0001,
IMAGE_SYM_TYPE_CHAR = 0x0002,
IMAGE_SYM_TYPE_SHORT = 0x0003,
IMAGE_SYM_TYPE_INT = 0x0004,
IMAGE_SYM_TYPE_LONG = 0x0005,
IMAGE_SYM_TYPE_FLOAT = 0x0006,
IMAGE_SYM_TYPE_DOUBLE = 0x0007,
IMAGE_SYM_TYPE_STRUCT = 0x0008,
IMAGE_SYM_TYPE_UNION = 0x0009,
IMAGE_SYM_TYPE_ENUM = 0x000A,
IMAGE_SYM_TYPE_MOE = 0x000B,
IMAGE_SYM_TYPE_BYTE = 0x000C,
IMAGE_SYM_TYPE_WORD = 0x000D,
IMAGE_SYM_TYPE_UINT = 0x000E,
IMAGE_SYM_TYPE_DWORD = 0x000F,
});
newtype!(
struct SymbolDerivedType(u16);
);
impl From<SymbolDerivedType> for SymbolType {
fn from(derived: SymbolDerivedType) -> Self {
SymbolType((derived.0 << N_BTSHFT) & N_TMASK)
}
}
impl From<SymbolType> for SymbolDerivedType {
fn from(value: SymbolType) -> Self {
value.derived_type()
}
}
pub const IMAGE_SYM_DTYPE_NULL: SymbolDerivedType = SymbolDerivedType(0);
newtype_constant_names!(NAMES_IMAGE_SYM_DTYPE: SymbolDerivedType(u16) = {
IMAGE_SYM_DTYPE_POINTER = 1,
IMAGE_SYM_DTYPE_FUNCTION = 2,
IMAGE_SYM_DTYPE_ARRAY = 3,
});
newtype!(
#[repr(transparent)]
struct SymbolClass(u8);
);
newtype_constant_names!(NAMES_IMAGE_SYM_CLASS: SymbolClass(u8) = {
IMAGE_SYM_CLASS_END_OF_FUNCTION = 0xff,
IMAGE_SYM_CLASS_NULL = 0x00,
IMAGE_SYM_CLASS_AUTOMATIC = 0x01,
IMAGE_SYM_CLASS_EXTERNAL = 0x02,
IMAGE_SYM_CLASS_STATIC = 0x03,
IMAGE_SYM_CLASS_REGISTER = 0x04,
IMAGE_SYM_CLASS_EXTERNAL_DEF = 0x05,
IMAGE_SYM_CLASS_LABEL = 0x06,
IMAGE_SYM_CLASS_UNDEFINED_LABEL = 0x07,
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 0x08,
IMAGE_SYM_CLASS_ARGUMENT = 0x09,
IMAGE_SYM_CLASS_STRUCT_TAG = 0x0A,
IMAGE_SYM_CLASS_MEMBER_OF_UNION = 0x0B,
IMAGE_SYM_CLASS_UNION_TAG = 0x0C,
IMAGE_SYM_CLASS_TYPE_DEFINITION = 0x0D,
IMAGE_SYM_CLASS_UNDEFINED_STATIC = 0x0E,
IMAGE_SYM_CLASS_ENUM_TAG = 0x0F,
IMAGE_SYM_CLASS_MEMBER_OF_ENUM = 0x10,
IMAGE_SYM_CLASS_REGISTER_PARAM = 0x11,
IMAGE_SYM_CLASS_BIT_FIELD = 0x12,
IMAGE_SYM_CLASS_FAR_EXTERNAL = 0x44,
IMAGE_SYM_CLASS_BLOCK = 0x64,
IMAGE_SYM_CLASS_FUNCTION = 0x65,
IMAGE_SYM_CLASS_END_OF_STRUCT = 0x66,
IMAGE_SYM_CLASS_FILE = 0x67,
IMAGE_SYM_CLASS_SECTION = 0x68,
IMAGE_SYM_CLASS_WEAK_EXTERNAL = 0x69,
IMAGE_SYM_CLASS_CLR_TOKEN = 0x6B,
});
pub const N_BTMASK: u16 = 0x000F;
pub const N_TMASK: u16 = 0x0030;
pub const N_TMASK1: u16 = 0x00C0;
pub const N_TMASK2: u16 = 0x00F0;
pub const N_BTSHFT: usize = 4;
pub const N_TSHIFT: usize = 2;
pub const IMAGE_SYM_DTYPE_SHIFT: usize = N_BTSHFT;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageAuxSymbolTokenDef {
pub aux_type: u8,
pub reserved1: u8,
pub symbol_table_index: U32<LE>,
pub reserved2: [u8; 12],
}
pub const IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF: u16 = 1;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageAuxSymbolFunction {
pub tag_index: U32<LE>,
pub total_size: U32<LE>,
pub pointer_to_linenumber: U32<LE>,
pub pointer_to_next_function: U32<LE>,
pub unused: [u8; 2],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageAuxSymbolFunctionBeginEnd {
pub unused1: [u8; 4],
pub linenumber: U16<LE>,
pub unused2: [u8; 6],
pub pointer_to_next_function: U32<LE>,
pub unused3: [u8; 2],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageAuxSymbolWeak {
pub weak_default_sym_index: U32<LE>,
pub weak_search_type: U32<LE, WeakExternSearch>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageAuxSymbolSection {
pub length: U32<LE>,
pub number_of_relocations: U16<LE>,
pub number_of_linenumbers: U16<LE>,
pub check_sum: U32<LE>,
pub number: U16<LE>,
pub selection: ComdatSelection,
pub reserved: u8,
pub high_number: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageAuxSymbolCrc {
pub crc: U32<LE>,
}
newtype!(
#[repr(transparent)]
struct ComdatSelection(u8);
);
newtype_constant_names!(NAMES_IMAGE_COMDAT_SELECT: ComdatSelection(u8) = {
IMAGE_COMDAT_SELECT_NODUPLICATES = 1,
IMAGE_COMDAT_SELECT_ANY = 2,
IMAGE_COMDAT_SELECT_SAME_SIZE = 3,
IMAGE_COMDAT_SELECT_EXACT_MATCH = 4,
IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5,
IMAGE_COMDAT_SELECT_LARGEST = 6,
IMAGE_COMDAT_SELECT_NEWEST = 7,
});
newtype!(
struct WeakExternSearch(u32);
);
newtype_constant_names!(NAMES_IMAGE_WEAK_EXTERN: WeakExternSearch(u32) = {
IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1,
IMAGE_WEAK_EXTERN_SEARCH_LIBRARY = 2,
IMAGE_WEAK_EXTERN_SEARCH_ALIAS = 3,
IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY = 4,
});
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageRelocation {
pub virtual_address: U32<LE>,
pub symbol_table_index: U32<LE>,
pub typ: U16<LE, RelocationType>,
}
newtype!(
struct RelocationType(u16);
);
newtype_flag_names!(RelocationType(u16) = {});
impl RelocationType {
pub fn ppc_type(self) -> Self {
RelocationType(self.0 & IMAGE_REL_PPC_TYPEMASK)
}
pub fn sh_type(self) -> Self {
self.without(IMAGE_REL_SH_NOMODE)
}
}
names! {
struct I386(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_I386,
};
}
constant_names!(
pub NAMES_IMAGE_REL_I386: RelocationType(u16) = {
IMAGE_REL_I386_ABSOLUTE = 0x0000,
IMAGE_REL_I386_DIR16 = 0x0001,
IMAGE_REL_I386_REL16 = 0x0002,
IMAGE_REL_I386_DIR32 = 0x0006,
IMAGE_REL_I386_DIR32NB = 0x0007,
IMAGE_REL_I386_SEG12 = 0x0009,
IMAGE_REL_I386_SECTION = 0x000A,
IMAGE_REL_I386_SECREL = 0x000B,
IMAGE_REL_I386_TOKEN = 0x000C,
IMAGE_REL_I386_SECREL7 = 0x000D,
IMAGE_REL_I386_REL32 = 0x0014,
});
names! {
struct Mips(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_MIPS,
};
consts rel_based = NAMES_REL_BASED_MIPS;
}
constant_names!(
pub NAMES_IMAGE_REL_MIPS: RelocationType(u16) = {
IMAGE_REL_MIPS_ABSOLUTE = 0x0000,
IMAGE_REL_MIPS_REFHALF = 0x0001,
IMAGE_REL_MIPS_REFWORD = 0x0002,
IMAGE_REL_MIPS_JMPADDR = 0x0003,
IMAGE_REL_MIPS_REFHI = 0x0004,
IMAGE_REL_MIPS_REFLO = 0x0005,
IMAGE_REL_MIPS_GPREL = 0x0006,
IMAGE_REL_MIPS_LITERAL = 0x0007,
IMAGE_REL_MIPS_SECTION = 0x000A,
IMAGE_REL_MIPS_SECREL = 0x000B,
IMAGE_REL_MIPS_SECRELLO = 0x000C,
IMAGE_REL_MIPS_SECRELHI = 0x000D,
IMAGE_REL_MIPS_TOKEN = 0x000E,
IMAGE_REL_MIPS_JMPADDR16 = 0x0010,
IMAGE_REL_MIPS_REFWORDNB = 0x0022,
IMAGE_REL_MIPS_PAIR = 0x0025,
});
names! {
struct Alpha(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_ALPHA,
};
}
constant_names!(
pub NAMES_IMAGE_REL_ALPHA: RelocationType(u16) = {
IMAGE_REL_ALPHA_ABSOLUTE = 0x0000,
IMAGE_REL_ALPHA_REFLONG = 0x0001,
IMAGE_REL_ALPHA_REFQUAD = 0x0002,
IMAGE_REL_ALPHA_GPREL32 = 0x0003,
IMAGE_REL_ALPHA_LITERAL = 0x0004,
IMAGE_REL_ALPHA_LITUSE = 0x0005,
IMAGE_REL_ALPHA_GPDISP = 0x0006,
IMAGE_REL_ALPHA_BRADDR = 0x0007,
IMAGE_REL_ALPHA_HINT = 0x0008,
IMAGE_REL_ALPHA_INLINE_REFLONG = 0x0009,
IMAGE_REL_ALPHA_REFHI = 0x000A,
IMAGE_REL_ALPHA_REFLO = 0x000B,
IMAGE_REL_ALPHA_PAIR = 0x000C,
IMAGE_REL_ALPHA_MATCH = 0x000D,
IMAGE_REL_ALPHA_SECTION = 0x000E,
IMAGE_REL_ALPHA_SECREL = 0x000F,
IMAGE_REL_ALPHA_REFLONGNB = 0x0010,
IMAGE_REL_ALPHA_SECRELLO = 0x0011,
IMAGE_REL_ALPHA_SECRELHI = 0x0012,
IMAGE_REL_ALPHA_REFQ3 = 0x0013,
IMAGE_REL_ALPHA_REFQ2 = 0x0014,
IMAGE_REL_ALPHA_REFQ1 = 0x0015,
IMAGE_REL_ALPHA_GPRELLO = 0x0016,
IMAGE_REL_ALPHA_GPRELHI = 0x0017,
});
names! {
struct Ppc(Base);
flags rel: RelocationType(u16) = {
IMAGE_REL_PPC_TYPEMASK = 0x00FF => NAMES_IMAGE_REL_PPC,
IMAGE_REL_PPC_NEG = 0x0100,
IMAGE_REL_PPC_BRTAKEN = 0x0200,
IMAGE_REL_PPC_BRNTAKEN = 0x0400,
IMAGE_REL_PPC_TOCDEFN = 0x0800,
};
}
constant_names!(
pub NAMES_IMAGE_REL_PPC: RelocationType(u16) = {
IMAGE_REL_PPC_ABSOLUTE = 0x0000,
IMAGE_REL_PPC_ADDR64 = 0x0001,
IMAGE_REL_PPC_ADDR32 = 0x0002,
IMAGE_REL_PPC_ADDR24 = 0x0003,
IMAGE_REL_PPC_ADDR16 = 0x0004,
IMAGE_REL_PPC_ADDR14 = 0x0005,
IMAGE_REL_PPC_REL24 = 0x0006,
IMAGE_REL_PPC_REL14 = 0x0007,
IMAGE_REL_PPC_TOCREL16 = 0x0008,
IMAGE_REL_PPC_TOCREL14 = 0x0009,
IMAGE_REL_PPC_ADDR32NB = 0x000A,
IMAGE_REL_PPC_SECREL = 0x000B,
IMAGE_REL_PPC_SECTION = 0x000C,
IMAGE_REL_PPC_IFGLUE = 0x000D,
IMAGE_REL_PPC_IMGLUE = 0x000E,
IMAGE_REL_PPC_SECREL16 = 0x000F,
IMAGE_REL_PPC_REFHI = 0x0010,
IMAGE_REL_PPC_REFLO = 0x0011,
IMAGE_REL_PPC_PAIR = 0x0012,
IMAGE_REL_PPC_SECRELLO = 0x0013,
IMAGE_REL_PPC_SECRELHI = 0x0014,
IMAGE_REL_PPC_GPREL = 0x0015,
IMAGE_REL_PPC_TOKEN = 0x0016,
});
names! {
struct Sh(Base);
flags rel: RelocationType(u16) = {
_ = !IMAGE_REL_SH_NOMODE.0 => NAMES_IMAGE_REL_SH,
IMAGE_REL_SH_NOMODE = 0x8000,
};
}
constant_names!(
pub NAMES_IMAGE_REL_SH: RelocationType(u16) = {
IMAGE_REL_SH3_ABSOLUTE = 0x0000,
IMAGE_REL_SH3_DIRECT16 = 0x0001,
IMAGE_REL_SH3_DIRECT32 = 0x0002,
IMAGE_REL_SH3_DIRECT8 = 0x0003,
IMAGE_REL_SH3_DIRECT8_WORD = 0x0004,
IMAGE_REL_SH3_DIRECT8_LONG = 0x0005,
IMAGE_REL_SH3_DIRECT4 = 0x0006,
IMAGE_REL_SH3_DIRECT4_WORD = 0x0007,
IMAGE_REL_SH3_DIRECT4_LONG = 0x0008,
IMAGE_REL_SH3_PCREL8_WORD = 0x0009,
IMAGE_REL_SH3_PCREL8_LONG = 0x000A,
IMAGE_REL_SH3_PCREL12_WORD = 0x000B,
IMAGE_REL_SH3_STARTOF_SECTION = 0x000C,
IMAGE_REL_SH3_SIZEOF_SECTION = 0x000D,
IMAGE_REL_SH3_SECTION = 0x000E,
IMAGE_REL_SH3_SECREL = 0x000F,
IMAGE_REL_SH3_DIRECT32_NB = 0x0010,
IMAGE_REL_SH3_GPREL4_LONG = 0x0011,
IMAGE_REL_SH3_TOKEN = 0x0012,
IMAGE_REL_SHM_PCRELPT = 0x0013,
IMAGE_REL_SHM_REFLO = 0x0014,
IMAGE_REL_SHM_REFHALF = 0x0015,
IMAGE_REL_SHM_RELLO = 0x0016,
IMAGE_REL_SHM_RELHALF = 0x0017,
IMAGE_REL_SHM_PAIR = 0x0018,
});
names! {
struct Arm(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_ARM,
};
consts rel_based = NAMES_REL_BASED_ARM;
}
constant_names!(
pub NAMES_IMAGE_REL_ARM: RelocationType(u16) = {
IMAGE_REL_ARM_ABSOLUTE = 0x0000,
IMAGE_REL_ARM_ADDR32 = 0x0001,
IMAGE_REL_ARM_ADDR32NB = 0x0002,
IMAGE_REL_ARM_BRANCH24 = 0x0003,
IMAGE_REL_ARM_BRANCH11 = 0x0004,
IMAGE_REL_ARM_TOKEN = 0x0005,
IMAGE_REL_ARM_GPREL12 = 0x0006,
IMAGE_REL_ARM_GPREL7 = 0x0007,
IMAGE_REL_ARM_BLX24 = 0x0008,
IMAGE_REL_ARM_BLX11 = 0x0009,
IMAGE_REL_ARM_REL32 = 0x000A,
IMAGE_REL_ARM_SECTION = 0x000E,
IMAGE_REL_ARM_SECREL = 0x000F,
IMAGE_REL_ARM_MOV32A = 0x0010,
IMAGE_REL_ARM_MOV32 = 0x0010,
IMAGE_REL_ARM_MOV32T = 0x0011,
IMAGE_REL_THUMB_MOV32 = 0x0011,
IMAGE_REL_ARM_BRANCH20T = 0x0012,
IMAGE_REL_THUMB_BRANCH20 = 0x0012,
IMAGE_REL_ARM_BRANCH24T = 0x0014,
IMAGE_REL_THUMB_BRANCH24 = 0x0014,
IMAGE_REL_ARM_BLX23T = 0x0015,
IMAGE_REL_THUMB_BLX23 = 0x0015,
});
names! {
struct Am(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_AM,
};
}
constant_names!(
pub NAMES_IMAGE_REL_AM: RelocationType(u16) = {
IMAGE_REL_AM_ABSOLUTE = 0x0000,
IMAGE_REL_AM_ADDR32 = 0x0001,
IMAGE_REL_AM_ADDR32NB = 0x0002,
IMAGE_REL_AM_CALL32 = 0x0003,
IMAGE_REL_AM_FUNCINFO = 0x0004,
IMAGE_REL_AM_REL32_1 = 0x0005,
IMAGE_REL_AM_REL32_2 = 0x0006,
IMAGE_REL_AM_SECREL = 0x0007,
IMAGE_REL_AM_SECTION = 0x0008,
IMAGE_REL_AM_TOKEN = 0x0009,
});
names! {
struct Arm64(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_ARM64,
};
}
constant_names!(
pub NAMES_IMAGE_REL_ARM64: RelocationType(u16) = {
IMAGE_REL_ARM64_ABSOLUTE = 0x0000,
IMAGE_REL_ARM64_ADDR32 = 0x0001,
IMAGE_REL_ARM64_ADDR32NB = 0x0002,
IMAGE_REL_ARM64_BRANCH26 = 0x0003,
IMAGE_REL_ARM64_PAGEBASE_REL21 = 0x0004,
IMAGE_REL_ARM64_REL21 = 0x0005,
IMAGE_REL_ARM64_PAGEOFFSET_12A = 0x0006,
IMAGE_REL_ARM64_PAGEOFFSET_12L = 0x0007,
IMAGE_REL_ARM64_SECREL = 0x0008,
IMAGE_REL_ARM64_SECREL_LOW12A = 0x0009,
IMAGE_REL_ARM64_SECREL_HIGH12A = 0x000A,
IMAGE_REL_ARM64_SECREL_LOW12L = 0x000B,
IMAGE_REL_ARM64_TOKEN = 0x000C,
IMAGE_REL_ARM64_SECTION = 0x000D,
IMAGE_REL_ARM64_ADDR64 = 0x000E,
IMAGE_REL_ARM64_BRANCH19 = 0x000F,
IMAGE_REL_ARM64_BRANCH14 = 0x0010,
IMAGE_REL_ARM64_REL32 = 0x0011,
});
names! {
struct Amd64(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_AMD64,
};
}
constant_names!(
pub NAMES_IMAGE_REL_AMD64: RelocationType(u16) = {
IMAGE_REL_AMD64_ABSOLUTE = 0x0000,
IMAGE_REL_AMD64_ADDR64 = 0x0001,
IMAGE_REL_AMD64_ADDR32 = 0x0002,
IMAGE_REL_AMD64_ADDR32NB = 0x0003,
IMAGE_REL_AMD64_REL32 = 0x0004,
IMAGE_REL_AMD64_REL32_1 = 0x0005,
IMAGE_REL_AMD64_REL32_2 = 0x0006,
IMAGE_REL_AMD64_REL32_3 = 0x0007,
IMAGE_REL_AMD64_REL32_4 = 0x0008,
IMAGE_REL_AMD64_REL32_5 = 0x0009,
IMAGE_REL_AMD64_SECTION = 0x000A,
IMAGE_REL_AMD64_SECREL = 0x000B,
IMAGE_REL_AMD64_SECREL7 = 0x000C,
IMAGE_REL_AMD64_TOKEN = 0x000D,
IMAGE_REL_AMD64_SREL32 = 0x000E,
IMAGE_REL_AMD64_PAIR = 0x000F,
IMAGE_REL_AMD64_SSPAN32 = 0x0010,
IMAGE_REL_AMD64_EHANDLER = 0x0011,
IMAGE_REL_AMD64_IMPORT_BR = 0x0012,
IMAGE_REL_AMD64_IMPORT_CALL = 0x0013,
IMAGE_REL_AMD64_CFG_BR = 0x0014,
IMAGE_REL_AMD64_CFG_BR_REX = 0x0015,
IMAGE_REL_AMD64_CFG_CALL = 0x0016,
IMAGE_REL_AMD64_INDIR_BR = 0x0017,
IMAGE_REL_AMD64_INDIR_BR_REX = 0x0018,
IMAGE_REL_AMD64_INDIR_CALL = 0x0019,
IMAGE_REL_AMD64_INDIR_BR_SWITCHTABLE_FIRST = 0x0020,
IMAGE_REL_AMD64_INDIR_BR_SWITCHTABLE_LAST = 0x002F,
});
names! {
struct Ia64(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_IA64,
};
consts rel_based = NAMES_REL_BASED_IA64;
}
constant_names!(
pub NAMES_IMAGE_REL_IA64: RelocationType(u16) = {
IMAGE_REL_IA64_ABSOLUTE = 0x0000,
IMAGE_REL_IA64_IMM14 = 0x0001,
IMAGE_REL_IA64_IMM22 = 0x0002,
IMAGE_REL_IA64_IMM64 = 0x0003,
IMAGE_REL_IA64_DIR32 = 0x0004,
IMAGE_REL_IA64_DIR64 = 0x0005,
IMAGE_REL_IA64_PCREL21B = 0x0006,
IMAGE_REL_IA64_PCREL21M = 0x0007,
IMAGE_REL_IA64_PCREL21F = 0x0008,
IMAGE_REL_IA64_GPREL22 = 0x0009,
IMAGE_REL_IA64_LTOFF22 = 0x000A,
IMAGE_REL_IA64_SECTION = 0x000B,
IMAGE_REL_IA64_SECREL22 = 0x000C,
IMAGE_REL_IA64_SECREL64I = 0x000D,
IMAGE_REL_IA64_SECREL32 = 0x000E,
IMAGE_REL_IA64_DIR32NB = 0x0010,
IMAGE_REL_IA64_SREL14 = 0x0011,
IMAGE_REL_IA64_SREL22 = 0x0012,
IMAGE_REL_IA64_SREL32 = 0x0013,
IMAGE_REL_IA64_UREL32 = 0x0014,
IMAGE_REL_IA64_PCREL60X = 0x0015,
IMAGE_REL_IA64_PCREL60B = 0x0016,
IMAGE_REL_IA64_PCREL60F = 0x0017,
IMAGE_REL_IA64_PCREL60I = 0x0018,
IMAGE_REL_IA64_PCREL60M = 0x0019,
IMAGE_REL_IA64_IMMGPREL64 = 0x001A,
IMAGE_REL_IA64_TOKEN = 0x001B,
IMAGE_REL_IA64_GPREL32 = 0x001C,
IMAGE_REL_IA64_ADDEND = 0x001F,
});
names! {
struct Cef(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_CEF,
};
}
constant_names!(
pub NAMES_IMAGE_REL_CEF: RelocationType(u16) = {
IMAGE_REL_CEF_ABSOLUTE = 0x0000,
IMAGE_REL_CEF_ADDR32 = 0x0001,
IMAGE_REL_CEF_ADDR64 = 0x0002,
IMAGE_REL_CEF_ADDR32NB = 0x0003,
IMAGE_REL_CEF_SECTION = 0x0004,
IMAGE_REL_CEF_SECREL = 0x0005,
IMAGE_REL_CEF_TOKEN = 0x0006,
});
names! {
struct Cee(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_CEE,
};
}
constant_names!(
pub NAMES_IMAGE_REL_CEE: RelocationType(u16) = {
IMAGE_REL_CEE_ABSOLUTE = 0x0000,
IMAGE_REL_CEE_ADDR32 = 0x0001,
IMAGE_REL_CEE_ADDR64 = 0x0002,
IMAGE_REL_CEE_ADDR32NB = 0x0003,
IMAGE_REL_CEE_SECTION = 0x0004,
IMAGE_REL_CEE_SECREL = 0x0005,
IMAGE_REL_CEE_TOKEN = 0x0006,
});
names! {
struct M32r(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_M32R,
};
}
constant_names!(
pub NAMES_IMAGE_REL_M32R: RelocationType(u16) = {
IMAGE_REL_M32R_ABSOLUTE = 0x0000,
IMAGE_REL_M32R_ADDR32 = 0x0001,
IMAGE_REL_M32R_ADDR32NB = 0x0002,
IMAGE_REL_M32R_ADDR24 = 0x0003,
IMAGE_REL_M32R_GPREL16 = 0x0004,
IMAGE_REL_M32R_PCREL24 = 0x0005,
IMAGE_REL_M32R_PCREL16 = 0x0006,
IMAGE_REL_M32R_PCREL8 = 0x0007,
IMAGE_REL_M32R_REFHALF = 0x0008,
IMAGE_REL_M32R_REFHI = 0x0009,
IMAGE_REL_M32R_REFLO = 0x000A,
IMAGE_REL_M32R_PAIR = 0x000B,
IMAGE_REL_M32R_SECTION = 0x000C,
IMAGE_REL_M32R_SECREL32 = 0x000D,
IMAGE_REL_M32R_TOKEN = 0x000E,
});
names! {
struct Ebc(Base);
flags rel: RelocationType(u16) = {
_ = !0 => NAMES_IMAGE_REL_EBC,
};
}
constant_names!(
pub NAMES_IMAGE_REL_EBC: RelocationType(u16) = {
IMAGE_REL_EBC_ABSOLUTE = 0x0000,
IMAGE_REL_EBC_ADDR32NB = 0x0001,
IMAGE_REL_EBC_REL32 = 0x0002,
IMAGE_REL_EBC_SECTION = 0x0003,
IMAGE_REL_EBC_SECREL = 0x0004,
});
names! {
struct Riscv(Base);
consts rel_based = NAMES_REL_BASED_RISCV;
}
pub const EMARCH_ENC_I17_IMM7B_INST_WORD_X: u16 = 3;
pub const EMARCH_ENC_I17_IMM7B_SIZE_X: u16 = 7;
pub const EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X: u16 = 4;
pub const EMARCH_ENC_I17_IMM7B_VAL_POS_X: u16 = 0;
pub const EMARCH_ENC_I17_IMM9D_INST_WORD_X: u16 = 3;
pub const EMARCH_ENC_I17_IMM9D_SIZE_X: u16 = 9;
pub const EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X: u16 = 18;
pub const EMARCH_ENC_I17_IMM9D_VAL_POS_X: u16 = 7;
pub const EMARCH_ENC_I17_IMM5C_INST_WORD_X: u16 = 3;
pub const EMARCH_ENC_I17_IMM5C_SIZE_X: u16 = 5;
pub const EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X: u16 = 13;
pub const EMARCH_ENC_I17_IMM5C_VAL_POS_X: u16 = 16;
pub const EMARCH_ENC_I17_IC_INST_WORD_X: u16 = 3;
pub const EMARCH_ENC_I17_IC_SIZE_X: u16 = 1;
pub const EMARCH_ENC_I17_IC_INST_WORD_POS_X: u16 = 12;
pub const EMARCH_ENC_I17_IC_VAL_POS_X: u16 = 21;
pub const EMARCH_ENC_I17_IMM41A_INST_WORD_X: u16 = 1;
pub const EMARCH_ENC_I17_IMM41A_SIZE_X: u16 = 10;
pub const EMARCH_ENC_I17_IMM41A_INST_WORD_POS_X: u16 = 14;
pub const EMARCH_ENC_I17_IMM41A_VAL_POS_X: u16 = 22;
pub const EMARCH_ENC_I17_IMM41B_INST_WORD_X: u16 = 1;
pub const EMARCH_ENC_I17_IMM41B_SIZE_X: u16 = 8;
pub const EMARCH_ENC_I17_IMM41B_INST_WORD_POS_X: u16 = 24;
pub const EMARCH_ENC_I17_IMM41B_VAL_POS_X: u16 = 32;
pub const EMARCH_ENC_I17_IMM41C_INST_WORD_X: u16 = 2;
pub const EMARCH_ENC_I17_IMM41C_SIZE_X: u16 = 23;
pub const EMARCH_ENC_I17_IMM41C_INST_WORD_POS_X: u16 = 0;
pub const EMARCH_ENC_I17_IMM41C_VAL_POS_X: u16 = 40;
pub const EMARCH_ENC_I17_SIGN_INST_WORD_X: u16 = 3;
pub const EMARCH_ENC_I17_SIGN_SIZE_X: u16 = 1;
pub const EMARCH_ENC_I17_SIGN_INST_WORD_POS_X: u16 = 27;
pub const EMARCH_ENC_I17_SIGN_VAL_POS_X: u16 = 63;
pub const X3_OPCODE_INST_WORD_X: u16 = 3;
pub const X3_OPCODE_SIZE_X: u16 = 4;
pub const X3_OPCODE_INST_WORD_POS_X: u16 = 28;
pub const X3_OPCODE_SIGN_VAL_POS_X: u16 = 0;
pub const X3_I_INST_WORD_X: u16 = 3;
pub const X3_I_SIZE_X: u16 = 1;
pub const X3_I_INST_WORD_POS_X: u16 = 27;
pub const X3_I_SIGN_VAL_POS_X: u16 = 59;
pub const X3_D_WH_INST_WORD_X: u16 = 3;
pub const X3_D_WH_SIZE_X: u16 = 3;
pub const X3_D_WH_INST_WORD_POS_X: u16 = 24;
pub const X3_D_WH_SIGN_VAL_POS_X: u16 = 0;
pub const X3_IMM20_INST_WORD_X: u16 = 3;
pub const X3_IMM20_SIZE_X: u16 = 20;
pub const X3_IMM20_INST_WORD_POS_X: u16 = 4;
pub const X3_IMM20_SIGN_VAL_POS_X: u16 = 0;
pub const X3_IMM39_1_INST_WORD_X: u16 = 2;
pub const X3_IMM39_1_SIZE_X: u16 = 23;
pub const X3_IMM39_1_INST_WORD_POS_X: u16 = 0;
pub const X3_IMM39_1_SIGN_VAL_POS_X: u16 = 36;
pub const X3_IMM39_2_INST_WORD_X: u16 = 1;
pub const X3_IMM39_2_SIZE_X: u16 = 16;
pub const X3_IMM39_2_INST_WORD_POS_X: u16 = 16;
pub const X3_IMM39_2_SIGN_VAL_POS_X: u16 = 20;
pub const X3_P_INST_WORD_X: u16 = 3;
pub const X3_P_SIZE_X: u16 = 4;
pub const X3_P_INST_WORD_POS_X: u16 = 0;
pub const X3_P_SIGN_VAL_POS_X: u16 = 0;
pub const X3_TMPLT_INST_WORD_X: u16 = 0;
pub const X3_TMPLT_SIZE_X: u16 = 4;
pub const X3_TMPLT_INST_WORD_POS_X: u16 = 0;
pub const X3_TMPLT_SIGN_VAL_POS_X: u16 = 0;
pub const X3_BTYPE_QP_INST_WORD_X: u16 = 2;
pub const X3_BTYPE_QP_SIZE_X: u16 = 9;
pub const X3_BTYPE_QP_INST_WORD_POS_X: u16 = 23;
pub const X3_BTYPE_QP_INST_VAL_POS_X: u16 = 0;
pub const X3_EMPTY_INST_WORD_X: u16 = 1;
pub const X3_EMPTY_SIZE_X: u16 = 2;
pub const X3_EMPTY_INST_WORD_POS_X: u16 = 14;
pub const X3_EMPTY_INST_VAL_POS_X: u16 = 0;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageLinenumber {
pub symbol_table_index_or_virtual_address: U32<LE>,
pub linenumber: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageBaseRelocation {
pub virtual_address: U32<LE>,
pub size_of_block: U32<LE>,
}
newtype!(
struct BaseRelocationType(u16);
);
newtype_constant_names!(NAMES_REL_BASED: BaseRelocationType(u16) = {
IMAGE_REL_BASED_ABSOLUTE = 0,
IMAGE_REL_BASED_HIGH = 1,
IMAGE_REL_BASED_LOW = 2,
IMAGE_REL_BASED_HIGHLOW = 3,
IMAGE_REL_BASED_HIGHADJ = 4,
IMAGE_REL_BASED_MACHINE_SPECIFIC_5 = 5,
IMAGE_REL_BASED_RESERVED = 6,
IMAGE_REL_BASED_MACHINE_SPECIFIC_7 = 7,
IMAGE_REL_BASED_MACHINE_SPECIFIC_8 = 8,
IMAGE_REL_BASED_MACHINE_SPECIFIC_9 = 9,
IMAGE_REL_BASED_DIR64 = 10,
});
constant_names!(
pub NAMES_REL_BASED_IA64: BaseRelocationType(u16) = NAMES_REL_BASED + {
IMAGE_REL_BASED_IA64_IMM64 = 9,
});
constant_names!(
pub NAMES_REL_BASED_MIPS: BaseRelocationType(u16) = NAMES_REL_BASED + {
IMAGE_REL_BASED_MIPS_JMPADDR = 5,
IMAGE_REL_BASED_MIPS_JMPADDR16 = 9,
});
constant_names!(
pub NAMES_REL_BASED_ARM: BaseRelocationType(u16) = NAMES_REL_BASED + {
IMAGE_REL_BASED_ARM_MOV32 = 5,
IMAGE_REL_BASED_THUMB_MOV32 = 7,
});
constant_names!(
pub NAMES_REL_BASED_RISCV: BaseRelocationType(u16) = NAMES_REL_BASED + {
IMAGE_REL_BASED_RISCV_HIGH20 = 5,
IMAGE_REL_BASED_RISCV_LOW12I = 7,
IMAGE_REL_BASED_RISCV_LOW12S = 8,
});
pub const IMAGE_ARCHIVE_START_SIZE: usize = 8;
pub const IMAGE_ARCHIVE_START: &[u8; 8] = b"!<arch>\n";
pub const IMAGE_ARCHIVE_END: &[u8] = b"`\n";
pub const IMAGE_ARCHIVE_PAD: &[u8] = b"\n";
pub const IMAGE_ARCHIVE_LINKER_MEMBER: &[u8; 16] = b"/ ";
pub const IMAGE_ARCHIVE_LONGNAMES_MEMBER: &[u8; 16] = b"// ";
pub const IMAGE_ARCHIVE_HYBRIDMAP_MEMBER: &[u8; 16] = b"/<HYBRIDMAP>/ ";
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageArchiveMemberHeader {
pub name: [u8; 16],
pub date: [u8; 12],
pub user_id: [u8; 6],
pub group_id: [u8; 6],
pub mode: [u8; 8],
pub size: [u8; 10],
pub end_header: [u8; 2],
}
pub const IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR: u16 = 60;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageExportDirectory {
pub characteristics: U32<LE>,
pub time_date_stamp: U32<LE>,
pub major_version: U16<LE>,
pub minor_version: U16<LE>,
pub name: U32<LE>,
pub base: U32<LE>,
pub number_of_functions: U32<LE>,
pub number_of_names: U32<LE>,
pub address_of_functions: U32<LE>,
pub address_of_names: U32<LE>,
pub address_of_name_ordinals: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageImportByName {
pub hint: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageThunkData64(pub U64<LE>);
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageThunkData32(pub U32<LE>);
pub const IMAGE_ORDINAL_FLAG64: u64 = 0x8000000000000000;
pub const IMAGE_ORDINAL_FLAG32: u32 = 0x80000000;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageTlsDirectory64 {
pub start_address_of_raw_data: U64<LE>,
pub end_address_of_raw_data: U64<LE>,
pub address_of_index: U64<LE>,
pub address_of_call_backs: U64<LE>,
pub size_of_zero_fill: U32<LE>,
pub characteristics: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageTlsDirectory32 {
pub start_address_of_raw_data: U32<LE>,
pub end_address_of_raw_data: U32<LE>,
pub address_of_index: U32<LE>,
pub address_of_call_backs: U32<LE>,
pub size_of_zero_fill: U32<LE>,
pub characteristics: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageImportDescriptor {
pub original_first_thunk: U32<LE>,
pub time_date_stamp: U32<LE>,
pub forwarder_chain: U32<LE>,
pub name: U32<LE>,
pub first_thunk: U32<LE>,
}
impl ImageImportDescriptor {
pub fn is_null(&self) -> bool {
self.original_first_thunk.get(LE) == 0
&& self.time_date_stamp.get(LE) == 0
&& self.forwarder_chain.get(LE) == 0
&& self.name.get(LE) == 0
&& self.first_thunk.get(LE) == 0
}
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageBoundImportDescriptor {
pub time_date_stamp: U32<LE>,
pub offset_module_name: U16<LE>,
pub number_of_module_forwarder_refs: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageBoundForwarderRef {
pub time_date_stamp: U32<LE>,
pub offset_module_name: U16<LE>,
pub reserved: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDelayloadDescriptor {
pub attributes: U32<LE>,
pub dll_name_rva: U32<LE>,
pub module_handle_rva: U32<LE>,
pub import_address_table_rva: U32<LE>,
pub import_name_table_rva: U32<LE>,
pub bound_import_address_table_rva: U32<LE>,
pub unload_information_table_rva: U32<LE>,
pub time_date_stamp: U32<LE>,
}
impl ImageDelayloadDescriptor {
pub fn is_null(&self) -> bool {
self.attributes.get(LE) == 0
&& self.dll_name_rva.get(LE) == 0
&& self.module_handle_rva.get(LE) == 0
&& self.import_address_table_rva.get(LE) == 0
&& self.import_name_table_rva.get(LE) == 0
&& self.bound_import_address_table_rva.get(LE) == 0
&& self.unload_information_table_rva.get(LE) == 0
&& self.time_date_stamp.get(LE) == 0
}
}
pub const IMAGE_DELAYLOAD_RVA_BASED: u32 = 0x1;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageResourceDirectory {
pub characteristics: U32<LE>,
pub time_date_stamp: U32<LE>,
pub major_version: U16<LE>,
pub minor_version: U16<LE>,
pub number_of_named_entries: U16<LE>,
pub number_of_id_entries: U16<LE>,
}
pub const IMAGE_RESOURCE_NAME_IS_STRING: u32 = 0x8000_0000;
pub const IMAGE_RESOURCE_DATA_IS_DIRECTORY: u32 = 0x8000_0000;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageResourceDirectoryEntry {
pub name_or_id: U32<LE>,
pub offset_to_data_or_directory: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageResourceDirectoryString {
pub length: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageResourceDirStringU {
pub length: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageResourceDataEntry {
pub offset_to_data: U32<LE>,
pub size: U32<LE>,
pub code_page: U32<LE>,
pub reserved: U32<LE>,
}
#[cfg(feature = "names")]
pub const NAMES_RT: &ConstantNames<u16> = &_NAMES_RT;
constant_names!(_NAMES_RT: u16 = {
RT_CURSOR = 1,
RT_BITMAP = 2,
RT_ICON = 3,
RT_MENU = 4,
RT_DIALOG = 5,
RT_STRING = 6,
RT_FONTDIR = 7,
RT_FONT = 8,
RT_ACCELERATOR = 9,
RT_RCDATA = 10,
RT_MESSAGETABLE = 11,
RT_GROUP_CURSOR = 12,
RT_GROUP_ICON = 14,
RT_VERSION = 16,
RT_DLGINCLUDE = 17,
RT_PLUGPLAY = 19,
RT_VXD = 20,
RT_ANICURSOR = 21,
RT_ANIICON = 22,
RT_HTML = 23,
RT_MANIFEST = 24,
});
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageLoadConfigCodeIntegrity {
pub flags: U16<LE>,
pub catalog: U16<LE>,
pub catalog_offset: U32<LE>,
pub reserved: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDynamicRelocationTable {
pub version: U32<LE>,
pub size: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDynamicRelocation32 {
pub symbol: U32<LE, DynamicRelocationSymbol>,
pub base_reloc_size: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDynamicRelocation64 {
pub symbol: U64<LE, DynamicRelocationSymbol>,
pub base_reloc_size: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDynamicRelocation32V2 {
pub header_size: U32<LE>,
pub fixup_info_size: U32<LE>,
pub symbol: U32<LE, DynamicRelocationSymbol>,
pub symbol_group: U32<LE>,
pub flags: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDynamicRelocation64V2 {
pub header_size: U32<LE>,
pub fixup_info_size: U32<LE>,
pub symbol: U64<LE, DynamicRelocationSymbol>,
pub symbol_group: U32<LE>,
pub flags: U32<LE>,
}
newtype!(
struct DynamicRelocationSymbol(u64);
);
newtype_constant_names!(NAMES_DYNAMIC_RELOCATION: DynamicRelocationSymbol(u64) = {
IMAGE_DYNAMIC_RELOCATION_GUARD_RF_PROLOGUE = 0x0000_0001,
IMAGE_DYNAMIC_RELOCATION_GUARD_RF_EPILOGUE = 0x0000_0002,
IMAGE_DYNAMIC_RELOCATION_GUARD_IMPORT_CONTROL_TRANSFER = 0x0000_0003,
IMAGE_DYNAMIC_RELOCATION_GUARD_INDIR_CONTROL_TRANSFER = 0x0000_0004,
IMAGE_DYNAMIC_RELOCATION_GUARD_SWITCHTABLE_BRANCH = 0x0000_0005,
IMAGE_DYNAMIC_RELOCATION_FUNCTION_OVERRIDE = 0x0000_0007,
IMAGE_DYNAMIC_RELOCATION_ARM64_KERNEL_IMPORT_CALL_TRANSFER = 0x0000_0008,
});
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImagePrologueDynamicRelocationHeader {
pub prologue_byte_count: u8,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageEpilogueDynamicRelocationHeader {
pub epilogue_count: U32<LE>,
pub epilogue_byte_count: u8,
pub branch_descriptor_element_size: u8,
pub branch_descriptor_count: U16<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageLoadConfigDirectory32 {
pub size: U32<LE>,
pub time_date_stamp: U32<LE>,
pub major_version: U16<LE>,
pub minor_version: U16<LE>,
pub global_flags_clear: U32<LE>,
pub global_flags_set: U32<LE>,
pub critical_section_default_timeout: U32<LE>,
pub de_commit_free_block_threshold: U32<LE>,
pub de_commit_total_free_threshold: U32<LE>,
pub lock_prefix_table: U32<LE>,
pub maximum_allocation_size: U32<LE>,
pub virtual_memory_threshold: U32<LE>,
pub process_heap_flags: U32<LE>,
pub process_affinity_mask: U32<LE>,
pub csd_version: U16<LE>,
pub dependent_load_flags: U16<LE>,
pub edit_list: U32<LE>,
pub security_cookie: U32<LE>,
pub sehandler_table: U32<LE>,
pub sehandler_count: U32<LE>,
pub guard_cf_check_function_pointer: U32<LE>,
pub guard_cf_dispatch_function_pointer: U32<LE>,
pub guard_cf_function_table: U32<LE>,
pub guard_cf_function_count: U32<LE>,
pub guard_flags: U32<LE, GuardFlags>,
pub code_integrity: ImageLoadConfigCodeIntegrity,
pub guard_address_taken_iat_entry_table: U32<LE>,
pub guard_address_taken_iat_entry_count: U32<LE>,
pub guard_long_jump_target_table: U32<LE>,
pub guard_long_jump_target_count: U32<LE>,
pub dynamic_value_reloc_table: U32<LE>,
pub chpe_metadata_pointer: U32<LE>,
pub guard_rf_failure_routine: U32<LE>,
pub guard_rf_failure_routine_function_pointer: U32<LE>,
pub dynamic_value_reloc_table_offset: U32<LE>,
pub dynamic_value_reloc_table_section: U16<LE>,
pub reserved2: U16<LE>,
pub guard_rf_verify_stack_pointer_function_pointer: U32<LE>,
pub hot_patch_table_offset: U32<LE>,
pub reserved3: U32<LE>,
pub enclave_configuration_pointer: U32<LE>,
pub volatile_metadata_pointer: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageLoadConfigDirectory64 {
pub size: U32<LE>,
pub time_date_stamp: U32<LE>,
pub major_version: U16<LE>,
pub minor_version: U16<LE>,
pub global_flags_clear: U32<LE>,
pub global_flags_set: U32<LE>,
pub critical_section_default_timeout: U32<LE>,
pub de_commit_free_block_threshold: U64<LE>,
pub de_commit_total_free_threshold: U64<LE>,
pub lock_prefix_table: U64<LE>,
pub maximum_allocation_size: U64<LE>,
pub virtual_memory_threshold: U64<LE>,
pub process_affinity_mask: U64<LE>,
pub process_heap_flags: U32<LE>,
pub csd_version: U16<LE>,
pub dependent_load_flags: U16<LE>,
pub edit_list: U64<LE>,
pub security_cookie: U64<LE>,
pub sehandler_table: U64<LE>,
pub sehandler_count: U64<LE>,
pub guard_cf_check_function_pointer: U64<LE>,
pub guard_cf_dispatch_function_pointer: U64<LE>,
pub guard_cf_function_table: U64<LE>,
pub guard_cf_function_count: U64<LE>,
pub guard_flags: U32<LE, GuardFlags>,
pub code_integrity: ImageLoadConfigCodeIntegrity,
pub guard_address_taken_iat_entry_table: U64<LE>,
pub guard_address_taken_iat_entry_count: U64<LE>,
pub guard_long_jump_target_table: U64<LE>,
pub guard_long_jump_target_count: U64<LE>,
pub dynamic_value_reloc_table: U64<LE>,
pub chpe_metadata_pointer: U64<LE>,
pub guard_rf_failure_routine: U64<LE>,
pub guard_rf_failure_routine_function_pointer: U64<LE>,
pub dynamic_value_reloc_table_offset: U32<LE>,
pub dynamic_value_reloc_table_section: U16<LE>,
pub reserved2: U16<LE>,
pub guard_rf_verify_stack_pointer_function_pointer: U64<LE>,
pub hot_patch_table_offset: U32<LE>,
pub reserved3: U32<LE>,
pub enclave_configuration_pointer: U64<LE>,
pub volatile_metadata_pointer: U64<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageHotPatchInfo {
pub version: U32<LE>,
pub size: U32<LE>,
pub sequence_number: U32<LE>,
pub base_image_list: U32<LE>,
pub base_image_count: U32<LE>,
pub buffer_offset: U32<LE>,
pub extra_patch_size: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageHotPatchBase {
pub sequence_number: U32<LE>,
pub flags: U32<LE, HotPatchBaseFlags>,
pub original_time_date_stamp: U32<LE>,
pub original_check_sum: U32<LE>,
pub code_integrity_info: U32<LE>,
pub code_integrity_size: U32<LE>,
pub patch_table: U32<LE>,
pub buffer_offset: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageHotPatchHashes {
pub sha256: [u8; 32],
pub sha1: [u8; 20],
}
newtype!(
struct HotPatchBaseFlags(u32);
);
newtype_flag_names!(NAMES_HOT_PATCH_BASE: HotPatchBaseFlags(u32) = {
IMAGE_HOT_PATCH_BASE_OBLIGATORY = 0x0000_0001,
IMAGE_HOT_PATCH_BASE_CAN_ROLL_BACK = 0x0000_0002,
IMAGE_HOT_PATCH_BASE_MACHINE_I386 = 0x0000_0004,
IMAGE_HOT_PATCH_BASE_MACHINE_ARM64 = 0x0000_0008,
IMAGE_HOT_PATCH_BASE_MACHINE_AMD64 = 0x0000_0010,
});
newtype!(
struct HotPatchChunkFlags(u32);
);
newtype_flag_names!(NAMES_HOT_PATCH_CHUNK: HotPatchChunkFlags(u32) = {
IMAGE_HOT_PATCH_CHUNK_INVERSE = 0x8000_0000,
IMAGE_HOT_PATCH_CHUNK_OBLIGATORY = 0x4000_0000,
_ = IMAGE_HOT_PATCH_CHUNK_TYPE => NAMES_HOT_PATCH_CHUNK_TYPE,
});
pub const IMAGE_HOT_PATCH_CHUNK_RESERVED: u32 = 0x3FF0_3000;
pub const IMAGE_HOT_PATCH_CHUNK_TYPE: u32 = 0x000F_C000;
pub const IMAGE_HOT_PATCH_CHUNK_SOURCE_RVA: u32 = 0x0000_8000;
pub const IMAGE_HOT_PATCH_CHUNK_TARGET_RVA: u32 = 0x0000_4000;
pub const IMAGE_HOT_PATCH_CHUNK_SIZE: u32 = 0x0000_0FFF;
constant_names!(NAMES_HOT_PATCH_CHUNK_TYPE: HotPatchChunkFlags(u32) = {
IMAGE_HOT_PATCH_NONE = 0x0000_0000,
IMAGE_HOT_PATCH_FUNCTION = 0x0001_C000,
IMAGE_HOT_PATCH_ABSOLUTE = 0x0002_C000,
IMAGE_HOT_PATCH_REL32 = 0x0003_C000,
IMAGE_HOT_PATCH_CALL_TARGET = 0x0004_4000,
IMAGE_HOT_PATCH_INDIRECT = 0x0005_C000,
IMAGE_HOT_PATCH_NO_CALL_TARGET = 0x0006_4000,
IMAGE_HOT_PATCH_DYNAMIC_VALUE = 0x0007_8000,
});
newtype!(
struct GuardFlags(u32);
);
newtype_flag_names!(NAMES_GUARD: GuardFlags(u32) = {
IMAGE_GUARD_CF_INSTRUMENTED = 0x0000_0100,
IMAGE_GUARD_CFW_INSTRUMENTED = 0x0000_0200,
IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT = 0x0000_0400,
IMAGE_GUARD_SECURITY_COOKIE_UNUSED = 0x0000_0800,
IMAGE_GUARD_PROTECT_DELAYLOAD_IAT = 0x0000_1000,
IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION = 0x0000_2000,
IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT = 0x0000_4000,
IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION = 0x0000_8000,
IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT = 0x0001_0000,
IMAGE_GUARD_RF_INSTRUMENTED = 0x0002_0000,
IMAGE_GUARD_RF_ENABLE = 0x0004_0000,
IMAGE_GUARD_RF_STRICT = 0x0008_0000,
IMAGE_GUARD_RETPOLINE_PRESENT = 0x0010_0000,
IMAGE_GUARD_EH_CONTINUATION_TABLE_PRESENT = 0x0040_0000,
IMAGE_GUARD_XFG_ENABLED = 0x0080_0000,
IMAGE_GUARD_CASTGUARD_PRESENT = 0x0100_0000,
IMAGE_GUARD_MEMCPY_PRESENT = 0x0200_0000,
});
pub const IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK: u32 = 0xF000_0000;
pub const IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT: u32 = 28;
newtype!(
struct GuardFunctionFlags(u16);
);
newtype_flag_names!(NAMES_GUARD_FLAG: GuardFunctionFlags(u16) = {
IMAGE_GUARD_FLAG_FID_SUPPRESSED = 0x01,
IMAGE_GUARD_FLAG_EXPORT_SUPPRESSED = 0x02,
IMAGE_GUARD_FLAG_FID_LANGEXCPTHANDLER = 0x04,
IMAGE_GUARD_FLAG_FID_XFG = 0x08,
});
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageArmRuntimeFunctionEntry {
pub begin_address: U32<LE>,
pub unwind_data: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageArm64RuntimeFunctionEntry {
pub begin_address: U32<LE>,
pub unwind_data: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageAlpha64RuntimeFunctionEntry {
pub begin_address: U64<LE>,
pub end_address: U64<LE>,
pub exception_handler: U64<LE>,
pub handler_data: U64<LE>,
pub prolog_end_address: U64<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageAlphaRuntimeFunctionEntry {
pub begin_address: U32<LE>,
pub end_address: U32<LE>,
pub exception_handler: U32<LE>,
pub handler_data: U32<LE>,
pub prolog_end_address: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageRuntimeFunctionEntry {
pub begin_address: U32<LE>,
pub end_address: U32<LE>,
pub unwind_info_address_or_data: U32<LE>,
}
pub const IMAGE_ENCLAVE_LONG_ID_LENGTH: usize = 32;
pub const IMAGE_ENCLAVE_SHORT_ID_LENGTH: usize = 16;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageEnclaveConfig32 {
pub size: U32<LE>,
pub minimum_required_config_size: U32<LE>,
pub policy_flags: U32<LE, EnclavePolicyFlags>,
pub number_of_imports: U32<LE>,
pub import_list: U32<LE>,
pub import_entry_size: U32<LE>,
pub family_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH],
pub image_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH],
pub image_version: U32<LE>,
pub security_version: U32<LE>,
pub enclave_size: U32<LE>,
pub number_of_threads: U32<LE>,
pub enclave_flags: U32<LE, EnclaveFlags>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageEnclaveConfig64 {
pub size: U32<LE>,
pub minimum_required_config_size: U32<LE>,
pub policy_flags: U32<LE, EnclavePolicyFlags>,
pub number_of_imports: U32<LE>,
pub import_list: U32<LE>,
pub import_entry_size: U32<LE>,
pub family_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH],
pub image_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH],
pub image_version: U32<LE>,
pub security_version: U32<LE>,
pub enclave_size: U64<LE>,
pub number_of_threads: U32<LE>,
pub enclave_flags: U32<LE, EnclaveFlags>,
}
newtype!(
struct EnclavePolicyFlags(u32);
);
newtype_flag_names!(NAMES_IMAGE_ENCLAVE_POLICY: EnclavePolicyFlags(u32) = {
IMAGE_ENCLAVE_POLICY_DEBUGGABLE = 0x0000_0001,
IMAGE_ENCLAVE_POLICY_STRICT_MEMORY = 0x0000_0002,
});
newtype!(
struct EnclaveFlags(u32);
);
newtype_flag_names!(NAMES_IMAGE_ENCLAVE_FLAG: EnclaveFlags(u32) = {
IMAGE_ENCLAVE_FLAG_PRIMARY_IMAGE = 0x0000_0001,
});
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageEnclaveImport {
pub match_type: U32<LE, EnclaveImportMatchType>,
pub minimum_security_version: U32<LE>,
pub unique_or_author_id: [u8; IMAGE_ENCLAVE_LONG_ID_LENGTH],
pub family_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH],
pub image_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH],
pub import_name: U32<LE>,
pub reserved: U32<LE>,
}
newtype!(
struct EnclaveImportMatchType(u32);
);
newtype_constant_names!(NAMES_ENCLAVE_IMPORT_MATCH: EnclaveImportMatchType(u32) = {
IMAGE_ENCLAVE_IMPORT_MATCH_NONE = 0x0000_0000,
IMAGE_ENCLAVE_IMPORT_MATCH_UNIQUE_ID = 0x0000_0001,
IMAGE_ENCLAVE_IMPORT_MATCH_AUTHOR_ID = 0x0000_0002,
IMAGE_ENCLAVE_IMPORT_MATCH_FAMILY_ID = 0x0000_0003,
IMAGE_ENCLAVE_IMPORT_MATCH_IMAGE_ID = 0x0000_0004,
});
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDebugDirectory {
pub characteristics: U32<LE>,
pub time_date_stamp: U32<LE>,
pub major_version: U16<LE>,
pub minor_version: U16<LE>,
pub typ: U32<LE, DebugType>,
pub size_of_data: U32<LE>,
pub address_of_raw_data: U32<LE>,
pub pointer_to_raw_data: U32<LE>,
}
newtype!(
struct DebugType(u32);
);
newtype_constant_names!(NAMES_DEBUG_TYPE: DebugType(u32) = {
IMAGE_DEBUG_TYPE_UNKNOWN = 0,
IMAGE_DEBUG_TYPE_COFF = 1,
IMAGE_DEBUG_TYPE_CODEVIEW = 2,
IMAGE_DEBUG_TYPE_FPO = 3,
IMAGE_DEBUG_TYPE_MISC = 4,
IMAGE_DEBUG_TYPE_EXCEPTION = 5,
IMAGE_DEBUG_TYPE_FIXUP = 6,
IMAGE_DEBUG_TYPE_OMAP_TO_SRC = 7,
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC = 8,
IMAGE_DEBUG_TYPE_BORLAND = 9,
IMAGE_DEBUG_TYPE_BBT = IMAGE_DEBUG_TYPE_RESERVED10.0,
IMAGE_DEBUG_TYPE_RESERVED10 = 10,
IMAGE_DEBUG_TYPE_CLSID = 11,
IMAGE_DEBUG_TYPE_VC_FEATURE = 12,
IMAGE_DEBUG_TYPE_POGO = 13,
IMAGE_DEBUG_TYPE_ILTCG = 14,
IMAGE_DEBUG_TYPE_MPX = 15,
IMAGE_DEBUG_TYPE_REPRO = 16,
IMAGE_DEBUG_TYPE_SPGO = 18,
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS = 20,
});
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageCoffSymbolsHeader {
pub number_of_symbols: U32<LE>,
pub lva_to_first_symbol: U32<LE>,
pub number_of_linenumbers: U32<LE>,
pub lva_to_first_linenumber: U32<LE>,
pub rva_to_first_byte_of_code: U32<LE>,
pub rva_to_last_byte_of_code: U32<LE>,
pub rva_to_first_byte_of_data: U32<LE>,
pub rva_to_last_byte_of_data: U32<LE>,
}
newtype!(
struct FrameType(u8);
);
newtype_constant_names!(NAMES_FRAME: FrameType(u8) = {
FRAME_FPO = 0,
FRAME_TRAP = 1,
FRAME_TSS = 2,
FRAME_NONFPO = 3,
});
pub const IMAGE_DEBUG_MISC_EXENAME: u16 = 1;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageDebugMisc {
pub data_type: U32<LE>,
pub length: U32<LE>,
pub unicode: u8,
pub reserved: [u8; 3],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageFunctionEntry {
pub starting_address: U32<LE>,
pub ending_address: U32<LE>,
pub end_of_prologue: U32<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageFunctionEntry64 {
pub starting_address: U64<LE>,
pub ending_address: U64<LE>,
pub end_of_prologue_or_unwind_info_address: U64<LE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageSeparateDebugHeader {
pub signature: U16<LE>,
pub flags: U16<LE>,
pub machine: U16<LE, Machine>,
pub characteristics: U16<LE>,
pub time_date_stamp: U32<LE>,
pub check_sum: U32<LE>,
pub image_base: U32<LE>,
pub size_of_image: U32<LE>,
pub number_of_sections: U32<LE>,
pub exported_names_size: U32<LE>,
pub debug_directory_size: U32<LE>,
pub section_alignment: U32<LE>,
pub reserved: [U32<LE>; 2],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct NonPagedDebugInfo {
pub signature: U16<LE>,
pub flags: U16<LE>,
pub size: U32<LE>,
pub machine: U16<LE, Machine>,
pub characteristics: U16<LE>,
pub time_date_stamp: U32<LE>,
pub check_sum: U32<LE>,
pub size_of_image: U32<LE>,
pub image_base: U64<LE>,
}
pub const IMAGE_SEPARATE_DEBUG_SIGNATURE: u16 = 0x4944;
pub const NON_PAGED_DEBUG_SIGNATURE: u16 = 0x494E;
pub const IMAGE_SEPARATE_DEBUG_FLAGS_MASK: u16 = 0x8000;
pub const IMAGE_SEPARATE_DEBUG_MISMATCH: u16 = 0x8000;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageArchitectureEntry {
pub fixup_inst_rva: U32<LE>,
pub new_inst: U32<LE>,
}
pub const IMPORT_OBJECT_HDR_SIG2: u16 = 0xffff;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImportObjectHeader {
pub sig1: U16<LE, Machine>,
pub sig2: U16<LE>,
pub version: U16<LE>,
pub machine: U16<LE, Machine>,
pub time_date_stamp: U32<LE>,
pub size_of_data: U32<LE>,
pub ordinal_or_hint: U16<LE>,
pub name_type: U16<LE, ImportObjectFlags>,
}
newtype!(
struct ImportObjectFlags(u16);
);
newtype_flag_names!(NAMES_IMPORT_OBJECT: ImportObjectFlags(u16) = {
_ = IMPORT_OBJECT_TYPE_MASK << IMPORT_OBJECT_TYPE_SHIFT => NAMES_IMPORT_OBJECT_TYPE,
_ = IMPORT_OBJECT_NAME_MASK << IMPORT_OBJECT_NAME_SHIFT => NAMES_IMPORT_OBJECT_NAME,
});
impl ImportObjectFlags {
pub fn new(import_type: ImportObjectType, name_type: ImportObjectNameType) -> Self {
ImportObjectFlags(
ImportObjectFlags::from(import_type).0 | ImportObjectFlags::from(name_type).0,
)
}
pub fn import_type(self) -> ImportObjectType {
ImportObjectType(self.0 & IMPORT_OBJECT_TYPE_MASK)
}
pub fn name_type(self) -> ImportObjectNameType {
ImportObjectNameType((self.0 >> IMPORT_OBJECT_NAME_SHIFT) & IMPORT_OBJECT_NAME_MASK)
}
}
newtype!(
struct ImportObjectType(u16);
);
impl From<ImportObjectType> for ImportObjectFlags {
fn from(import_type: ImportObjectType) -> Self {
ImportObjectFlags(import_type.0 & IMPORT_OBJECT_TYPE_MASK)
}
}
impl From<ImportObjectFlags> for ImportObjectType {
fn from(value: ImportObjectFlags) -> Self {
value.import_type()
}
}
pub const IMPORT_OBJECT_TYPE_MASK: u16 = 0b11;
pub const IMPORT_OBJECT_TYPE_SHIFT: u16 = 0;
newtype_constant_names!(NAMES_IMPORT_OBJECT_TYPE: ImportObjectType(u16) = {
IMPORT_OBJECT_CODE = 0,
IMPORT_OBJECT_DATA = 1,
IMPORT_OBJECT_CONST = 2,
});
newtype!(
struct ImportObjectNameType(u16);
);
impl From<ImportObjectNameType> for ImportObjectFlags {
fn from(name_type: ImportObjectNameType) -> Self {
ImportObjectFlags((name_type.0 & IMPORT_OBJECT_NAME_MASK) << IMPORT_OBJECT_NAME_SHIFT)
}
}
impl From<ImportObjectFlags> for ImportObjectNameType {
fn from(value: ImportObjectFlags) -> Self {
value.name_type()
}
}
pub const IMPORT_OBJECT_NAME_MASK: u16 = 0b111;
pub const IMPORT_OBJECT_NAME_SHIFT: u16 = 2;
newtype_constant_names!(NAMES_IMPORT_OBJECT_NAME: ImportObjectNameType(u16) = {
IMPORT_OBJECT_ORDINAL = 0,
IMPORT_OBJECT_NAME = 1,
IMPORT_OBJECT_NAME_NO_PREFIX = 2,
IMPORT_OBJECT_NAME_UNDECORATE = 3,
IMPORT_OBJECT_NAME_EXPORTAS = 4,
});
newtype!(
struct CorFlags(u32);
);
newtype_flag_names!(NAMES_COMIMAGE_FLAGS: CorFlags(u32) = {
COMIMAGE_FLAGS_ILONLY = 0x0000_0001,
COMIMAGE_FLAGS_32BITREQUIRED = 0x0000_0002,
COMIMAGE_FLAGS_IL_LIBRARY = 0x0000_0004,
COMIMAGE_FLAGS_STRONGNAMESIGNED = 0x0000_0008,
COMIMAGE_FLAGS_NATIVE_ENTRYPOINT = 0x0000_0010,
COMIMAGE_FLAGS_TRACKDEBUGDATA = 0x0001_0000,
COMIMAGE_FLAGS_32BITPREFERRED = 0x0002_0000,
});
pub const COR_VERSION_MAJOR_V2: u16 = 2;
pub const COR_VERSION_MAJOR: u16 = COR_VERSION_MAJOR_V2;
pub const COR_VERSION_MINOR: u16 = 5;
pub const COR_DELETED_NAME_LENGTH: usize = 8;
pub const COR_VTABLEGAP_NAME_LENGTH: usize = 8;
pub const NATIVE_TYPE_MAX_CB: u16 = 1;
pub const COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE: u16 = 0xFF;
pub const IMAGE_COR_MIH_METHODRVA: u16 = 0x01;
pub const IMAGE_COR_MIH_EHRVA: u16 = 0x02;
pub const IMAGE_COR_MIH_BASICBLOCK: u16 = 0x08;
newtype!(
struct CorVtableFlags(u16);
);
newtype_flag_names!(NAMES_COR_VTABLE: CorVtableFlags(u16) = {
COR_VTABLE_32BIT = 0x01,
COR_VTABLE_64BIT = 0x02,
COR_VTABLE_FROM_UNMANAGED = 0x04,
COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN = 0x08,
COR_VTABLE_CALL_MOST_DERIVED = 0x10,
});
pub const IMAGE_COR_EATJ_THUNK_SIZE: usize = 32;
pub const MAX_CLASS_NAME: usize = 1024;
pub const MAX_PACKAGE_NAME: usize = 1024;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ImageCor20Header {
pub cb: U32<LE>,
pub major_runtime_version: U16<LE>,
pub minor_runtime_version: U16<LE>,
pub meta_data: ImageDataDirectory,
pub flags: U32<LE, CorFlags>,
pub entry_point_token_or_rva: U32<LE>,
pub resources: ImageDataDirectory,
pub strong_name_signature: ImageDataDirectory,
pub code_manager_table: ImageDataDirectory,
pub vtable_fixups: ImageDataDirectory,
pub export_address_table_jumps: ImageDataDirectory,
pub managed_native_header: ImageDataDirectory,
}
unsafe_impl_pod!(
ImageDosHeader,
ImageOs2Header,
ImageVxdHeader,
ImageFileHeader,
ImageDataDirectory,
ImageOptionalHeader32,
ImageRomOptionalHeader,
ImageOptionalHeader64,
ImageNtHeaders64,
ImageNtHeaders32,
ImageRomHeaders,
Guid,
AnonObjectHeader,
AnonObjectHeaderV2,
AnonObjectHeaderBigobj,
ImageSectionHeader,
ImageSymbol,
ImageSymbolBytes,
ImageSymbolEx,
ImageSymbolExBytes,
ImageAuxSymbolTokenDef,
ImageAuxSymbolFunction,
ImageAuxSymbolFunctionBeginEnd,
ImageAuxSymbolWeak,
ImageAuxSymbolSection,
ImageAuxSymbolCrc,
ImageRelocation,
ImageLinenumber,
ImageBaseRelocation,
ImageArchiveMemberHeader,
ImageExportDirectory,
ImageImportByName,
ImageThunkData64,
ImageThunkData32,
ImageTlsDirectory64,
ImageTlsDirectory32,
ImageImportDescriptor,
ImageBoundImportDescriptor,
ImageBoundForwarderRef,
ImageDelayloadDescriptor,
ImageResourceDirectory,
ImageResourceDirectoryEntry,
ImageResourceDirectoryString,
ImageResourceDirStringU,
ImageResourceDataEntry,
ImageLoadConfigCodeIntegrity,
ImageDynamicRelocationTable,
ImageDynamicRelocation32,
ImageDynamicRelocation64,
ImageDynamicRelocation32V2,
ImageDynamicRelocation64V2,
ImagePrologueDynamicRelocationHeader,
ImageEpilogueDynamicRelocationHeader,
ImageLoadConfigDirectory32,
ImageLoadConfigDirectory64,
ImageHotPatchInfo,
ImageHotPatchBase,
ImageHotPatchHashes,
ImageArmRuntimeFunctionEntry,
ImageArm64RuntimeFunctionEntry,
ImageAlpha64RuntimeFunctionEntry,
ImageAlphaRuntimeFunctionEntry,
ImageRuntimeFunctionEntry,
ImageEnclaveConfig32,
ImageEnclaveConfig64,
ImageEnclaveImport,
ImageDebugDirectory,
ImageCoffSymbolsHeader,
ImageDebugMisc,
ImageFunctionEntry,
ImageFunctionEntry64,
ImageSeparateDebugHeader,
NonPagedDebugInfo,
ImageArchitectureEntry,
ImportObjectHeader,
ImageCor20Header,
MaskedRichHeaderEntry,
);