github.com/Microsoft/azure-vhd-utils@v0.0.0-20230613175315-7c30a3748a1b/vhdcore/footer/vhdFooterSerializer.go (about)

     1  package footer
     2  
     3  import (
     4  	"github.com/Microsoft/azure-vhd-utils/vhdcore"
     5  	"github.com/Microsoft/azure-vhd-utils/vhdcore/writer"
     6  )
     7  
     8  // SerializeFooter returns the given VhdFooter instance as byte slice of length 512 bytes.
     9  //
    10  func SerializeFooter(footer *Footer) []byte {
    11  	buffer := make([]byte, vhdcore.VhdFooterSize)
    12  	writer := writer.NewVhdWriterFromByteSlice(buffer)
    13  
    14  	writer.WriteBytes(0, footer.Cookie.Data)
    15  	writer.WriteUInt32(8, uint32(footer.Features))
    16  	writer.WriteUInt32(12, uint32(footer.FileFormatVersion))
    17  	writer.WriteInt64(16, footer.HeaderOffset)
    18  	writer.WriteTimeStamp(24, footer.TimeStamp)
    19  	creatorApp := make([]byte, 4)
    20  	copy(creatorApp, footer.CreatorApplication)
    21  	writer.WriteBytes(28, creatorApp)
    22  	writer.WriteUInt32(32, uint32(footer.CreatorVersion))
    23  	writer.WriteUInt32(36, uint32(footer.CreatorHostOsType))
    24  	writer.WriteInt64(40, footer.PhysicalSize)
    25  	writer.WriteInt64(48, footer.VirtualSize)
    26  	// + DiskGeometry
    27  	writer.WriteUInt16(56, footer.DiskGeometry.Cylinder)
    28  	writer.WriteByte(58, footer.DiskGeometry.Heads)
    29  	writer.WriteByte(59, footer.DiskGeometry.Sectors)
    30  	// - DiskGeometry
    31  	writer.WriteUInt32(60, uint32(footer.DiskType))
    32  	writer.WriteBytes(68, footer.UniqueID.ToByteSlice())
    33  	writer.WriteBoolean(84, footer.SavedState)
    34  	writer.WriteBytes(85, footer.Reserved)
    35  	// + Checksum
    36  	//
    37  	// Checksum is one’s complement of the sum of all the bytes in the footer without the
    38  	// checksum field.
    39  	checkSum := uint32(0)
    40  	for i := int(0); i < int(vhdcore.VhdFooterSize); i++ {
    41  		if i < vhdcore.VhdFooterChecksumOffset || i >= vhdcore.VhdFooterChecksumOffset+4 {
    42  			checkSum += uint32(buffer[i])
    43  		}
    44  	}
    45  
    46  	writer.WriteUInt32(64, ^checkSum)
    47  	// - Checksum
    48  
    49  	return buffer
    50  }