Пример #1
0
        public NameTableReader(SpanStream r)
        {
            UInt32 magic = r.ReadUInt32();

            if (magic != MAGIC)
            {
                throw new InvalidDataException($"Invalid verHdr magic 0x{magic:X}");
            }

            Version = r.ReadEnum <NameTableVersion>();
            switch (Version)
            {
            case NameTableVersion.Hash:
                hasher = HasherV1.HashData;
                break;

            case NameTableVersion.HashV2:
                hasher = HasherV2.HashData;
                break;
            }

            byte[] buf = Deserializers.ReadBuffer(r);
            rdr = new SpanStream(buf);

            Indices          = Deserializers.ReadArray <UInt32>(r);
            NumberOfElements = r.ReadUInt32();
        }
Пример #2
0
        private IModule ReadModule()
        {
            if (Info.StreamNumber < 0)
            {
                return(null);
            }
            byte[] modData = StreamTable.GetStream(Info.StreamNumber);
            OnModuleData?.Invoke(Info, modData);

            SpanStream modStream = new SpanStream(modData);
            UInt32     signature = modStream.ReadUInt32();

            modStream.Position = 0;

            IModule modReader;

            if (Enum.IsDefined(typeof(CodeViewSignature), signature))
            {
                modReader = new CodeViewModuleReader(ctx, Info, modStream);
            }
            else
            {
                modReader = new SourceFileModuleReader(ctx, modStream);
            }

            OnModuleReaderInit?.Invoke(modReader);
            return(modReader);
        }
Пример #3
0
        public NameIndexTableReader(SpanStream r)
        {
            byte[] stringTableData = Deserializers.ReadBuffer(r);
            rdr = new SpanStream(stringTableData);

            Offset_Index = Deserializers.ReadMap <uint, uint>(r);

            MaxIndices = r.ReadUInt32();

            // reverse of Offset_Index
            Index_Offset = Offset_Index.ToDictionary(x => x.Value, x => x.Key);
        }
Пример #4
0
        /// <summary>
        /// Reads the pages that make up the Stream Table
        /// </summary>
        /// <returns></returns>
        public override IEnumerable <byte[]> GetPages_StreamTable()
        {
            Memory <byte> streamTableList = GetPages_StreamTableList()
                                            .SelectMany(x => x)
                                            .ToArray();

            SpanStream stream = new SpanStream(streamTableList);

            var numStreamTablePages = GetNumPages(Header.DirectorySize);

            for (int i = 0; i < numStreamTablePages; i++)
            {
                uint pageNum = stream.ReadUInt32();
                yield return(ReadPage(pageNum));
            }
        }
Пример #5
0
        public static T[] ReadArray <T>(SpanStream r) where T : unmanaged
        {
            uint numElements = r.ReadUInt32();

            T[] arr = new T[numElements];

            int tSize = Marshal.SizeOf <T>();

            for (int i = 0; i < numElements; i++)
            {
                unsafe
                {
                    fixed(byte *data = r.ReadBytes(tSize))
                    {
                        T element = *(T *)data;

                        arr.SetValue(element, i);
                    }
                }
            }

            return(arr);
        }
Пример #6
0
        public static Dictionary <Tkey, Tval> ReadMap <Tkey, Tval>(SpanStream r)
            where Tkey : unmanaged
            where Tval : unmanaged
        {
            // sum of bitsizes of each member
            uint cardinality = r.ReadUInt32();
            int  numElements = r.ReadInt32();

            BitSet available = new BitSet(ReadArray <UInt32>(r));
            BitSet deleted   = new BitSet(ReadArray <UInt32>(r));

            int keySize   = Marshal.SizeOf <Tkey>();
            int valueSize = Marshal.SizeOf <Tval>();

            Dictionary <Tkey, Tval> map = new Dictionary <Tkey, Tval>(numElements);

            for (int i = 0; i < numElements; i++)
            {
                if (!available.Contains(i))
                {
                    continue;
                }
                unsafe
                {
                    fixed(byte *pKey = r.ReadBytes(keySize))
                    fixed(byte *pVal = r.ReadBytes(valueSize))
                    {
                        Tkey key = *(Tkey *)pKey;
                        Tval val = *(Tval *)pVal;

                        map.Add(key, val);
                    }
                }
            }

            return(map);
        }