package loader import ( "encoding/binary" "fmt" "io" ) // HeaderSize is the byte size of the MAK v2 header const HeaderSize = 32 // ReadHeader reads a MAK v2 header from a reader func ReadHeader(r io.Reader) (*Header, error) { var h Header if _, err := io.ReadFull(r, h.Magic[:]); err != nil { return nil, fmt.Errorf("reading magic: %w", err) } // Check magic if string(h.Magic[:]) != Magic { return nil, fmt.Errorf("invalid magic: %s", string(h.Magic[:])) } if err := binary.Read(r, binary.LittleEndian, &h.Version); err != nil { return nil, fmt.Errorf("reading version: %w", err) } if err := binary.Read(r, binary.LittleEndian, &h.Flags); err != nil { return nil, fmt.Errorf("reading flags: %w", err) } if err := binary.Read(r, binary.LittleEndian, &h.SectionCount); err != nil { return nil, fmt.Errorf("reading section count: %w", err) } if err := binary.Read(r, binary.LittleEndian, &h.Alignment); err != nil { return nil, fmt.Errorf("reading alignment: %w", err) } if _, err := io.ReadFull(r, h.Reserved[:]); err != nil { return nil, fmt.Errorf("reading reserved: %w", err) } return &h, nil } // WriteHeader writes a MAK v2 header to a writer func WriteHeader(w io.Writer, h *Header) error { if _, err := w.Write(h.Magic[:]); err != nil { return err } if err := binary.Write(w, binary.LittleEndian, h.Version); err != nil { return err } if err := binary.Write(w, binary.LittleEndian, h.Flags); err != nil { return err } if err := binary.Write(w, binary.LittleEndian, h.SectionCount); err != nil { return err } if err := binary.Write(w, binary.LittleEndian, h.Alignment); err != nil { return err } if _, err := w.Write(h.Reserved[:]); err != nil { return err } return nil }