ResourceData ReadResourceData(int i) { var info = dataInfos[i]; var reader = resources.ResourceReader; var oldPos = reader.Position; reader.Position = info.offset; ResourceData data; if (reader.CanRead(16)) { RVA rva = (RVA)reader.ReadUInt32(); uint size = reader.ReadUInt32(); uint codePage = reader.ReadUInt32(); uint reserved = reader.ReadUInt32(); var dataReader = resources.CreateDataReader(rva, size); data = new ResourceData(info.name, dataReader, codePage, reserved); } else { data = new ResourceData(info.name, MemoryImageStream.CreateEmpty()); } reader.Position = oldPos; return(data); }
ResourceData ReadResourceData(int i) { #if THREAD_SAFE resources.theLock.EnterWriteLock(); try { #endif var info = dataInfos[i]; var reader = resources.ResourceReader; var oldPos = reader.Position; reader.Position = info.offset; ResourceData data; if (reader.CanRead(16)) { RVA rva = (RVA)reader.ReadUInt32(); uint size = reader.ReadUInt32(); uint codePage = reader.ReadUInt32(); uint reserved = reader.ReadUInt32(); var dataReader = resources.CreateDataReader_NoLock(rva, size); data = new ResourceData(info.name, dataReader, codePage, reserved); } else { data = new ResourceData(info.name, MemoryImageStream.CreateEmpty()); } reader.Position = oldPos; return(data); #if THREAD_SAFE } finally { resources.theLock.ExitWriteLock(); } #endif }
internal IBinaryReader CreateDataReader_NoLock(RVA rva, uint size) { var reader = dataReader.Create(rvaConverter.ToFileOffset(rva), size); if (reader.Length == size) { return(reader); } reader.Dispose(); return(MemoryImageStream.CreateEmpty()); }
/// <summary> /// Creates a new sub stream of the #Blob stream that can access one blob /// </summary> /// <param name="offset">Offset of blob</param> /// <returns>A new stream</returns> public IImageStream CreateStream(uint offset) { int compressedLen; int size = GetSize(offset, out compressedLen); if (size < 0) { return(MemoryImageStream.CreateEmpty()); } return(imageStream.Create((FileOffset)((long)offset + compressedLen), size)); }
public IImageStream Create(FileOffset offset, long length) { if (offset < 0 || length < 0) { return(MemoryImageStream.CreateEmpty()); } int offs = (int)Math.Min(data.Length, (long)offset); int len = (int)Math.Min((long)data.Length - offs, length); return(new MemoryImageStream(offset, data, offs, len)); }
/// <summary> /// Creates a new sub stream of the #Blob stream that can access one blob /// </summary> /// <param name="offset">Offset of blob</param> /// <returns>A new stream</returns> public IImageStream CreateStream(uint offset) { #if THREAD_SAFE theLock.EnterWriteLock(); try { #endif IImageStream reader; int size = GetReader_NoLock(offset, out reader); if (size < 0) { return(MemoryImageStream.CreateEmpty()); } return(reader.Create((FileOffset)reader.Position, size)); #if THREAD_SAFE } finally { theLock.ExitWriteLock(); } #endif }
/// <summary> /// Constructor /// </summary> /// <param name="peImage">The PE image</param> /// <param name="rsrcReader">Reader for the whole Win32 resources section (usually /// the .rsrc section) or <c>null</c> if we should create one from the resource data /// directory in the optional header. This instance owns the reader.</param> public Win32ResourcesPE(IPEImage peImage, IBinaryReader rsrcReader) { this.rvaConverter = peImage; this.dataReader = peImage.CreateFullStream(); if (rsrcReader != null) { this.rsrcReader = rsrcReader; } else { var dataDir = peImage.ImageNTHeaders.OptionalHeader.DataDirectories[2]; if (dataDir.VirtualAddress != 0 && dataDir.Size != 0) { this.rsrcReader = peImage.CreateStream(dataDir.VirtualAddress, dataDir.Size); } else { this.rsrcReader = MemoryImageStream.CreateEmpty(); } } Initialize(); }
/// <summary> /// Default constructor /// </summary> public DotNetStream() { this.imageStream = MemoryImageStream.CreateEmpty(); this.streamHeader = null; }