bool ReadSectionHeaders(
   ref MemoryReader memReader
 )
   //^ requires this.ReaderState >= ReaderState.Initialized;
 {
   int numberOfSections = this.COFFFileHeader.NumberOfSections;
   if (memReader.RemainingBytes < numberOfSections * PEFileConstants.SizeofSectionHeader) {
     this.ErrorContainer.AddBinaryError(memReader.Offset, MetadataReaderErrorKind.SectionHeadersTooSmall);
     return false;
   }
   this.SectionHeaders = new SectionHeader[numberOfSections];
   SectionHeader[] sectionHeaderArray = this.SectionHeaders;
   for (int i = 0; i < numberOfSections; ++i) {
     sectionHeaderArray[i].Name = memReader.ReadASCIIWithSize(PEFileConstants.SizeofSectionName);
     sectionHeaderArray[i].VirtualSize = memReader.ReadInt32();
     sectionHeaderArray[i].VirtualAddress = memReader.ReadInt32();
     sectionHeaderArray[i].SizeOfRawData = memReader.ReadInt32();
     sectionHeaderArray[i].OffsetToRawData = memReader.ReadInt32();
     sectionHeaderArray[i].RVAToRelocations = memReader.ReadInt32();
     sectionHeaderArray[i].PointerToLineNumbers = memReader.ReadInt32();
     sectionHeaderArray[i].NumberOfRelocations = memReader.ReadUInt16();
     sectionHeaderArray[i].NumberOfLineNumbers = memReader.ReadUInt16();
     sectionHeaderArray[i].SectionCharacteristics = (SectionCharacteristics)memReader.ReadUInt32();
   }
   return true;
 }