// 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; } } } }