public DotNetHeadersImpl(PeHeaders peHeaders, DotNetCor20Data cor20, DotNetMetadataHeaders metadataHeaders, VirtualArrayData <ByteData> strongNameSignature, DotNetMethodProvider methodProvider, DotNetResourceProvider resourceProvider) { if (peHeaders == null) { throw new ArgumentNullException(nameof(peHeaders)); } if (cor20 == null) { throw new ArgumentNullException(nameof(cor20)); } if (methodProvider == null) { throw new ArgumentNullException(nameof(methodProvider)); } if (resourceProvider == null) { throw new ArgumentNullException(nameof(resourceProvider)); } PeHeaders = peHeaders; Cor20 = cor20; MetadataHeaders = metadataHeaders; StrongNameSignature = strongNameSignature; MethodProvider = methodProvider; ResourceProvider = resourceProvider; }
public InvalidMethodBodyImpl(DotNetMethodProvider methodProvider, HexBufferSpan span, ReadOnlyCollection <uint> tokens) : base(methodProvider, span, tokens) { var buffer = span.Buffer; var pos = span.Start.Position; Instructions = new StructField <VirtualArrayData <ByteData> >(TinyMethodBodyImpl.InstructionsFieldName, ArrayData.CreateVirtualByteArray(HexBufferSpan.FromBounds(span.Start, span.End), TinyMethodBodyImpl.InstructionsFieldName)); Fields = new BufferField[] { Instructions, }; }
public TinyMethodBodyImpl(DotNetMethodProvider methodProvider, HexBufferSpan span, ReadOnlyCollection <uint> tokens) : base(methodProvider, span, tokens) { var buffer = span.Buffer; var pos = span.Start.Position; Flags_CodeSize = new StructField <ByteFlagsData>("Flags_CodeSize", new ByteFlagsData(buffer, pos, flagsCodeSizeFlagInfos)); Instructions = new StructField <VirtualArrayData <ByteData> >(InstructionsFieldName, ArrayData.CreateVirtualByteArray(HexBufferSpan.FromBounds(span.Start + 1, span.End), InstructionsFieldName)); Fields = new BufferField[] { Flags_CodeSize, Instructions, }; }
public override bool Initialize() { HexSpan?resourcesSpan = null; var peHeaders = file.GetHeaders <PeHeaders>(); if (peHeaders != null) { if (peHeaders.OptionalHeader.DataDirectory.Data.FieldCount < 15) { return(false); } var cor20Span = Read(peHeaders, peHeaders.OptionalHeader.DataDirectory.Data[14].Data); if (cor20Span == null) { return(false); } cor20 = DotNetCor20DataImpl.TryCreate(file, cor20Span.Value.Start); if (cor20 == null) { return(false); } var mdSpan = Read(peHeaders, cor20.MetaData.Data); resourcesSpan = Read(peHeaders, cor20.Resources.Data); var snSpan = Read(peHeaders, cor20.StrongNameSignature.Data); ReadDotNetMetadataHeader(peHeaders, mdSpan); ReadStrongNameSignature(peHeaders, snSpan); } else { // Could be a portable PDB file (or a metadata only file) ReadDotNetMetadataHeader(file.Span); } if (mdHeader != null && dotNetHeaps != null) { dotNetMetadataHeaders = new DotNetMetadataHeadersImpl(metadataSpan, mdHeader, dotNetHeaps); } if (peHeaders != null && cor20 != null) { dotNetMethodProvider = new DotNetMethodProviderImpl(file, peHeaders, dotNetMetadataHeaders?.TablesStream); dotNetResourceProvider = new DotNetResourceProviderImpl(file, peHeaders, dotNetMetadataHeaders, resourcesSpan); dotNetHeaders = new DotNetHeadersImpl(peHeaders, cor20, dotNetMetadataHeaders, strongNameSignature, dotNetMethodProvider, dotNetResourceProvider); } return(cor20 != null || !metadataSpan.IsEmpty); }
public FatMethodBodyImpl(DotNetMethodProvider methodProvider, HexBufferSpan span, ReadOnlyCollection <uint> tokens, HexSpan instructionsSpan, HexSpan ehSpan, bool fatEH) : base(methodProvider, span, tokens) { var buffer = span.Buffer; var pos = span.Start.Position; Flags_Size = new StructField <UInt16FlagsData>("Flags", new UInt16FlagsData(buffer, pos, fatHeaderFlagsFlagInfos)); MaxStack = new StructField <UInt16Data>("MaxStack", new UInt16Data(buffer, pos + 2)); CodeSize = new StructField <UInt32Data>("CodeSize", new UInt32Data(buffer, pos + 4)); LocalVarSigTok = new StructField <TokenData>("LocalVarSigTok", new TokenData(buffer, pos + 8)); Instructions = new StructField <VirtualArrayData <ByteData> >(TinyMethodBodyImpl.InstructionsFieldName, ArrayData.CreateVirtualByteArray(new HexBufferSpan(span.Buffer, instructionsSpan), TinyMethodBodyImpl.InstructionsFieldName)); if (!ehSpan.IsEmpty) { ExceptionHandlerTable ehTable; if (fatEH) { ehTable = new FatExceptionHandlerTableImpl(new HexBufferSpan(buffer, ehSpan)); } else { ehTable = new SmallExceptionHandlerTableImpl(new HexBufferSpan(buffer, ehSpan)); } EHTable = new StructField <ExceptionHandlerTable>("EHTable", ehTable); var paddingSpan = HexBufferSpan.FromBounds(Instructions.Data.Span.End, EHTable.Data.Span.Start); Padding = new StructField <VirtualArrayData <ByteData> >("Padding", ArrayData.CreateVirtualByteArray(paddingSpan)); } var fields = new List <BufferField>(7) { Flags_Size, MaxStack, CodeSize, LocalVarSigTok, Instructions, }; if (Padding is not null) { fields.Add(Padding); } if (EHTable is not null) { fields.Add(EHTable); } Fields = fields.ToArray(); }