Example #1
0
            public FileSegment GetLookupSegment(ImageSymbolImport symbolImport)
            {
                FileSegment segment;

                if (!_lookupSegments.TryGetValue(symbolImport, out segment))
                {
                    if (symbolImport.IsImportByOrdinal)
                    {
                        segment = DataSegment.CreateNativeInteger(symbolImport.Lookup, Is32Bit);
                    }
                    else if (symbolImport.HintName != null)
                    {
                        _nameTableBuffer.AddHintNameSegment(symbolImport.HintName);
                        segment = new PointerSegment(symbolImport.HintName, _offsetConverter, Is32Bit);
                    }
                    else
                    {
                        segment = DataSegment.CreateNativeInteger(0, Is32Bit);
                    }

                    _lookupSegments.Add(symbolImport, segment);
                    Segments.Add(segment);
                }
                return(segment);
            }
Example #2
0
        internal static ImageSymbolImport FromReadingContext(ReadingContext context)
        {
            var reader      = context.Reader;
            var application = context.Assembly;

            var optionalHeader = application.NtHeaders.OptionalHeader;

            var import = new ImageSymbolImport(optionalHeader.Magic == OptionalHeaderMagic.Pe32Plus
                ? reader.ReadUInt64()
                : reader.ReadUInt32());

            if (import.Lookup == 0)
            {
                return(import);
            }

            import.IsImportByOrdinal = import.Lookup >> (optionalHeader.Magic == OptionalHeaderMagic.Pe32Plus ? 63 : 31) == 1;

            if (!import.IsImportByOrdinal)
            {
                import.HintName =
                    HintName.FromReadingContext(context.CreateSubContext(application.RvaToFileOffset(import.HintNameRva)));
            }

            return(import);
        }
Example #3
0
 public static void ValidateSymbolImport(ImageSymbolImport originalSymbol, ImageSymbolImport newSymbol)
 {
     Assert.Equal(originalSymbol.IsImportByOrdinal, newSymbol.IsImportByOrdinal);
     if (originalSymbol.IsImportByOrdinal)
     {
         Assert.Null(newSymbol.HintName);
         Assert.Equal(originalSymbol.Ordinal, newSymbol.Ordinal);
     }
     else
     {
         Assert.NotNull(newSymbol.HintName);
         Assert.Equal(originalSymbol.HintName.Hint, newSymbol.HintName.Hint);
         Assert.Equal(originalSymbol.HintName.Name, newSymbol.HintName.Name);
     }
 }
            public FileSegment GetLookupSegment(ImageSymbolImport symbolImport)
            {
                FileSegment segment;
                if (!_lookupSegments.TryGetValue(symbolImport, out segment))
                {
                    if (symbolImport.IsImportByOrdinal)
                        segment = DataSegment.CreateNativeInteger(symbolImport.Lookup, Is32Bit);
                    else if (symbolImport.HintName != null)
                    {
                        _nameTableBuilder.AddHintNameSegment(symbolImport.HintName);
                        segment = new PointerSegment(symbolImport.HintName, _offsetConverter, Is32Bit);
                    }
                    else
                        segment = DataSegment.CreateNativeInteger(0, Is32Bit);

                    _lookupSegments.Add(symbolImport, segment);
                    Segments.Add(segment);
                }
                return segment;
            }
Example #5
0
 public static void ValidateSymbolImport(ImageSymbolImport originalSymbol, ImageSymbolImport newSymbol)
 {
     Assert.AreEqual(originalSymbol.IsImportByOrdinal, newSymbol.IsImportByOrdinal);
     if (originalSymbol.IsImportByOrdinal)
     {
         Assert.IsNull(newSymbol.HintName);
         Assert.AreEqual(originalSymbol.Ordinal, newSymbol.Ordinal);
     }
     else
     {
         Assert.IsNotNull(newSymbol.HintName);
         Assert.AreEqual(originalSymbol.HintName.Hint, newSymbol.HintName.Hint);
         Assert.AreEqual(originalSymbol.HintName.Name, newSymbol.HintName.Name);
     }
 }