public CoffOptionalHeader32Plus(PE32Magic magic, BinaryReader rdr) { Magic = magic; StandardFields = new CoffStandardFields32Plus(rdr); WindowsFields = new CoffWindowsFields32Plus(rdr); DataDirectories = new CoffImageDataDirectory[WindowsFields.NumberOfRvaAndSizes]; for (var i = 0; i < WindowsFields.NumberOfRvaAndSizes; i++) { DataDirectories[i].VirtualAddress = rdr.ReadUInt32(); DataDirectories[i].Size = rdr.ReadUInt32(); } }
private void Load(Stream stream) { BinaryReader rdr = new BinaryReader(stream); //////////////////////////////////// // The DOS Stub and PE Offset marker DosHeader = new DosHeader(rdr); PEOffset = DosHeader.NewExeHeaderAddress; // this is at 0x3C rdr.BaseStream.Seek(PEOffset, SeekOrigin.Begin); //////////////////////////////////// // The COFF File Header PESignature = rdr.ReadBytes(4); if (!IsPESignature(PESignature)) { throw new FormatException("The specified file does not contain a PE signature."); } CoffFileHeader = new CoffFileHeader(rdr); long offsetEndOfCoffFileHeader = rdr.BaseStream.Position; //////////////////////////////////// // The Optional Header PE32Magic magic = (PE32Magic)rdr.ReadUInt16(); switch (magic) { case PE32Magic.PE32: // Ensure the Optional Header is big enough for the minimum amount of data // Standard fields: 28 bytes // Windows fields: 68 bytes // Total: 92 bytes if (CoffFileHeader.SizeOfOptionalHeader < 96) { String msg = String.Format("The specified file's declared Optional Header size of {0} bytes is smaller than the minimum of 96 required bytes.", CoffFileHeader.SizeOfOptionalHeader); throw new FormatException(msg); } OptionalHeader32 = new CoffOptionalHeader32(magic, rdr); break; case PE32Magic.PE32Plus: // Standard fields: 24 bytes // Windows fields: 88 bytes // Total: 112 bytes if (CoffFileHeader.SizeOfOptionalHeader < 112) { String msg = String.Format("The specified file's declared Optional Header size of {0} bytes is smaller than the minimum of 112 required bytes.", CoffFileHeader.SizeOfOptionalHeader); throw new FormatException(msg); } OptionalHeader32Plus = new CoffOptionalHeader32Plus(magic, rdr); break; case PE32Magic.RomImage: default: OptionalHeader = rdr.ReadBytes(CoffFileHeader.SizeOfOptionalHeader); break; } long offsetEndOfOptionalHeader = rdr.BaseStream.Position; // by now we're at the end of the Optional Header, but let's make sure if (offsetEndOfOptionalHeader != offsetEndOfCoffFileHeader + CoffFileHeader.SizeOfOptionalHeader) { // error condition } /////////////////////////////// // The Section Table SectionTable = new SectionTableEntry[CoffFileHeader.NofSections]; for (int i = 0; i < SectionTable.Length; i++) { SectionTable[i] = new SectionTableEntry(rdr); } }