Ejemplo n.º 1
0
        internal ClrUserStringPool(Stream peStream, STORAGESTREAM streamInfo, long baseOffset)
        {
            var items = new List <string>();

            long offset = baseOffset + streamInfo.iOffset;
            long end    = offset + streamInfo.iSize;

            // TODO: why the +1 here?
            peStream.Seek(offset + 1, SeekOrigin.Begin);

            while (peStream.Position < end)
            {
                items.Add(ReadUserString(peStream));
            }

            // Stream size includes padding at the end for word-alignment
            // Remove the empty strings that come of this.
            while (items.Count > 1 &&
                   string.IsNullOrEmpty(items.Last()))
            {
                items.RemoveAt(items.Count - 1);
            }

            _strings = items.ToArray();
        }
Ejemplo n.º 2
0
        internal ClrStringPool(Stream peStream, STORAGESTREAM streamInfo, long baseOffset)
        {
            var items = new List <string>();

            _stringsByOffset = new Dictionary <uint, string>();

            long offset = baseOffset + streamInfo.iOffset;
            long end    = offset + streamInfo.iSize;

            peStream.Seek(offset, SeekOrigin.Begin);

            while (peStream.Position < end)
            {
                uint stringOffset = checked ((uint)(peStream.Position - offset));

                string str = peStream.ReadUtf8ZeroTerminated();
                items.Add(str);
                _stringsByOffset[stringOffset] = str;
            }

            // Stream size includes padding at the end for word-alignment
            // Remove the empty strings that come of this.
            while (items.Count > 1 &&
                   string.IsNullOrEmpty(items.Last()))
            {
                items.RemoveAt(items.Count - 1);
            }

            _strings = items.ToArray();
        }
Ejemplo n.º 3
0
        internal ClrMetadataAccessor(PeDotNetInformation mdParent, Stream peStream, STORAGESTREAM streamInfo, long baseOffset)
        {
            _mdParent = mdParent;

            long offset = baseOffset + streamInfo.iOffset;
            long end    = offset + streamInfo.iSize;

            peStream.Seek(offset, SeekOrigin.Begin);

            _md     = new CMiniMdBase(peStream);
            _tables = new MetadataTableBase[_md.TableCount];

            peStream.AlignToBytes(4);

            for (int i = 0; i < _tables.Length; i++)
            {
                ClrTable table = (ClrTable)i;

                Type recordType = _md[table].m_RecordType;
                Type tableType  = typeof(MetadataTable <>).MakeGenericType(recordType);

                long startPosition = peStream.Position;
                long tableSize     = _md[table].m_cbRec * _md.Schema.RowCount[table];
                long expectedEnd   = startPosition + tableSize;

                _tables[i] = (MetadataTableBase)Activator.CreateInstance(tableType, _md, table, peStream);


                Debug.Assert(peStream.Position == expectedEnd);
            }

            long diff = peStream.Position - end;

            Debug.Assert(diff == 0 || diff == -2 || diff == -4);


            ulong validBits = _md.Schema.TableValidityBits;

            for (int i = 0;
                 i < _tables.Length;
                 i++, validBits >>= 1)
            {
                if ((validBits & 1) != 0)
                {
                    Debug.Assert(_tables[i].RowCount > 0, "used table has no rows.");
                }
                else
                {
                    Debug.Assert(_tables[i].RowCount == 0, "unused table has rows.");
                }
            }
        }
Ejemplo n.º 4
0
        private STORAGESTREAM[] GetStreams(Stream peStream, int nStreams)
        {
            var streams = new STORAGESTREAM[nStreams];

            for (int i = 0; i < nStreams; i++)
            {
                streams[i].iOffset = peStream.Read <uint>();
                streams[i].iSize   = peStream.Read <uint>();
                streams[i].rcName  = peStream.ReadUtf8ZeroTerminated();

                peStream.AlignToBytes(4);
            }

            return(streams);
        }
Ejemplo n.º 5
0
        internal ClrBlobPool(Stream peStream, STORAGESTREAM streamInfo, long baseOffset)
        {
            long offset = baseOffset + streamInfo.iOffset;

            peStream.Seek(offset, SeekOrigin.Begin);

            _data = new byte[streamInfo.iSize];
            peStream.Read(_data, 0, _data.Length);


            // start at byte 1 - skips the first 0 element.
            int idx   = 1;
            var blobs = new List <IBlob>();

            while (idx < _data.Length)
            {
                int len;

                if ((_data[idx] & 0xC0) == 0xC0)
                {
                    len = ((_data[idx + 0] & 0x3F) << 24) |
                          ((_data[idx + 1] & 0xFF) << 16) |
                          ((_data[idx + 2] & 0xFF) << 8) |
                          ((_data[idx + 3] & 0xFF) << 0);

                    idx += 4;
                }
                else if ((_data[idx] & 0x80) == 0x80)
                {
                    len = ((_data[idx + 0] & 0x7F) << 8) |
                          ((_data[idx + 1] & 0xFF) << 0);

                    idx += 2;
                }
                else
                {
                    len  = _data[idx];
                    idx += 1;
                }

                blobs.Add(new Blob(_data, idx, len));
                idx += len;
            }

            Debug.Assert(idx == _data.Length);

            _blobs = blobs.ToArray();
        }
Ejemplo n.º 6
0
        internal ClrGuidPool(Stream peStream, STORAGESTREAM streamInfo, long baseOffset)
        {
            int count = checked ((int)(streamInfo.iSize / SizeOfGuid));

            var guids = new Guid[count];

            if (count > 0)
            {
                long offset = baseOffset + streamInfo.iOffset;
                peStream.Seek(offset, SeekOrigin.Begin);

                var buffer = new byte[SizeOfGuid];

                for (int i = 0; i < count; i++)
                {
                    peStream.Read(buffer, 0, SizeOfGuid);
                    guids[i] = new Guid(buffer);
                }
            }

            _guids = guids.ToArray();
        }