Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
            });
        }
Ejemplo n.º 3
0
 /// <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(),
     });
 }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
 /// <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(),
     });
 }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
 /// <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(),
     });
 }
Ejemplo n.º 8
0
 /// <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(),
     });
 }
Ejemplo n.º 9
0
 /// <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(),
     });
 }
Ejemplo n.º 10
0
 /// <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(),
     });
 }
Ejemplo n.º 11
0
 /// <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(),
     });
 }
Ejemplo n.º 12
0
 /// <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(),
     });
 }
Ejemplo n.º 13
0
        /// <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);
        }
Ejemplo n.º 14
0
 /// <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(),
     });
 }
Ejemplo n.º 15
0
 /// <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(),
     });
 }
Ejemplo n.º 16
0
        /// <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);
        }
Ejemplo n.º 17
0
 /// <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(),
     });
 }
Ejemplo n.º 19
0
 /// <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(),
     });
 }
Ejemplo n.º 20
0
 /// <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(),
     });
 }
Ejemplo n.º 21
0
 /// <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(),
     });
 }
Ejemplo n.º 22
0
 /// <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(),
     });
 }
Ejemplo n.º 23
0
 /// <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(),
     });
 }
Ejemplo n.º 24
0
 /// <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(),
     });
 }
Ejemplo n.º 25
0
 /// <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(),
     });
 }
Ejemplo n.º 26
0
 /// <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(),
     });
 }
Ejemplo n.º 27
0
 /// <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(),
     });
 }
Ejemplo n.º 28
0
 /// <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(),
     });
 }
Ejemplo n.º 30
0
 /// <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(),
     });
 }