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(); }
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(); }
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."); } } }
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); }
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(); }
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(); }