/// <summary> /// Reads <see cref="Compile2Symbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static Compile2Symbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { var result = new Compile2Symbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Flags = (CompileSymbolFlags)reader.ReadUint(), Machine = (CpuType)reader.ReadUshort(), VersionFrontendMajor = reader.ReadUshort(), VersionFrontendMinor = reader.ReadUshort(), VersionFrontendBuild = reader.ReadUshort(), VersionBackendMajor = reader.ReadUshort(), VersionBackendMinor = reader.ReadUshort(), VersionBackendBuild = reader.ReadUshort(), Version = reader.ReadCString(), }; List <string> strings = new List <string>(); for (string s = reader.ReadCString().String; !string.IsNullOrEmpty(s); s = reader.ReadCString().String) { strings.Add(s); } result.ExtraStrings = strings; return(result); }
/// <summary> /// Initializes a new instance of the <see cref="NamedStreamMap"/> class. /// </summary> /// <param name="reader">Stream binary reader.</param> public NamedStreamMap(IBinaryReader reader) { uint stringsSizeInBytes = reader.ReadUint(); StringsStream = reader.ReadSubstream(stringsSizeInBytes); HashTable = new HashTable(reader); streamsCache = SimpleCache.CreateStruct(() => { Dictionary <string, int> streams = new Dictionary <string, int>(); IBinaryReader stringsReader = StringsStream.Duplicate(); foreach (var kvp in HashTable.Dictionary) { stringsReader.Position = kvp.Key; streams.Add(stringsReader.ReadCString().String, (int)kvp.Value); } return(streams); }); streamsUppercaseCache = SimpleCache.CreateStruct(() => { Dictionary <string, int> streams = new Dictionary <string, int>(); foreach (var kvp in Streams) { streams.Add(kvp.Key.ToUpperInvariant(), kvp.Value); } return(streams); }); }
/// <summary> /// Reads <see cref="StringIdRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static StringIdRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new StringIdRecord { Kind = kind, Id = TypeIndex.Read(reader), String = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="UnionRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static UnionRecord Read(IBinaryReader reader, TypeLeafKind kind) { UnionRecord record = new UnionRecord { Kind = kind, MemberCount = reader.ReadUshort(), Options = (ClassOptions)reader.ReadUshort(), FieldList = TypeIndex.Read(reader), Size = Convert.ToUInt64(reader.ReadEncodedInteger()), Name = reader.ReadCString(), }; if (record.HasUniqueName) { record.UniqueName = reader.ReadCString(); } return(record); }
/// <summary> /// Reads <see cref="UdtSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Symbol record kind.</param> public static UdtSymbol Read(IBinaryReader reader, SymbolRecordKind kind) { return(new UdtSymbol { Kind = kind, Type = TypeIndex.Read(reader), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="EnumRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static EnumRecord Read(IBinaryReader reader, TypeLeafKind kind) { EnumRecord record = new EnumRecord { Kind = kind, MemberCount = reader.ReadUshort(), Options = (ClassOptions)reader.ReadUshort(), UnderlyingType = TypeIndex.Read(reader), FieldList = TypeIndex.Read(reader), Name = reader.ReadCString(), }; if (record.HasUniqueName) { record.UniqueName = reader.ReadCString(); } return(record); }
/// <summary> /// Reads <see cref="OverloadedMethodRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static OverloadedMethodRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new OverloadedMethodRecord { Kind = kind, OverloadsCount = reader.ReadUshort(), MethodList = TypeIndex.Read(reader), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="NamespaceSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static NamespaceSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new NamespaceSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Namespace = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="MemberFunctionIdRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static MemberFunctionIdRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new MemberFunctionIdRecord { Kind = kind, ClassType = TypeIndex.Read(reader), FunctionType = TypeIndex.Read(reader), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="NestedTypeRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static NestedTypeRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new NestedTypeRecord { Kind = kind, Padding = reader.ReadUshort(), Type = TypeIndex.Read(reader), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="EnumeratorRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static EnumeratorRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new EnumeratorRecord { Kind = kind, Attritubes = MemberAttributes.Read(reader), Value = reader.ReadEncodedInteger(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ConstantSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Symbol record kind.</param> public static ConstantSymbol Read(IBinaryReader reader, SymbolRecordKind kind) { return(new ConstantSymbol { Kind = kind, TypeIndex = TypeIndex.Read(reader), Value = reader.ReadEncodedInteger(), Name = reader.ReadCString(), }); }
/// <summary> /// Initializes a new instance of the <see cref="DbiModuleDescriptor"/> class. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="moduleList">Owning module list.</param> public DbiModuleDescriptor(IBinaryReader reader, DbiModuleList moduleList) { ModuleList = moduleList; filesCache = SimpleCache.CreateWithContext(this, CallEnumerateFiles); Header = ModuleInfoHeader.Read(reader); ModuleName = reader.ReadCString(); ObjectFileName = reader.ReadCString(); // Descriptors should be aligned at 4 bytes if (reader.Position % 4 != 0) { reader.Position += 4 - reader.Position % 4; } // Higher level API initialization moduleStreamCache = SimpleCache.CreateWithContext(this, CallEnumerateModuleStream); localSymbolStreamCache = SimpleCache.CreateWithContext(this, CallEnumerateLocalSymbolStream); debugSubsectionStreamCache = SimpleCache.CreateWithContext(this, CallEnumerateDebugSubsectionStream); }
/// <summary> /// Reads <see cref="FunctionIdRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static FunctionIdRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new FunctionIdRecord { Kind = kind, ParentScope = TypeIndex.Read(reader), FunctionType = TypeIndex.Read(reader), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="StaticDataMemberRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static StaticDataMemberRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new StaticDataMemberRecord { Kind = kind, Attributes = MemberAttributes.Read(reader), Type = TypeIndex.Read(reader), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ClassRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static ClassRecord Read(IBinaryReader reader, TypeLeafKind kind) { ClassRecord record = new ClassRecord { Kind = kind, MemberCount = reader.ReadUshort(), Options = (ClassOptions)reader.ReadUshort(), FieldList = TypeIndex.Read(reader), DerivationList = TypeIndex.Read(reader), VirtualTableShape = TypeIndex.Read(reader), Size = Convert.ToUInt64(reader.ReadEncodedConstant()), Name = reader.ReadCString(), }; if (record.HasUniqueName) { record.UniqueName = reader.ReadCString(); } return(record); }
/// <summary> /// Reads <see cref="Public32Symbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Symbol record kind.</param> public static Public32Symbol Read(IBinaryReader reader, SymbolRecordKind kind) { return(new Public32Symbol { Kind = kind, Flags = (PublicSymbolFlags)reader.ReadUint(), Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ProcedureReferenceSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Symbol record kind.</param> public static ProcedureReferenceSymbol Read(IBinaryReader reader, SymbolRecordKind kind) { return(new ProcedureReferenceSymbol { Kind = kind, Checksum = reader.ReadUint(), Offset = reader.ReadUint(), Module = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="UdtSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static UdtSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new UdtSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Type = TypeIndex.Read(reader), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="DataSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Symbol record kind.</param> public static DataSymbol Read(IBinaryReader reader, SymbolRecordKind kind) { return(new DataSymbol { Kind = kind, Type = TypeIndex.Read(reader), Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="DataMemberRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static DataMemberRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new DataMemberRecord { Kind = kind, Attributes = MemberAttributes.Read(reader), Type = TypeIndex.Read(reader), FieldOffset = Convert.ToUInt64(reader.ReadEncodedInteger()), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ObjectNameSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static ObjectNameSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new ObjectNameSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Signature = reader.ReadUint(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ArrayRecord"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Type record kind.</param> public static ArrayRecord Read(IBinaryReader reader, TypeLeafKind kind) { return(new ArrayRecord { Kind = kind, ElementType = TypeIndex.Read(reader), IndexType = TypeIndex.Read(reader), Size = Convert.ToUInt64(reader.ReadEncodedInteger()), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ConstantSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static ConstantSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new ConstantSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, TypeIndex = TypeIndex.Read(reader), Value = reader.ReadEncodedConstant(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ExportSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static ExportSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new ExportSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Ordinal = reader.ReadUshort(), Flags = (ExportFlags)reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="LocalSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static LocalSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new LocalSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Type = TypeIndex.Read(reader), Flags = (LocalVariableFlags)reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="CoffGroupSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="kind">Symbol record kind.</param> public static CoffGroupSymbol Read(IBinaryReader reader, SymbolRecordKind kind) { return(new CoffGroupSymbol { Kind = kind, Size = reader.ReadUint(), Characteristics = (ImageSectionCharacteristics)reader.ReadUint(), Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ThreadLocalDataSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static ThreadLocalDataSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new ThreadLocalDataSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Type = TypeIndex.Read(reader), Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="RegisterRelativeSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static RegisterRelativeSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new RegisterRelativeSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Offset = reader.ReadUint(), Type = TypeIndex.Read(reader), Register = (RegisterId)reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="LabelSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static LabelSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new LabelSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Flags = (ProcedureFlags)reader.ReadByte(), Name = reader.ReadCString(), }); }