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);
        }
Esempio n. 2
0
        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
        }
Esempio n. 3
0
        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());
        }
Esempio n. 4
0
        /// <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));
        }
Esempio n. 5
0
            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));
            }
Esempio n. 6
0
        /// <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
        }
Esempio n. 7
0
 /// <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();
 }
Esempio n. 8
0
 /// <summary>
 /// Default constructor
 /// </summary>
 public DotNetStream()
 {
     this.imageStream  = MemoryImageStream.CreateEmpty();
     this.streamHeader = null;
 }