use crate::target::Architecture;
pub const IMAGE_FILE_MACHINE_UNKNOWN: u16 = 0;
pub const IMAGE_FILE_MACHINE_I386: u16 = 0x014c;
pub const IMAGE_FILE_MACHINE_ARM: u16 = 0x01c0;
pub const IMAGE_FILE_MACHINE_THUMB: u16 = 0x01c2;
pub const IMAGE_FILE_MACHINE_ARMNT: u16 = 0x01c4;
pub const IMAGE_FILE_MACHINE_IA64: u16 = 0x0200;
pub const IMAGE_FILE_MACHINE_RISCV32: u16 = 0x5032;
pub const IMAGE_FILE_MACHINE_RISCV64: u16 = 0x5064;
pub const IMAGE_FILE_MACHINE_LOONGARCH64: u16 = 0x6264;
pub const IMAGE_FILE_MACHINE_AMD64: u16 = 0x8664;
pub const IMAGE_FILE_MACHINE_ARM64EC: u16 = 0xa641;
pub const IMAGE_FILE_MACHINE_ARM64X: u16 = 0xa64e;
pub const IMAGE_FILE_MACHINE_ARM64: u16 = 0xaa64;
#[must_use]
pub fn machine_architecture(machine: u16) -> Option<Architecture> {
Some(match machine {
IMAGE_FILE_MACHINE_I386 => Architecture::X86,
IMAGE_FILE_MACHINE_AMD64 => Architecture::X86_64,
IMAGE_FILE_MACHINE_ARM64 | IMAGE_FILE_MACHINE_ARM64EC | IMAGE_FILE_MACHINE_ARM64X => {
Architecture::Aarch64
}
IMAGE_FILE_MACHINE_ARM | IMAGE_FILE_MACHINE_THUMB | IMAGE_FILE_MACHINE_ARMNT => {
Architecture::Arm
}
IMAGE_FILE_MACHINE_RISCV32 => Architecture::Riscv32,
IMAGE_FILE_MACHINE_RISCV64 => Architecture::Riscv64,
IMAGE_FILE_MACHINE_LOONGARCH64 => Architecture::LoongArch64,
_ => return None,
})
}
#[must_use]
pub fn machine_name(machine: u16) -> Option<&'static str> {
Some(match machine {
IMAGE_FILE_MACHINE_UNKNOWN => "IMAGE_FILE_MACHINE_UNKNOWN",
IMAGE_FILE_MACHINE_I386 => "IMAGE_FILE_MACHINE_I386",
IMAGE_FILE_MACHINE_ARM => "IMAGE_FILE_MACHINE_ARM",
IMAGE_FILE_MACHINE_THUMB => "IMAGE_FILE_MACHINE_THUMB",
IMAGE_FILE_MACHINE_ARMNT => "IMAGE_FILE_MACHINE_ARMNT",
IMAGE_FILE_MACHINE_IA64 => "IMAGE_FILE_MACHINE_IA64",
IMAGE_FILE_MACHINE_RISCV32 => "IMAGE_FILE_MACHINE_RISCV32",
IMAGE_FILE_MACHINE_RISCV64 => "IMAGE_FILE_MACHINE_RISCV64",
IMAGE_FILE_MACHINE_LOONGARCH64 => "IMAGE_FILE_MACHINE_LOONGARCH64",
IMAGE_FILE_MACHINE_AMD64 => "IMAGE_FILE_MACHINE_AMD64",
IMAGE_FILE_MACHINE_ARM64EC => "IMAGE_FILE_MACHINE_ARM64EC",
IMAGE_FILE_MACHINE_ARM64X => "IMAGE_FILE_MACHINE_ARM64X",
IMAGE_FILE_MACHINE_ARM64 => "IMAGE_FILE_MACHINE_ARM64",
_ => return None,
})
}
#[must_use]
pub fn is_arm64(machine: u16) -> bool {
matches!(
machine,
IMAGE_FILE_MACHINE_ARM64 | IMAGE_FILE_MACHINE_ARM64EC | IMAGE_FILE_MACHINE_ARM64X
)
}
pub const IMAGE_FILE_RELOCS_STRIPPED: u16 = 0x0001;
pub const IMAGE_FILE_EXECUTABLE_IMAGE: u16 = 0x0002;
pub const IMAGE_FILE_LINE_NUMS_STRIPPED: u16 = 0x0004;
pub const IMAGE_FILE_LOCAL_SYMS_STRIPPED: u16 = 0x0008;
pub const IMAGE_FILE_AGGRESSIVE_WS_TRIM: u16 = 0x0010;
pub const IMAGE_FILE_LARGE_ADDRESS_AWARE: u16 = 0x0020;
pub const IMAGE_FILE_BYTES_REVERSED_LO: u16 = 0x0080;
pub const IMAGE_FILE_32BIT_MACHINE: u16 = 0x0100;
pub const IMAGE_FILE_DEBUG_STRIPPED: u16 = 0x0200;
pub const IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP: u16 = 0x0400;
pub const IMAGE_FILE_NET_RUN_FROM_SWAP: u16 = 0x0800;
pub const IMAGE_FILE_SYSTEM: u16 = 0x1000;
pub const IMAGE_FILE_DLL: u16 = 0x2000;
pub const IMAGE_FILE_UP_SYSTEM_ONLY: u16 = 0x4000;
pub const IMAGE_FILE_BYTES_REVERSED_HI: u16 = 0x8000;
pub const IMAGE_SCN_TYPE_NO_PAD: u32 = 0x0000_0008;
pub const IMAGE_SCN_CNT_CODE: u32 = 0x0000_0020;
pub const IMAGE_SCN_CNT_INITIALIZED_DATA: u32 = 0x0000_0040;
pub const IMAGE_SCN_CNT_UNINITIALIZED_DATA: u32 = 0x0000_0080;
pub const IMAGE_SCN_LNK_OTHER: u32 = 0x0000_0100;
pub const IMAGE_SCN_LNK_INFO: u32 = 0x0000_0200;
pub const IMAGE_SCN_LNK_REMOVE: u32 = 0x0000_0800;
pub const IMAGE_SCN_LNK_COMDAT: u32 = 0x0000_1000;
pub const IMAGE_SCN_GPREL: u32 = 0x0000_8000;
pub const IMAGE_SCN_MEM_PURGEABLE: u32 = 0x0002_0000;
pub const IMAGE_SCN_MEM_16BIT: u32 = 0x0002_0000;
pub const IMAGE_SCN_MEM_LOCKED: u32 = 0x0004_0000;
pub const IMAGE_SCN_MEM_PRELOAD: u32 = 0x0008_0000;
pub const IMAGE_SCN_ALIGN_MASK: u32 = 0x00f0_0000;
pub const IMAGE_SCN_ALIGN_1BYTES: u32 = 0x0010_0000;
pub const IMAGE_SCN_ALIGN_2BYTES: u32 = 0x0020_0000;
pub const IMAGE_SCN_ALIGN_4BYTES: u32 = 0x0030_0000;
pub const IMAGE_SCN_ALIGN_8BYTES: u32 = 0x0040_0000;
pub const IMAGE_SCN_ALIGN_16BYTES: u32 = 0x0050_0000;
pub const IMAGE_SCN_ALIGN_32BYTES: u32 = 0x0060_0000;
pub const IMAGE_SCN_ALIGN_64BYTES: u32 = 0x0070_0000;
pub const IMAGE_SCN_ALIGN_128BYTES: u32 = 0x0080_0000;
pub const IMAGE_SCN_ALIGN_256BYTES: u32 = 0x0090_0000;
pub const IMAGE_SCN_ALIGN_512BYTES: u32 = 0x00a0_0000;
pub const IMAGE_SCN_ALIGN_1024BYTES: u32 = 0x00b0_0000;
pub const IMAGE_SCN_ALIGN_2048BYTES: u32 = 0x00c0_0000;
pub const IMAGE_SCN_ALIGN_4096BYTES: u32 = 0x00d0_0000;
pub const IMAGE_SCN_ALIGN_8192BYTES: u32 = 0x00e0_0000;
pub const IMAGE_SCN_LNK_NRELOC_OVFL: u32 = 0x0100_0000;
pub const IMAGE_SCN_MEM_DISCARDABLE: u32 = 0x0200_0000;
pub const IMAGE_SCN_MEM_SHARED: u32 = 0x1000_0000;
pub const IMAGE_SCN_MEM_EXECUTE: u32 = 0x2000_0000;
pub const IMAGE_SCN_MEM_READ: u32 = 0x4000_0000;
pub const IMAGE_SCN_MEM_WRITE: u32 = 0x8000_0000;
pub const SECTION_FLAG_NAMES: &[(u32, &str)] = &[
(IMAGE_SCN_TYPE_NO_PAD, "IMAGE_SCN_TYPE_NO_PAD"),
(IMAGE_SCN_CNT_CODE, "IMAGE_SCN_CNT_CODE"),
(
IMAGE_SCN_CNT_INITIALIZED_DATA,
"IMAGE_SCN_CNT_INITIALIZED_DATA",
),
(
IMAGE_SCN_CNT_UNINITIALIZED_DATA,
"IMAGE_SCN_CNT_UNINITIALIZED_DATA",
),
(IMAGE_SCN_LNK_OTHER, "IMAGE_SCN_LNK_OTHER"),
(IMAGE_SCN_LNK_INFO, "IMAGE_SCN_LNK_INFO"),
(IMAGE_SCN_LNK_REMOVE, "IMAGE_SCN_LNK_REMOVE"),
(IMAGE_SCN_LNK_COMDAT, "IMAGE_SCN_LNK_COMDAT"),
(IMAGE_SCN_GPREL, "IMAGE_SCN_GPREL"),
(IMAGE_SCN_MEM_PURGEABLE, "IMAGE_SCN_MEM_PURGEABLE"),
(IMAGE_SCN_MEM_LOCKED, "IMAGE_SCN_MEM_LOCKED"),
(IMAGE_SCN_MEM_PRELOAD, "IMAGE_SCN_MEM_PRELOAD"),
(IMAGE_SCN_LNK_NRELOC_OVFL, "IMAGE_SCN_LNK_NRELOC_OVFL"),
(IMAGE_SCN_MEM_DISCARDABLE, "IMAGE_SCN_MEM_DISCARDABLE"),
(IMAGE_SCN_MEM_SHARED, "IMAGE_SCN_MEM_SHARED"),
(IMAGE_SCN_MEM_EXECUTE, "IMAGE_SCN_MEM_EXECUTE"),
(IMAGE_SCN_MEM_READ, "IMAGE_SCN_MEM_READ"),
(IMAGE_SCN_MEM_WRITE, "IMAGE_SCN_MEM_WRITE"),
];
pub const IMAGE_SYM_UNDEFINED: i32 = 0;
pub const IMAGE_SYM_ABSOLUTE: i32 = -1;
pub const IMAGE_SYM_DEBUG: i32 = -2;
pub const MAX_NUMBER_OF_SECTIONS_16: u16 = 0xfeff;
pub const IMAGE_SYM_TYPE_NULL: u16 = 0;
pub const IMAGE_SYM_DTYPE_NULL: u16 = 0;
pub const IMAGE_SYM_DTYPE_POINTER: u16 = 1;
pub const IMAGE_SYM_DTYPE_FUNCTION: u16 = 2;
pub const IMAGE_SYM_DTYPE_ARRAY: u16 = 3;
pub const IMAGE_SYM_CLASS_END_OF_FUNCTION: u8 = 0xff;
pub const IMAGE_SYM_CLASS_NULL: u8 = 0;
pub const IMAGE_SYM_CLASS_AUTOMATIC: u8 = 1;
pub const IMAGE_SYM_CLASS_EXTERNAL: u8 = 2;
pub const IMAGE_SYM_CLASS_STATIC: u8 = 3;
pub const IMAGE_SYM_CLASS_REGISTER: u8 = 4;
pub const IMAGE_SYM_CLASS_EXTERNAL_DEF: u8 = 5;
pub const IMAGE_SYM_CLASS_LABEL: u8 = 6;
pub const IMAGE_SYM_CLASS_UNDEFINED_LABEL: u8 = 7;
pub const IMAGE_SYM_CLASS_MEMBER_OF_STRUCT: u8 = 8;
pub const IMAGE_SYM_CLASS_ARGUMENT: u8 = 9;
pub const IMAGE_SYM_CLASS_STRUCT_TAG: u8 = 10;
pub const IMAGE_SYM_CLASS_MEMBER_OF_UNION: u8 = 11;
pub const IMAGE_SYM_CLASS_UNION_TAG: u8 = 12;
pub const IMAGE_SYM_CLASS_TYPE_DEFINITION: u8 = 13;
pub const IMAGE_SYM_CLASS_UNDEFINED_STATIC: u8 = 14;
pub const IMAGE_SYM_CLASS_ENUM_TAG: u8 = 15;
pub const IMAGE_SYM_CLASS_MEMBER_OF_ENUM: u8 = 16;
pub const IMAGE_SYM_CLASS_REGISTER_PARAM: u8 = 17;
pub const IMAGE_SYM_CLASS_BIT_FIELD: u8 = 18;
pub const IMAGE_SYM_CLASS_BLOCK: u8 = 100;
pub const IMAGE_SYM_CLASS_FUNCTION: u8 = 101;
pub const IMAGE_SYM_CLASS_END_OF_STRUCT: u8 = 102;
pub const IMAGE_SYM_CLASS_FILE: u8 = 103;
pub const IMAGE_SYM_CLASS_SECTION: u8 = 104;
pub const IMAGE_SYM_CLASS_WEAK_EXTERNAL: u8 = 105;
pub const IMAGE_SYM_CLASS_CLR_TOKEN: u8 = 107;
#[must_use]
pub fn storage_class_name(class: u8) -> Option<&'static str> {
Some(match class {
IMAGE_SYM_CLASS_END_OF_FUNCTION => "EndOfFunction",
IMAGE_SYM_CLASS_NULL => "Null",
IMAGE_SYM_CLASS_AUTOMATIC => "Automatic",
IMAGE_SYM_CLASS_EXTERNAL => "External",
IMAGE_SYM_CLASS_STATIC => "Static",
IMAGE_SYM_CLASS_REGISTER => "Register",
IMAGE_SYM_CLASS_EXTERNAL_DEF => "ExternalDef",
IMAGE_SYM_CLASS_LABEL => "Label",
IMAGE_SYM_CLASS_UNDEFINED_LABEL => "UndefinedLabel",
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT => "MemberOfStruct",
IMAGE_SYM_CLASS_ARGUMENT => "Argument",
IMAGE_SYM_CLASS_STRUCT_TAG => "StructTag",
IMAGE_SYM_CLASS_MEMBER_OF_UNION => "MemberOfUnion",
IMAGE_SYM_CLASS_UNION_TAG => "UnionTag",
IMAGE_SYM_CLASS_TYPE_DEFINITION => "TypeDefinition",
IMAGE_SYM_CLASS_UNDEFINED_STATIC => "UndefinedStatic",
IMAGE_SYM_CLASS_ENUM_TAG => "EnumTag",
IMAGE_SYM_CLASS_MEMBER_OF_ENUM => "MemberOfEnum",
IMAGE_SYM_CLASS_REGISTER_PARAM => "RegisterParam",
IMAGE_SYM_CLASS_BIT_FIELD => "BitField",
IMAGE_SYM_CLASS_BLOCK => "Block",
IMAGE_SYM_CLASS_FUNCTION => "Function",
IMAGE_SYM_CLASS_END_OF_STRUCT => "EndOfStruct",
IMAGE_SYM_CLASS_FILE => "File",
IMAGE_SYM_CLASS_SECTION => "Section",
IMAGE_SYM_CLASS_WEAK_EXTERNAL => "WeakExternal",
IMAGE_SYM_CLASS_CLR_TOKEN => "CLRToken",
_ => return None,
})
}
pub const IMAGE_COMDAT_SELECT_NODUPLICATES: u8 = 1;
pub const IMAGE_COMDAT_SELECT_ANY: u8 = 2;
pub const IMAGE_COMDAT_SELECT_SAME_SIZE: u8 = 3;
pub const IMAGE_COMDAT_SELECT_EXACT_MATCH: u8 = 4;
pub const IMAGE_COMDAT_SELECT_ASSOCIATIVE: u8 = 5;
pub const IMAGE_COMDAT_SELECT_LARGEST: u8 = 6;
pub const IMAGE_COMDAT_SELECT_NEWEST: u8 = 7;
pub const IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY: u32 = 1;
pub const IMAGE_WEAK_EXTERN_SEARCH_LIBRARY: u32 = 2;
pub const IMAGE_WEAK_EXTERN_SEARCH_ALIAS: u32 = 3;
pub const IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY: u32 = 4;
pub const FEAT00_SAFESEH: u32 = 0x1;
pub const FEAT00_GUARD_STACK: u32 = 0x100;
pub const FEAT00_SDL: u32 = 0x200;
pub const FEAT00_GUARD_CF: u32 = 0x800;
pub const FEAT00_GUARD_EHCONT: u32 = 0x4000;
pub const FEAT00_KERNEL: u32 = 0x4000_0000;
pub mod amd64 {
pub const IMAGE_REL_AMD64_ABSOLUTE: u16 = 0x0000;
pub const IMAGE_REL_AMD64_ADDR64: u16 = 0x0001;
pub const IMAGE_REL_AMD64_ADDR32: u16 = 0x0002;
pub const IMAGE_REL_AMD64_ADDR32NB: u16 = 0x0003;
pub const IMAGE_REL_AMD64_REL32: u16 = 0x0004;
pub const IMAGE_REL_AMD64_REL32_1: u16 = 0x0005;
pub const IMAGE_REL_AMD64_REL32_2: u16 = 0x0006;
pub const IMAGE_REL_AMD64_REL32_3: u16 = 0x0007;
pub const IMAGE_REL_AMD64_REL32_4: u16 = 0x0008;
pub const IMAGE_REL_AMD64_REL32_5: u16 = 0x0009;
pub const IMAGE_REL_AMD64_SECTION: u16 = 0x000a;
pub const IMAGE_REL_AMD64_SECREL: u16 = 0x000b;
pub const IMAGE_REL_AMD64_SECREL7: u16 = 0x000c;
pub const IMAGE_REL_AMD64_TOKEN: u16 = 0x000d;
pub const IMAGE_REL_AMD64_SREL32: u16 = 0x000e;
pub const IMAGE_REL_AMD64_PAIR: u16 = 0x000f;
pub const IMAGE_REL_AMD64_SSPAN32: u16 = 0x0010;
#[must_use]
pub fn name(r_type: u16) -> Option<&'static str> {
Some(match r_type {
IMAGE_REL_AMD64_ABSOLUTE => "IMAGE_REL_AMD64_ABSOLUTE",
IMAGE_REL_AMD64_ADDR64 => "IMAGE_REL_AMD64_ADDR64",
IMAGE_REL_AMD64_ADDR32 => "IMAGE_REL_AMD64_ADDR32",
IMAGE_REL_AMD64_ADDR32NB => "IMAGE_REL_AMD64_ADDR32NB",
IMAGE_REL_AMD64_REL32 => "IMAGE_REL_AMD64_REL32",
IMAGE_REL_AMD64_REL32_1 => "IMAGE_REL_AMD64_REL32_1",
IMAGE_REL_AMD64_REL32_2 => "IMAGE_REL_AMD64_REL32_2",
IMAGE_REL_AMD64_REL32_3 => "IMAGE_REL_AMD64_REL32_3",
IMAGE_REL_AMD64_REL32_4 => "IMAGE_REL_AMD64_REL32_4",
IMAGE_REL_AMD64_REL32_5 => "IMAGE_REL_AMD64_REL32_5",
IMAGE_REL_AMD64_SECTION => "IMAGE_REL_AMD64_SECTION",
IMAGE_REL_AMD64_SECREL => "IMAGE_REL_AMD64_SECREL",
IMAGE_REL_AMD64_SECREL7 => "IMAGE_REL_AMD64_SECREL7",
IMAGE_REL_AMD64_TOKEN => "IMAGE_REL_AMD64_TOKEN",
IMAGE_REL_AMD64_SREL32 => "IMAGE_REL_AMD64_SREL32",
IMAGE_REL_AMD64_PAIR => "IMAGE_REL_AMD64_PAIR",
IMAGE_REL_AMD64_SSPAN32 => "IMAGE_REL_AMD64_SSPAN32",
_ => return None,
})
}
}
pub mod i386 {
pub const IMAGE_REL_I386_ABSOLUTE: u16 = 0x0000;
pub const IMAGE_REL_I386_DIR16: u16 = 0x0001;
pub const IMAGE_REL_I386_REL16: u16 = 0x0002;
pub const IMAGE_REL_I386_DIR32: u16 = 0x0006;
pub const IMAGE_REL_I386_DIR32NB: u16 = 0x0007;
pub const IMAGE_REL_I386_SEG12: u16 = 0x0009;
pub const IMAGE_REL_I386_SECTION: u16 = 0x000a;
pub const IMAGE_REL_I386_SECREL: u16 = 0x000b;
pub const IMAGE_REL_I386_TOKEN: u16 = 0x000c;
pub const IMAGE_REL_I386_SECREL7: u16 = 0x000d;
pub const IMAGE_REL_I386_REL32: u16 = 0x0014;
#[must_use]
pub fn name(r_type: u16) -> Option<&'static str> {
Some(match r_type {
IMAGE_REL_I386_ABSOLUTE => "IMAGE_REL_I386_ABSOLUTE",
IMAGE_REL_I386_DIR16 => "IMAGE_REL_I386_DIR16",
IMAGE_REL_I386_REL16 => "IMAGE_REL_I386_REL16",
IMAGE_REL_I386_DIR32 => "IMAGE_REL_I386_DIR32",
IMAGE_REL_I386_DIR32NB => "IMAGE_REL_I386_DIR32NB",
IMAGE_REL_I386_SEG12 => "IMAGE_REL_I386_SEG12",
IMAGE_REL_I386_SECTION => "IMAGE_REL_I386_SECTION",
IMAGE_REL_I386_SECREL => "IMAGE_REL_I386_SECREL",
IMAGE_REL_I386_TOKEN => "IMAGE_REL_I386_TOKEN",
IMAGE_REL_I386_SECREL7 => "IMAGE_REL_I386_SECREL7",
IMAGE_REL_I386_REL32 => "IMAGE_REL_I386_REL32",
_ => return None,
})
}
}
pub mod arm64 {
pub const IMAGE_REL_ARM64_ABSOLUTE: u16 = 0x0000;
pub const IMAGE_REL_ARM64_ADDR32: u16 = 0x0001;
pub const IMAGE_REL_ARM64_ADDR32NB: u16 = 0x0002;
pub const IMAGE_REL_ARM64_BRANCH26: u16 = 0x0003;
pub const IMAGE_REL_ARM64_PAGEBASE_REL21: u16 = 0x0004;
pub const IMAGE_REL_ARM64_REL21: u16 = 0x0005;
pub const IMAGE_REL_ARM64_PAGEOFFSET_12A: u16 = 0x0006;
pub const IMAGE_REL_ARM64_PAGEOFFSET_12L: u16 = 0x0007;
pub const IMAGE_REL_ARM64_SECREL: u16 = 0x0008;
pub const IMAGE_REL_ARM64_SECREL_LOW12A: u16 = 0x0009;
pub const IMAGE_REL_ARM64_SECREL_HIGH12A: u16 = 0x000a;
pub const IMAGE_REL_ARM64_SECREL_LOW12L: u16 = 0x000b;
pub const IMAGE_REL_ARM64_TOKEN: u16 = 0x000c;
pub const IMAGE_REL_ARM64_SECTION: u16 = 0x000d;
pub const IMAGE_REL_ARM64_ADDR64: u16 = 0x000e;
pub const IMAGE_REL_ARM64_BRANCH19: u16 = 0x000f;
pub const IMAGE_REL_ARM64_BRANCH14: u16 = 0x0010;
pub const IMAGE_REL_ARM64_REL32: u16 = 0x0011;
#[must_use]
pub fn name(r_type: u16) -> Option<&'static str> {
Some(match r_type {
IMAGE_REL_ARM64_ABSOLUTE => "IMAGE_REL_ARM64_ABSOLUTE",
IMAGE_REL_ARM64_ADDR32 => "IMAGE_REL_ARM64_ADDR32",
IMAGE_REL_ARM64_ADDR32NB => "IMAGE_REL_ARM64_ADDR32NB",
IMAGE_REL_ARM64_BRANCH26 => "IMAGE_REL_ARM64_BRANCH26",
IMAGE_REL_ARM64_PAGEBASE_REL21 => "IMAGE_REL_ARM64_PAGEBASE_REL21",
IMAGE_REL_ARM64_REL21 => "IMAGE_REL_ARM64_REL21",
IMAGE_REL_ARM64_PAGEOFFSET_12A => "IMAGE_REL_ARM64_PAGEOFFSET_12A",
IMAGE_REL_ARM64_PAGEOFFSET_12L => "IMAGE_REL_ARM64_PAGEOFFSET_12L",
IMAGE_REL_ARM64_SECREL => "IMAGE_REL_ARM64_SECREL",
IMAGE_REL_ARM64_SECREL_LOW12A => "IMAGE_REL_ARM64_SECREL_LOW12A",
IMAGE_REL_ARM64_SECREL_HIGH12A => "IMAGE_REL_ARM64_SECREL_HIGH12A",
IMAGE_REL_ARM64_SECREL_LOW12L => "IMAGE_REL_ARM64_SECREL_LOW12L",
IMAGE_REL_ARM64_TOKEN => "IMAGE_REL_ARM64_TOKEN",
IMAGE_REL_ARM64_SECTION => "IMAGE_REL_ARM64_SECTION",
IMAGE_REL_ARM64_ADDR64 => "IMAGE_REL_ARM64_ADDR64",
IMAGE_REL_ARM64_BRANCH19 => "IMAGE_REL_ARM64_BRANCH19",
IMAGE_REL_ARM64_BRANCH14 => "IMAGE_REL_ARM64_BRANCH14",
IMAGE_REL_ARM64_REL32 => "IMAGE_REL_ARM64_REL32",
_ => return None,
})
}
}
pub mod arm {
pub const IMAGE_REL_ARM_ABSOLUTE: u16 = 0x0000;
pub const IMAGE_REL_ARM_ADDR32: u16 = 0x0001;
pub const IMAGE_REL_ARM_ADDR32NB: u16 = 0x0002;
pub const IMAGE_REL_ARM_BRANCH24: u16 = 0x0003;
pub const IMAGE_REL_ARM_BRANCH11: u16 = 0x0004;
pub const IMAGE_REL_ARM_TOKEN: u16 = 0x0005;
pub const IMAGE_REL_ARM_BLX24: u16 = 0x0008;
pub const IMAGE_REL_ARM_BLX11: u16 = 0x0009;
pub const IMAGE_REL_ARM_REL32: u16 = 0x000a;
pub const IMAGE_REL_ARM_SECTION: u16 = 0x000e;
pub const IMAGE_REL_ARM_SECREL: u16 = 0x000f;
pub const IMAGE_REL_ARM_MOV32A: u16 = 0x0010;
pub const IMAGE_REL_ARM_MOV32T: u16 = 0x0011;
pub const IMAGE_REL_ARM_BRANCH20T: u16 = 0x0012;
pub const IMAGE_REL_ARM_BRANCH24T: u16 = 0x0014;
pub const IMAGE_REL_ARM_BLX23T: u16 = 0x0015;
pub const IMAGE_REL_ARM_PAIR: u16 = 0x0016;
#[must_use]
pub fn name(r_type: u16) -> Option<&'static str> {
Some(match r_type {
IMAGE_REL_ARM_ABSOLUTE => "IMAGE_REL_ARM_ABSOLUTE",
IMAGE_REL_ARM_ADDR32 => "IMAGE_REL_ARM_ADDR32",
IMAGE_REL_ARM_ADDR32NB => "IMAGE_REL_ARM_ADDR32NB",
IMAGE_REL_ARM_BRANCH24 => "IMAGE_REL_ARM_BRANCH24",
IMAGE_REL_ARM_BRANCH11 => "IMAGE_REL_ARM_BRANCH11",
IMAGE_REL_ARM_TOKEN => "IMAGE_REL_ARM_TOKEN",
IMAGE_REL_ARM_BLX24 => "IMAGE_REL_ARM_BLX24",
IMAGE_REL_ARM_BLX11 => "IMAGE_REL_ARM_BLX11",
IMAGE_REL_ARM_REL32 => "IMAGE_REL_ARM_REL32",
IMAGE_REL_ARM_SECTION => "IMAGE_REL_ARM_SECTION",
IMAGE_REL_ARM_SECREL => "IMAGE_REL_ARM_SECREL",
IMAGE_REL_ARM_MOV32A => "IMAGE_REL_ARM_MOV32A",
IMAGE_REL_ARM_MOV32T => "IMAGE_REL_ARM_MOV32T",
IMAGE_REL_ARM_BRANCH20T => "IMAGE_REL_ARM_BRANCH20T",
IMAGE_REL_ARM_BRANCH24T => "IMAGE_REL_ARM_BRANCH24T",
IMAGE_REL_ARM_BLX23T => "IMAGE_REL_ARM_BLX23T",
IMAGE_REL_ARM_PAIR => "IMAGE_REL_ARM_PAIR",
_ => return None,
})
}
}
#[must_use]
pub fn relocation_name(machine: u16, r_type: u16) -> Option<&'static str> {
match machine {
IMAGE_FILE_MACHINE_AMD64 => amd64::name(r_type),
IMAGE_FILE_MACHINE_I386 => i386::name(r_type),
IMAGE_FILE_MACHINE_ARMNT | IMAGE_FILE_MACHINE_ARM | IMAGE_FILE_MACHINE_THUMB => {
arm::name(r_type)
}
m if is_arm64(m) => arm64::name(r_type),
_ => None,
}
}
pub const IMPORT_CODE: u8 = 0;
pub const IMPORT_DATA: u8 = 1;
pub const IMPORT_CONST: u8 = 2;
pub const IMPORT_ORDINAL: u8 = 0;
pub const IMPORT_NAME: u8 = 1;
pub const IMPORT_NAME_NOPREFIX: u8 = 2;
pub const IMPORT_NAME_UNDECORATE: u8 = 3;
pub const IMPORT_NAME_EXPORTAS: u8 = 4;
pub const IMAGE_DOS_SIGNATURE: u16 = 0x5a4d;
pub const IMAGE_NT_SIGNATURE: [u8; 4] = *b"PE\0\0";
pub const IMAGE_NT_OPTIONAL_HDR32_MAGIC: u16 = 0x10b;
pub const IMAGE_NT_OPTIONAL_HDR64_MAGIC: u16 = 0x20b;
pub const IMAGE_DIRECTORY_ENTRY_EXPORT: usize = 0;
pub const IMAGE_DIRECTORY_ENTRY_IMPORT: usize = 1;
pub const IMAGE_DIRECTORY_ENTRY_RESOURCE: usize = 2;
pub const IMAGE_DIRECTORY_ENTRY_EXCEPTION: usize = 3;
pub const IMAGE_DIRECTORY_ENTRY_SECURITY: usize = 4;
pub const IMAGE_DIRECTORY_ENTRY_BASERELOC: usize = 5;
pub const IMAGE_DIRECTORY_ENTRY_DEBUG: usize = 6;
pub const IMAGE_DIRECTORY_ENTRY_ARCHITECTURE: usize = 7;
pub const IMAGE_DIRECTORY_ENTRY_GLOBALPTR: usize = 8;
pub const IMAGE_DIRECTORY_ENTRY_TLS: usize = 9;
pub const IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG: usize = 10;
pub const IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT: usize = 11;
pub const IMAGE_DIRECTORY_ENTRY_IAT: usize = 12;
pub const IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT: usize = 13;
pub const IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR: usize = 14;
pub const IMAGE_SUBSYSTEM_UNKNOWN: u16 = 0;
pub const IMAGE_SUBSYSTEM_NATIVE: u16 = 1;
pub const IMAGE_SUBSYSTEM_WINDOWS_GUI: u16 = 2;
pub const IMAGE_SUBSYSTEM_WINDOWS_CUI: u16 = 3;
pub const IMAGE_SUBSYSTEM_OS2_CUI: u16 = 5;
pub const IMAGE_SUBSYSTEM_POSIX_CUI: u16 = 7;
pub const IMAGE_SUBSYSTEM_NATIVE_WINDOWS: u16 = 8;
pub const IMAGE_SUBSYSTEM_WINDOWS_CE_GUI: u16 = 9;
pub const IMAGE_SUBSYSTEM_EFI_APPLICATION: u16 = 10;
pub const IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER: u16 = 11;
pub const IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER: u16 = 12;
pub const IMAGE_SUBSYSTEM_EFI_ROM: u16 = 13;
pub const IMAGE_SUBSYSTEM_XBOX: u16 = 14;
pub const IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION: u16 = 16;
pub const IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA: u16 = 0x0020;
pub const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE: u16 = 0x0040;
pub const IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY: u16 = 0x0080;
pub const IMAGE_DLLCHARACTERISTICS_NX_COMPAT: u16 = 0x0100;
pub const IMAGE_DLLCHARACTERISTICS_NO_ISOLATION: u16 = 0x0200;
pub const IMAGE_DLLCHARACTERISTICS_NO_SEH: u16 = 0x0400;
pub const IMAGE_DLLCHARACTERISTICS_NO_BIND: u16 = 0x0800;
pub const IMAGE_DLLCHARACTERISTICS_APPCONTAINER: u16 = 0x1000;
pub const IMAGE_DLLCHARACTERISTICS_WDM_DRIVER: u16 = 0x2000;
pub const IMAGE_DLLCHARACTERISTICS_GUARD_CF: u16 = 0x4000;
pub const IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE: u16 = 0x8000;