func CreateNewDiskGeometry()

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),
	}
}