namespace R2RDump
{
- public enum UnwindOpCodes
+ public enum Amd64UnwindOpCodes
{
UWOP_PUSH_NONVOL = 0,
UWOP_ALLOC_LARGE,
UWOP_SET_FPREG_LARGE,
}
- struct UnwindCode
+ struct Amd64UnwindCode
{
public byte CodeOffset { get; }
- public UnwindOpCodes UnwindOp { get; } //4 bits
+ public Amd64UnwindOpCodes UnwindOp { get; } //4 bits
public byte OpInfo { get; } //4 bits
public byte OffsetLow { get; }
public uint FrameOffset { get; }
- public UnwindCode(byte[] image, ref int offset)
+ public Amd64UnwindCode(byte[] image, ref int offset)
{
int off = offset;
CodeOffset = NativeReader.ReadByte(image, ref off);
byte op = NativeReader.ReadByte(image, ref off);
- UnwindOp = (UnwindOpCodes)(op & 15);
+ UnwindOp = (Amd64UnwindOpCodes)(op & 15);
OpInfo = (byte)(op >> 4);
OffsetLow = CodeOffset;
}
}
- struct UnwindInfo
+ struct Amd64UnwindInfo : UnwindInfo
{
private const int _sizeofUnwindCode = 2;
private const int _offsetofUnwindCode = 4;
public byte Flags { get; } //5 bits
public byte SizeOfProlog { get; }
public byte CountOfUnwindCodes { get; }
- public Registers FrameRegister { get; } //4 bits
+ public Amd64Registers FrameRegister { get; } //4 bits
public byte FrameOffset { get; } //4 bits
- public UnwindCode[] UnwindCode { get; }
+ public Amd64UnwindCode[] UnwindCode { get; }
public uint PersonalityRoutineRVA { get; }
public int Size { get; }
- public UnwindInfo(byte[] image, int offset)
+ public Amd64UnwindInfo(byte[] image, int offset)
{
byte versionAndFlags = NativeReader.ReadByte(image, ref offset);
Version = (byte)(versionAndFlags & 7);
SizeOfProlog = NativeReader.ReadByte(image, ref offset);
CountOfUnwindCodes = NativeReader.ReadByte(image, ref offset);
byte frameRegisterAndOffset = NativeReader.ReadByte(image, ref offset);
- FrameRegister = (Registers)(frameRegisterAndOffset & 15);
+ FrameRegister = (Amd64Registers)(frameRegisterAndOffset & 15);
FrameOffset = (byte)(frameRegisterAndOffset >> 4);
- UnwindCode = new UnwindCode[CountOfUnwindCodes];
+ UnwindCode = new Amd64UnwindCode[CountOfUnwindCodes];
for (int i = 0; i < CountOfUnwindCodes; i++)
{
- UnwindCode[i] = new UnwindCode(image, ref offset);
+ UnwindCode[i] = new Amd64UnwindCode(image, ref offset);
}
PersonalityRoutineRVA = NativeReader.ReadUInt32(image, ref offset);
switch (UnwindCode[i].UnwindOp)
{
- case UnwindOpCodes.UWOP_PUSH_NONVOL:
- sb.AppendLine($"{tab2}OpInfo: {(Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
+ case Amd64UnwindOpCodes.UWOP_PUSH_NONVOL:
+ sb.AppendLine($"{tab2}OpInfo: {(Amd64Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
break;
- case UnwindOpCodes.UWOP_ALLOC_LARGE:
+ case Amd64UnwindOpCodes.UWOP_ALLOC_LARGE:
sb.Append($"{tab2}OpInfo: {UnwindCode[i].OpInfo} - ");
if (UnwindCode[i].OpInfo == 0)
{
sb.AppendLine("Unknown");
}
break;
- case UnwindOpCodes.UWOP_ALLOC_SMALL:
+ case Amd64UnwindOpCodes.UWOP_ALLOC_SMALL:
int opInfo = UnwindCode[i].OpInfo * 8 + 8;
sb.AppendLine($"{tab2}OpInfo: {UnwindCode[i].OpInfo} * 8 + 8 = {opInfo} = 0x{opInfo:X2}");
break;
- case UnwindOpCodes.UWOP_SET_FPREG:
+ case Amd64UnwindOpCodes.UWOP_SET_FPREG:
sb.AppendLine($"{tab2}OpInfo: Unused({UnwindCode[i].OpInfo})");
break;
- case UnwindOpCodes.UWOP_SET_FPREG_LARGE:
+ case Amd64UnwindOpCodes.UWOP_SET_FPREG_LARGE:
{
sb.AppendLine($"{tab2}OpInfo: Unused({UnwindCode[i].OpInfo})");
i++;
}
}
break;
- case UnwindOpCodes.UWOP_SAVE_NONVOL:
+ case Amd64UnwindOpCodes.UWOP_SAVE_NONVOL:
{
- sb.AppendLine($"{tab2}OpInfo: {(Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
+ sb.AppendLine($"{tab2}OpInfo: {(Amd64Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
i++;
uint offset = UnwindCode[i].FrameOffset * 8;
sb.AppendLine($"{tab2}Scaled Offset: {UnwindCode[i].FrameOffset} * 8 = {offset} = 0x{offset:X5}");
}
break;
- case UnwindOpCodes.UWOP_SAVE_NONVOL_FAR:
+ case Amd64UnwindOpCodes.UWOP_SAVE_NONVOL_FAR:
{
- sb.AppendLine($"{tab2}OpInfo: {(Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
+ sb.AppendLine($"{tab2}OpInfo: {(Amd64Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
i++;
uint offset = UnwindCode[i].FrameOffset;
i++;
sb.AppendLine($"{tab2}Unscaled Large Offset: 0x{offset:X8}");
}
break;
- case UnwindOpCodes.UWOP_SAVE_XMM128:
+ case Amd64UnwindOpCodes.UWOP_SAVE_XMM128:
{
sb.AppendLine($"{tab2}OpInfo: XMM{UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
i++;
}
break;
- case UnwindOpCodes.UWOP_SAVE_XMM128_FAR:
+ case Amd64UnwindOpCodes.UWOP_SAVE_XMM128_FAR:
{
sb.AppendLine($"{tab2}OpInfo: XMM{UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
i++;
sb.AppendLine($"{tab2}Unscaled Large Offset: 0x{offset:X8}");
}
break;
- case UnwindOpCodes.UWOP_EPILOG:
- case UnwindOpCodes.UWOP_SPARE_CODE:
- case UnwindOpCodes.UWOP_PUSH_MACHFRAME:
+ case Amd64UnwindOpCodes.UWOP_EPILOG:
+ case Amd64UnwindOpCodes.UWOP_SPARE_CODE:
+ case Amd64UnwindOpCodes.UWOP_PUSH_MACHFRAME:
default:
sb.AppendLine($"{tab2}OpInfo: {UnwindCode[i].OpInfo}");
sb.AppendLine();