void LoadMetaDataStreams() { int add = 0; parent._streams = new MetaDataStream[metadataHeader2.NumberOfStreams]; for (int i = 0; i < metadataHeader2.NumberOfStreams; i++) { long offset = metadataStreamOffset + add + (i * 4); Structures.METADATA_STREAM_HEADER streamHeader = ntHeader._assembly._peImage.ReadStructure <Structures.METADATA_STREAM_HEADER>(offset); long stringOffset = offset + 8; string name = ntHeader._assembly._peImage.ReadASCIIString(stringOffset).Replace("\0", ""); if (name.Length >= 8) { add += 16; } else if (name.Length >= 4) { add += 12; } else { add += 8; } parent._streams[i] = GetHeap(ntHeader._assembly._netHeader, (int)offset, streamHeader, name); } foreach (MetaDataStream stream in parent._streams) { stream.Initialize(); } }
internal MetaDataStream(NETHeader netheader, int headeroffset, Structures.METADATA_STREAM_HEADER rawHeader, string name) { this._headeroffset = headeroffset; this._netheader = netheader; this._streamHeader = rawHeader; this._name = name; this._indexsize = 2; byte[] contents = netheader._assembly._peImage.ReadBytes(StreamOffset, (int)StreamSize); _mainStream = new MemoryStream(); _binReader = new BinaryReader(_mainStream); _binWriter = new BinaryWriter(_mainStream); _mainStream.Write(contents, 0, contents.Length); _mainStream.Seek(0, SeekOrigin.Begin); }
public MetaDataStream(string name, byte[] contents) { Name = name; this._streamHeader = new Structures.METADATA_STREAM_HEADER() { Offset = 0, Size = (uint)contents.Length, }; _mainStream = new MemoryStream(); _binReader = new BinaryReader(_mainStream); _binWriter = new BinaryWriter(_mainStream); _mainStream.Write(contents, 0, contents.Length); _mainStream.Seek(0, SeekOrigin.Begin); }
private MetaDataStream GetHeap(NETHeader netheader, int headeroffset, Structures.METADATA_STREAM_HEADER rawHeader, string name) { switch (name) { case "#~": case "#-": return(new TablesHeap(netheader, headeroffset, rawHeader, name)); case "#Strings": return(new StringsHeap(netheader, headeroffset, rawHeader, name)); case "#US": return(new UserStringsHeap(netheader, headeroffset, rawHeader, name)); case "#GUID": return(new GuidHeap(netheader, headeroffset, rawHeader, name)); case "#Blob": return(new BlobHeap(netheader, headeroffset, rawHeader, name)); default: return(new MetaDataStream(netheader, headeroffset, rawHeader, name)); } }
internal TablesHeap(NETHeader netheader, int headeroffset, Structures.METADATA_STREAM_HEADER rawHeader, string name) : base(netheader, headeroffset, rawHeader, name) { }