public void CreateBySizeInGap() { SparseMemoryStream ms = new SparseMemoryStream(); Geometry geom = new Geometry(15, 30, 63); ms.SetLength(geom.Capacity); BiosPartitionTable table = BiosPartitionTable.Initialize(ms, geom); Assert.AreEqual(0, table.CreatePrimaryByCylinder(0, 4, 33, false)); Assert.AreEqual(1, table.CreatePrimaryByCylinder(10, 14, 33, false)); table.Create(geom.ToLogicalBlockAddress(new ChsAddress(4, 0, 1)) * 512, WellKnownPartitionType.WindowsFat, true); }
public void CreateByCylinder() { SparseMemoryStream ms = new SparseMemoryStream(); Geometry geom = new Geometry(15, 30, 63); ms.SetLength(geom.Capacity); BiosPartitionTable table = BiosPartitionTable.Initialize(ms, geom); Assert.AreEqual(0, table.CreatePrimaryByCylinder(0, 4, 33, false)); Assert.AreEqual(1, table.CreatePrimaryByCylinder(10, 14, 33, false)); Assert.AreEqual(geom.ToLogicalBlockAddress(new ChsAddress(0, 1, 1)), table[0].FirstSector); Assert.AreEqual(geom.ToLogicalBlockAddress(new ChsAddress(5, 0, 1)) - 1, table[0].LastSector); Assert.AreEqual(geom.ToLogicalBlockAddress(new ChsAddress(10, 0, 1)), table[1].FirstSector); Assert.AreEqual(geom.ToLogicalBlockAddress(new ChsAddress(14, 29, 63)), table[1].LastSector); }
public void CreateBySizeInGapAligned() { SparseMemoryStream ms = new SparseMemoryStream(); Geometry geom = new Geometry(15, 30, 63); ms.SetLength(geom.Capacity); BiosPartitionTable table = BiosPartitionTable.Initialize(ms, geom); Assert.AreEqual(0, table.CreatePrimaryByCylinder(0, 4, 33, false)); Assert.AreEqual(1, table.CreatePrimaryByCylinder(10, 14, 33, false)); int idx = table.CreateAligned(3 * 1024 * 1024, WellKnownPartitionType.WindowsFat, true, 64 * 1024); Assert.AreEqual(2, idx); Assert.AreEqual(0, table[idx].FirstSector % 128); Assert.AreEqual(0, (table[idx].LastSector + 1) % 128); }
/// <summary> /// Creates a new partition table on a disk. /// </summary> /// <param name="disk">The stream containing the disk data.</param> /// <param name="diskGeometry">The geometry of the disk.</param> /// <returns>An object to access the newly created partition table.</returns> public static GuidPartitionTable Initialize(Stream disk, Geometry diskGeometry) { // Create the protective MBR partition record. BiosPartitionTable pt = BiosPartitionTable.Initialize(disk, diskGeometry); pt.CreatePrimaryByCylinder(0, diskGeometry.Cylinders - 1, BiosPartitionTypes.GptProtective, false); // Create the GPT headers, and blank-out the entry areas const int EntryCount = 128; const int EntrySize = 128; int entrySectors = (EntryCount * EntrySize + diskGeometry.BytesPerSector - 1) / diskGeometry.BytesPerSector; byte[] entriesBuffer = new byte[EntryCount * EntrySize]; // Prepare primary header GptHeader header = new GptHeader(diskGeometry.BytesPerSector); header.HeaderLba = 1; header.AlternateHeaderLba = disk.Length / diskGeometry.BytesPerSector - 1; header.FirstUsable = header.HeaderLba + entrySectors + 1; header.LastUsable = header.AlternateHeaderLba - entrySectors - 1; header.DiskGuid = Guid.NewGuid(); header.PartitionEntriesLba = 2; header.PartitionEntryCount = EntryCount; header.PartitionEntrySize = EntrySize; header.EntriesCrc = CalcEntriesCrc(entriesBuffer); // Write the primary header byte[] headerBuffer = new byte[diskGeometry.BytesPerSector]; header.WriteTo(headerBuffer, 0); disk.Position = header.HeaderLba * diskGeometry.BytesPerSector; disk.Write(headerBuffer, 0, headerBuffer.Length); // Write the primary partition table disk.Position = header.PartitionEntriesLba * diskGeometry.BytesPerSector; disk.Write(entriesBuffer, 0, entriesBuffer.Length); // Calc alternate header header.HeaderLba = header.AlternateHeaderLba; header.AlternateHeaderLba = 1; header.PartitionEntriesLba = header.HeaderLba - entrySectors; // Write the alternate header header.WriteTo(headerBuffer, 0); disk.Position = header.HeaderLba * diskGeometry.BytesPerSector; disk.Write(headerBuffer, 0, headerBuffer.Length); // Write the alternate partition table disk.Position = header.PartitionEntriesLba * diskGeometry.BytesPerSector; disk.Write(entriesBuffer, 0, entriesBuffer.Length); return(new GuidPartitionTable(disk, diskGeometry)); }
public void VeryLargePartition() { long capacity = 1300 * 1024L * 1024L * 1024; SparseMemoryStream ms = new SparseMemoryStream(); ms.SetLength(capacity); Geometry geom = Geometry.LbaAssistedBiosGeometry(capacity); BiosPartitionTable table = BiosPartitionTable.Initialize(ms, geom); // exception occurs here int i = table.CreatePrimaryByCylinder(0, 150000, (byte)WellKnownPartitionType.WindowsNtfs, true); Assert.AreEqual(150000, geom.ToChsAddress(table[0].LastSector).Cylinder); }