obfuz/Plugins/dnlib/PE/Machine.cs

245 lines
7.0 KiB
C#

// dnlib: See LICENSE.txt for more info
namespace dnlib.PE {
/// <summary>
/// IMAGE_FILE_HEADER.Machine enum
/// </summary>
public enum Machine : ushort {
/// <summary>Unknown machine</summary>
Unknown = 0,
/// <summary>x86</summary>
I386 = 0x014C,
/// <summary>MIPS little-endian, 0x160 big-endian</summary>
R3000 = 0x0162,
/// <summary>MIPS little-endian</summary>
R4000 = 0x0166,
/// <summary>MIPS little-endian</summary>
R10000 = 0x0168,
/// <summary>MIPS little-endian WCE v2</summary>
WCEMIPSV2 = 0x0169,
/// <summary>Alpha_AXP</summary>
ALPHA = 0x0184,
/// <summary>SH3 little-endian</summary>
SH3 = 0x01A2,
/// <summary></summary>
SH3DSP = 0x01A3,
/// <summary>SH3E little-endian</summary>
SH3E = 0x01A4,
/// <summary>SH4 little-endian</summary>
SH4 = 0x01A6,
/// <summary>SH5</summary>
SH5 = 0x01A8,
/// <summary>ARM Little-Endian</summary>
ARM = 0x01C0,
/// <summary>ARM Thumb/Thumb-2 Little-Endian</summary>
THUMB = 0x01C2,
/// <summary>ARM Thumb-2 Little-Endian</summary>
ARMNT = 0x01C4,
/// <summary></summary>
AM33 = 0x01D3,
/// <summary>IBM PowerPC Little-Endian</summary>
POWERPC = 0x01F0,
/// <summary></summary>
POWERPCFP = 0x01F1,
/// <summary>IA-64</summary>
IA64 = 0x0200,
/// <summary></summary>
MIPS16 = 0x0266,
/// <summary></summary>
ALPHA64 = 0x0284,
/// <summary></summary>
MIPSFPU = 0x0366,
/// <summary></summary>
MIPSFPU16 = 0x0466,
/// <summary>Infineon</summary>
TRICORE = 0x0520,
/// <summary></summary>
CEF = 0x0CEF,
/// <summary>EFI Byte Code</summary>
EBC = 0x0EBC,
/// <summary>x64</summary>
AMD64 = 0x8664,
/// <summary>M32R little-endian</summary>
M32R = 0x9041,
/// <summary></summary>
ARM64 = 0xAA64,
/// <summary></summary>
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
}
/// <summary>
/// Extensions
/// </summary>
public static class MachineExtensions {
/// <summary>
/// Checks if <paramref name="machine"/> is a 64-bit machine
/// </summary>
/// <param name="machine">Machine</param>
/// <returns></returns>
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;
}
}
/// <summary>
/// Checks if <paramref name="machine"/> is <see cref="Machine.I386"/>, <see cref="Machine.I386_Native_Apple"/>, etc...
/// </summary>
/// <param name="machine">Machine</param>
/// <returns></returns>
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;
}
}
/// <summary>
/// Checks if <paramref name="machine"/> is <see cref="Machine.AMD64"/>, <see cref="Machine.AMD64_Native_Apple"/>, etc...
/// </summary>
/// <param name="machine">Machine</param>
/// <returns></returns>
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;
}
}
/// <summary>
/// Checks if <paramref name="machine"/> is <see cref="Machine.ARMNT"/>, <see cref="Machine.ARMNT_Native_Apple"/>, etc...
/// </summary>
/// <param name="machine">Machine</param>
/// <returns></returns>
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;
}
}
/// <summary>
/// Checks if <paramref name="machine"/> is <see cref="Machine.ARM64"/>, <see cref="Machine.ARM64_Native_Apple"/>, etc...
/// </summary>
/// <param name="machine">Machine</param>
/// <returns></returns>
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;
}
}
/// <summary>
/// Checks if <paramref name="machine"/> is s390x, <see cref="Machine.S390X_Native_Apple"/>, etc...
/// </summary>
/// <param name="machine">Machine</param>
/// <returns></returns>
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;
}
}
}
}