docs: def _PecoffHeaderParser(self):
      """Parses PECOFF headers.
  
      Reads header magic and some data structures in a file to determine if
      it is a valid PECOFF header, and figure out the offsets at which
      relevant data is stored.
      While this code contains multiple seeks and small reads, that is
      compensated by the underlying libc buffering mechanism.
  
      Returns:
        None if the parsed file is not PECOFF.
        A dict with offsets and lengths for CheckSum, CertTable, and SignedData
        fields in the PECOFF binary, for those that are present.
      """
      extents = {}
      self.file.seek(0, os.SEEK_SET)
      buf = self.file.read(2)
      if buf != b'MZ':
        return None
      self.file.seek(0x3C, os.SEEK_SET)
      buf = self.file.read(4)
      pecoff_sig_offset = struct.unpack('<I', buf)[0]
      if pecoff_sig_offset >= self.filelength:
        return None
      self.file.seek(pecoff_sig_offset, os.SEEK_SET)
      buf = self.file.read(4)
      if buf != b'PE\0\0':
        return None
      self.file.seek(pecoff_sig_offset + 20, os.SEEK_SET)
      buf = self.file.read(2)
      optional_header_size = struct.unpack('<H', buf)[0]
      optional_header_offset = pecoff_sig_offset + 4 + 20
      if optional_header_size + optional_header_offset > self.filelength:
        # This is not strictly a failure for windows, but such files better
        # be treated as generic files. They can not be carrying SignedData.
        return None
      if optional_header_size < 68:
        # We can't do authenticode-style hashing. If this is a valid binary,
        # which it can be, the header still does not even contain a checksum.
        return None
      self.file.seek(optional_header_offset, os.SEEK_SET)
      buf = self.file.read(2)
      image_magic = struct.unpack('<H', buf)[0]
      if image_magic == 0x10b:
        # 32 bit
        rva_base = optional_header_offset + 92
        cert_base = optional_header_offset + 128
      elif image_magic == 0x20b:
        # 64 bit
        rva_base = optional_header_offset + 108
        cert_base = optional_header_offset + 144
      else:
        # A ROM image or such, not in the PE/COFF specs. Not sure what to do.
        return None
      extents['CheckSum'] = RelRange(optional_header_offset + 64, 4)
      self.file.seek(rva_base, os.SEEK_SET)
      buf = self.file.read(4)
      number_of_rva = struct.unpack('<I', buf)[0]
      if (number_of_rva < 5 or
          optional_header_offset + optional_header_size < cert_base + 8):
        return extents
      extents['CertTable'] = RelRange(cert_base, 8)
  
      self.file.seek(cert_base, os.SEEK_SET)
      buf = self.file.read(8)
      start, length = struct.unpack('<II', buf)
      if (length == 0 or start < optional_header_offset + optional_header_size or
          start + length > self.filelength):
        # The location of the SignedData blob is just wrong (or there is none).
        # Ignore it -- everything else we did still makes sense.
        return extents
      extents['SignedData'] = RelRange(start, length)
      return extents