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); }
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); }
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; }
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); } }