/// <summary> /// Transforms the specified linear address. /// </summary> /// <param name="linearAddress">The linear address.</param> /// <param name="geometry">The geometry.</param> /// <returns></returns> /// <remarks></remarks> public static CubicAddress Transform(long linearAddress, CubicAddress geometry) { var cubicAddress = new CubicAddress(); uint sectorsPerCylinder = geometry.Sector*geometry.Head; long remainder; cubicAddress.Cylinder = Math.DivRem(linearAddress, sectorsPerCylinder, out remainder); cubicAddress.Head = (uint) Math.DivRem(remainder, geometry.Sector, out remainder); cubicAddress.Sector = 1 + (uint) remainder; return cubicAddress; }
/// <summary> /// Initializes a new instance of the <see cref="DiskGeometry"/> class. /// </summary> /// <param name="deviceName">Name of the device.</param> /// <remarks></remarks> private DiskGeometry(String deviceName) { var x = new Win32.DISK_GEOMETRY_EX(); InputOutputControlExtension.Execute(ref x, InputOutputControlExtension.DISK_GET_DRIVE_GEOMETRY_EX, deviceName); m_DiskSize = x.DiskSize; m_Geometry = x.Geometry; long remainder; m_MaximumLinearAddress = Math.DivRem(DiskSize, BytesPerSector, out remainder) - 1; ThrowIfDiskSizeOutOfIntegrity(remainder); m_BytesPerCylinder = BytesPerSector*Sector*Head; m_MaximumCubicAddress = Transform(m_MaximumLinearAddress, this); }