/// <summary> /// Read the EH clause from a given file offset in the PE image. /// </summary> /// <param name="reader">R2R image reader<param> /// <param name="offset">Offset of the EH clause in the image</param> public EHClause(R2RReader reader, int offset) { Flags = (CorExceptionFlag)BitConverter.ToUInt32(reader.Image, offset + 0 * sizeof(uint)); TryOffset = BitConverter.ToUInt32(reader.Image, offset + 1 * sizeof(uint)); TryEnd = BitConverter.ToUInt32(reader.Image, offset + 2 * sizeof(uint)); HandlerOffset = BitConverter.ToUInt32(reader.Image, offset + 3 * sizeof(uint)); HandlerEnd = BitConverter.ToUInt32(reader.Image, offset + 4 * sizeof(uint)); ClassTokenOrFilterOffset = BitConverter.ToUInt32(reader.Image, offset + 5 * sizeof(uint)); if ((Flags & CorExceptionFlag.COR_ILEXCEPTION_CLAUSE_KIND_MASK) == CorExceptionFlag.COR_ILEXCEPTION_CLAUSE_NONE) { ClassName = MetadataNameFormatter.FormatHandle(reader.MetadataReader, MetadataTokens.Handle((int)ClassTokenOrFilterOffset)); } }
public static TransitionBlock FromReader(R2RReader reader) { switch (reader.Architecture) { case Architecture.X86: return(X86TransitionBlock.Instance); case Architecture.X64: return(reader.OS == OperatingSystem.Windows ? X64WindowsTransitionBlock.Instance : X64UnixTransitionBlock.Instance); case Architecture.Arm: return(ArmTransitionBlock.Instance); case Architecture.Arm64: return(Arm64TransitionBlock.Instance); default: throw new NotImplementedException(); } }