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 }