Exemple #1
0
 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;
 }
Exemple #2
0
        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,
            };
        }
Exemple #3
0
        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,
            };
        }
Exemple #4
0
        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();
        }