/// <summary>
 /// Constructor
 /// </summary>
 /// <param name="rvaConverter"><see cref="RVA"/>/<see cref="FileOffset"/> converter</param>
 /// <param name="dataReader">Data reader (it's used after converting an <see cref="RVA"/>
 /// to a <see cref="FileOffset"/>). This instance owns the reader.</param>
 /// <param name="rsrcReader">Reader for the whole Win32 resources section (usually
 /// the .rsrc section). It's used to read <see cref="ResourceDirectory"/>'s and
 /// <see cref="ResourceData"/>'s but not the actual data blob. This instance owns the
 /// reader.</param>
 public Win32ResourcesPE(IRvaFileOffsetConverter rvaConverter, IImageStream dataReader, IBinaryReader rsrcReader)
 {
     if (dataReader == rsrcReader)
     {
         rsrcReader = dataReader.Clone();                        // Must not be the same readers
     }
     this.rvaConverter = rvaConverter;
     this.dataReader   = dataReader;
     this.rsrcReader   = rsrcReader;
     Initialize();
 }
 /// <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>
		/// 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>
		/// Constructor
		/// </summary>
		/// <param name="rvaConverter"><see cref="RVA"/>/<see cref="FileOffset"/> converter</param>
		/// <param name="dataReader">Data reader (it's used after converting an <see cref="RVA"/>
		/// to a <see cref="FileOffset"/>). This instance owns the reader.</param>
		/// <param name="rsrcReader">Reader for the whole Win32 resources section (usually
		/// the .rsrc section). It's used to read <see cref="ResourceDirectory"/>'s and
		/// <see cref="ResourceData"/>'s but not the actual data blob. This instance owns the
		/// reader.</param>
		public Win32ResourcesPE(IRvaFileOffsetConverter rvaConverter, IImageStream dataReader, IBinaryReader rsrcReader) {
			if (dataReader == rsrcReader)
				rsrcReader = dataReader.Clone();	// Must not be the same readers
			this.rvaConverter = rvaConverter;
			this.dataReader = dataReader;
			this.rsrcReader = rsrcReader;
			Initialize();
		}