// dnlib: See LICENSE.txt for more info
namespace dnlib.PE {
///
/// IMAGE_FILE_HEADER.Machine enum
///
public enum Machine : ushort {
/// Unknown machine
Unknown = 0,
/// x86
I386 = 0x014C,
/// MIPS little-endian, 0x160 big-endian
R3000 = 0x0162,
/// MIPS little-endian
R4000 = 0x0166,
/// MIPS little-endian
R10000 = 0x0168,
/// MIPS little-endian WCE v2
WCEMIPSV2 = 0x0169,
/// Alpha_AXP
ALPHA = 0x0184,
/// SH3 little-endian
SH3 = 0x01A2,
///
SH3DSP = 0x01A3,
/// SH3E little-endian
SH3E = 0x01A4,
/// SH4 little-endian
SH4 = 0x01A6,
/// SH5
SH5 = 0x01A8,
/// ARM Little-Endian
ARM = 0x01C0,
/// ARM Thumb/Thumb-2 Little-Endian
THUMB = 0x01C2,
/// ARM Thumb-2 Little-Endian
ARMNT = 0x01C4,
///
AM33 = 0x01D3,
/// IBM PowerPC Little-Endian
POWERPC = 0x01F0,
///
POWERPCFP = 0x01F1,
/// IA-64
IA64 = 0x0200,
///
MIPS16 = 0x0266,
///
ALPHA64 = 0x0284,
///
MIPSFPU = 0x0366,
///
MIPSFPU16 = 0x0466,
/// Infineon
TRICORE = 0x0520,
///
CEF = 0x0CEF,
/// EFI Byte Code
EBC = 0x0EBC,
/// x64
AMD64 = 0x8664,
/// M32R little-endian
M32R = 0x9041,
///
ARM64 = 0xAA64,
///
CEE = 0xC0EE,
// Search for IMAGE_FILE_MACHINE_NATIVE and IMAGE_FILE_MACHINE_NATIVE_OS_OVERRIDE here:
// https://github.com/dotnet/coreclr/blob/master/src/inc/pedecoder.h
// Note that IMAGE_FILE_MACHINE_NATIVE_OS_OVERRIDE == 0 if it's Windows
#pragma warning disable 1591 // Missing XML comment for publicly visible type or member
I386_Native_Apple = I386 ^ 0x4644,
AMD64_Native_Apple = AMD64 ^ 0x4644,
ARMNT_Native_Apple = ARMNT ^ 0x4644,
ARM64_Native_Apple = ARM64 ^ 0x4644,
S390X_Native_Apple = Unknown ^ 0x4644,
I386_Native_FreeBSD = I386 ^ 0xADC4,
AMD64_Native_FreeBSD = AMD64 ^ 0xADC4,
ARMNT_Native_FreeBSD = ARMNT ^ 0xADC4,
ARM64_Native_FreeBSD = ARM64 ^ 0xADC4,
S390X_Native_FreeBSD = Unknown ^ 0xADC4,
I386_Native_Linux = I386 ^ 0x7B79,
AMD64_Native_Linux = AMD64 ^ 0x7B79,
ARMNT_Native_Linux = ARMNT ^ 0x7B79,
ARM64_Native_Linux = ARM64 ^ 0x7B79,
S390X_Native_Linux = Unknown ^ 0x7B79,
I386_Native_NetBSD = I386 ^ 0x1993,
AMD64_Native_NetBSD = AMD64 ^ 0x1993,
ARMNT_Native_NetBSD = ARMNT ^ 0x1993,
ARM64_Native_NetBSD = ARM64 ^ 0x1993,
S390X_Native_NetBSD = Unknown ^ 0x1993,
I386_Native_Sun = I386 ^ 0x1992,
AMD64_Native_Sun = AMD64 ^ 0x1992,
ARMNT_Native_Sun = ARMNT ^ 0x1992,
ARM64_Native_Sun = ARM64 ^ 0x1992,
S390X_Native_Sun = Unknown ^ 0x1992,
#pragma warning restore 1591 // Missing XML comment for publicly visible type or member
}
///
/// Extensions
///
public static class MachineExtensions {
///
/// Checks if is a 64-bit machine
///
/// Machine
///
public static bool Is64Bit(this Machine machine) {
switch (machine) {
case Machine.IA64:
case Machine.AMD64:
case Machine.AMD64_Native_Apple:
case Machine.AMD64_Native_FreeBSD:
case Machine.AMD64_Native_Linux:
case Machine.AMD64_Native_NetBSD:
case Machine.AMD64_Native_Sun:
case Machine.ARM64:
case Machine.ARM64_Native_Apple:
case Machine.ARM64_Native_FreeBSD:
case Machine.ARM64_Native_Linux:
case Machine.ARM64_Native_NetBSD:
case Machine.ARM64_Native_Sun:
return true;
// It uses value 0==Unknown but we can't assume it's always s390x
//case Machine.Unknown:
case Machine.S390X_Native_Apple:
case Machine.S390X_Native_FreeBSD:
case Machine.S390X_Native_Linux:
case Machine.S390X_Native_NetBSD:
case Machine.S390X_Native_Sun:
return true;
default:
return false;
}
}
///
/// Checks if is , , etc...
///
/// Machine
///
public static bool IsI386(this Machine machine) {
switch (machine) {
case Machine.I386:
case Machine.I386_Native_Apple:
case Machine.I386_Native_FreeBSD:
case Machine.I386_Native_Linux:
case Machine.I386_Native_NetBSD:
case Machine.I386_Native_Sun:
return true;
default:
return false;
}
}
///
/// Checks if is , , etc...
///
/// Machine
///
public static bool IsAMD64(this Machine machine) {
switch (machine) {
case Machine.AMD64:
case Machine.AMD64_Native_Apple:
case Machine.AMD64_Native_FreeBSD:
case Machine.AMD64_Native_Linux:
case Machine.AMD64_Native_NetBSD:
case Machine.AMD64_Native_Sun:
return true;
default:
return false;
}
}
///
/// Checks if is , , etc...
///
/// Machine
///
public static bool IsARMNT(this Machine machine) {
switch (machine) {
case Machine.ARMNT:
case Machine.ARMNT_Native_Apple:
case Machine.ARMNT_Native_FreeBSD:
case Machine.ARMNT_Native_Linux:
case Machine.ARMNT_Native_NetBSD:
case Machine.ARMNT_Native_Sun:
return true;
default:
return false;
}
}
///
/// Checks if is , , etc...
///
/// Machine
///
public static bool IsARM64(this Machine machine) {
switch (machine) {
case Machine.ARM64:
case Machine.ARM64_Native_Apple:
case Machine.ARM64_Native_FreeBSD:
case Machine.ARM64_Native_Linux:
case Machine.ARM64_Native_NetBSD:
case Machine.ARM64_Native_Sun:
return true;
default:
return false;
}
}
///
/// Checks if is s390x, , etc...
///
/// Machine
///
public static bool IsS390x(this Machine machine) {
switch (machine) {
// It uses value 0==Unknown but we can't assume it's always s390x
//case Machine.Unknown:
case Machine.S390X_Native_Apple:
case Machine.S390X_Native_FreeBSD:
case Machine.S390X_Native_Linux:
case Machine.S390X_Native_NetBSD:
case Machine.S390X_Native_Sun:
return true;
default:
return false;
}
}
}
}