in vhdcore/footer/diskGeometry.go [25:77]
func CreateNewDiskGeometry(virtualSize int64) *DiskGeometry {
// Total data sectors present in the disk image
var totalSectors = virtualSize / vhdcore.VhdSectorLength
// Sectors per track on the disk
var sectorsPerTrack int64
// Number of heads present on the disk
var heads int32
// Cylinders * heads
var cylinderTimesHeads int64
// C * H * S
if totalSectors > 65535*16*255 {
totalSectors = 65535 * 16 * 255
}
if totalSectors >= 65535*16*63 {
sectorsPerTrack = 255
cylinderTimesHeads = totalSectors / sectorsPerTrack
heads = 16
return &DiskGeometry{
Cylinder: uint16(cylinderTimesHeads / int64(heads)),
Heads: byte(heads),
Sectors: byte(sectorsPerTrack),
}
}
sectorsPerTrack = 17
cylinderTimesHeads = totalSectors / sectorsPerTrack
heads = int32((cylinderTimesHeads + 1023) / 1024)
if heads < 4 {
heads = 4
}
if cylinderTimesHeads >= int64(heads*1024) || heads > 16 {
sectorsPerTrack = 31
heads = 16
cylinderTimesHeads = totalSectors / sectorsPerTrack
}
if cylinderTimesHeads >= int64(heads*1024) {
sectorsPerTrack = 63
heads = 16
cylinderTimesHeads = totalSectors / sectorsPerTrack
}
return &DiskGeometry{
Cylinder: uint16(cylinderTimesHeads / int64(heads)),
Heads: byte(heads),
Sectors: byte(sectorsPerTrack),
}
}