internal GuidPartitionTable(byte[] bytes) { #region Header GuidPartitionTableHeader GPTHeader = new GuidPartitionTableHeader(Helper.GetSubArray(bytes, 0x00, SECTOR_SIZE)); Revision = GPTHeader.Revision; HeaderSize = GPTHeader.HeaderSize; MyLBA = GPTHeader.MyLBA; AlternateLBA = GPTHeader.AlternateLBA; FirstUsableLBA = GPTHeader.FirstUsableLBA; LastUsableLBA = GPTHeader.LastUsableLBA; DiskGuid = GPTHeader.DiskGUID; PartitionEntryLBA = GPTHeader.PartitionEntryLBA; NumberOfPartitionEntries = GPTHeader.NumberOfPartitionEntries; SizeOfPartitionEntry = GPTHeader.SizeOfPartitionEntry; #endregion Header // Get PartitionTable List <GuidPartitionTableEntry> partitionList = new List <GuidPartitionTableEntry>(); for (int i = 0; i < (bytes.Length - SECTOR_SIZE); i += (int)GPTHeader.SizeOfPartitionEntry) { // Instantiate a GuidPartitionTableEntry object GuidPartitionTableEntry entry = new GuidPartitionTableEntry(Helper.GetSubArray(bytes, (i + SECTOR_SIZE), (int)GPTHeader.SizeOfPartitionEntry)); // If entry's PartitionTypeGUID is 00000000-0000-0000-0000-000000000000 then it is not a partition if (entry.PartitionTypeGuid == new Guid("00000000-0000-0000-0000-000000000000")) { break; } partitionList.Add(entry); } PartitionTable = partitionList.ToArray(); }
/// <summary> /// /// </summary> /// <param name="bytes"></param> /// <param name="partitionCount"></param> /// <param name="partitionSize"></param> /// <returns></returns> internal static GuidPartitionTableEntry[] GetInstances(byte[] bytes, uint partitionCount, uint partitionSize) { // Get PartitionTable List <GuidPartitionTableEntry> partitionList = new List <GuidPartitionTableEntry>(); // Iterate through Partition Entries for (int i = GuidPartitionTable.SECTOR_SIZE; i < bytes.Length; i += (int)partitionSize) { // Instantiate a GuidPartitionTableEntry object GuidPartitionTableEntry entry = new GuidPartitionTableEntry(bytes, i); // If entry's StartingLBA is 0 then it is not a partition if (entry.StartingLBA == 0) { break; } partitionList.Add(entry); } return(partitionList.ToArray()); }
private GuidPartitionTable(string devicePath) { byte[] bytes = GuidPartitionTable.GetBytes(devicePath); // Test GPT Signature Signature = Encoding.ASCII.GetString(bytes, 0x00, 0x08); if (Signature == SIGNATURE_STRING) { Revision = new Version(BitConverter.ToUInt16(bytes, 0x08), BitConverter.ToUInt16(bytes, 0x0A)); HeaderSize = BitConverter.ToUInt32(bytes, 0x0C); // Get HeaderCRC32 Value #region MyLBA MyLBA = BitConverter.ToUInt64(bytes, 0x18); if (MyLBA != 1) { throw new Exception("Invalid MyLBA property value"); } #endregion MyLBA AlternateLBA = BitConverter.ToUInt64(bytes, 0x20); FirstUsableLBA = BitConverter.ToUInt64(bytes, 0x28); LastUsableLBA = BitConverter.ToUInt64(bytes, 0x30); DiskGuid = new Guid(Helper.GetSubArray(bytes, 0x38, 0x10)); PartitionEntryLBA = BitConverter.ToUInt64(bytes, 0x48); NumberOfPartitionEntries = BitConverter.ToUInt32(bytes, 0x50); SizeOfPartitionEntry = BitConverter.ToUInt32(bytes, 0x54); // Get PartitionEntryArrayCRC32 Value } else { throw new Exception("Invalid GPT Signature"); } PartitionTable = GuidPartitionTableEntry.GetInstances(bytes, NumberOfPartitionEntries, SizeOfPartitionEntry); }
internal GuidPartitionTable(string devicePath) { MasterBootRecord mbr = MasterBootRecord.Get(devicePath); if (mbr.PartitionTable[0].SystemId == "EFI_GPT_DISK") { using (FileStream streamToRead = Helper.getFileStream(devicePath)) { // Get Header GuidPartitionTableHeader GPTHeader = new GuidPartitionTableHeader(Helper.readDrive(streamToRead, GPT_OFFSET, SECTOR_SIZE)); Revision = GPTHeader.Revision; HeaderSize = GPTHeader.HeaderSize; MyLBA = GPTHeader.MyLBA; AlternateLBA = GPTHeader.AlternateLBA; FirstUsableLBA = GPTHeader.FirstUsableLBA; LastUsableLBA = GPTHeader.LastUsableLBA; DiskGuid = GPTHeader.DiskGUID; PartitionEntryLBA = GPTHeader.PartitionEntryLBA; NumberOfPartitionEntries = GPTHeader.NumberOfPartitionEntries; SizeOfPartitionEntry = GPTHeader.SizeOfPartitionEntry; // Get PartitionTable List <GuidPartitionTableEntry> partitionList = new List <GuidPartitionTableEntry>(); bool Continue = true; // Iterate through sectors that contain the GPT Entry Array for (ulong j = GPTHeader.PartitionEntryLBA; (j < GPTHeader.PartitionEntryLBA + (GPTHeader.NumberOfPartitionEntries / (SECTOR_SIZE / GPTHeader.SizeOfPartitionEntry))); j++) { // Read one sector byte[] partitionSectorBytes = Helper.readDrive(streamToRead, (SECTOR_SIZE * (long)j), SECTOR_SIZE); // Iterate through Partition Entries in Sector // Sectors (512 bytes) / Partitions (128 bytes) = 4 partitions per sector for (int i = 0; i < 512; i += (int)GPTHeader.SizeOfPartitionEntry) { // Instantiate a GuidPartitionTableEntry object GuidPartitionTableEntry entry = new GuidPartitionTableEntry(Helper.GetSubArray(partitionSectorBytes, i, (int)GPTHeader.SizeOfPartitionEntry)); // If entry's PartitionTypeGUID is 00000000-0000-0000-0000-000000000000 then it is not a partition if (entry.PartitionTypeGuid == new Guid("00000000-0000-0000-0000-000000000000")) { Continue = false; break; } partitionList.Add(entry); } if (!Continue) { break; } } PartitionTable = partitionList.ToArray(); } } else { throw new Exception("No GPT found. Please use Get-MBR cmdlet"); } }
internal GuidPartitionTable(byte[] bytes) { #region Header GuidPartitionTableHeader GPTHeader = new GuidPartitionTableHeader(Helper.GetSubArray(bytes, 0x00, SECTOR_SIZE)); Revision = GPTHeader.Revision; HeaderSize = GPTHeader.HeaderSize; MyLBA = GPTHeader.MyLBA; AlternateLBA = GPTHeader.AlternateLBA; FirstUsableLBA = GPTHeader.FirstUsableLBA; LastUsableLBA = GPTHeader.LastUsableLBA; DiskGuid = GPTHeader.DiskGUID; PartitionEntryLBA = GPTHeader.PartitionEntryLBA; NumberOfPartitionEntries = GPTHeader.NumberOfPartitionEntries; SizeOfPartitionEntry = GPTHeader.SizeOfPartitionEntry; #endregion Header // Get PartitionTable List<GuidPartitionTableEntry> partitionList = new List<GuidPartitionTableEntry>(); for (int i = 0; i < (bytes.Length - SECTOR_SIZE); i += (int)GPTHeader.SizeOfPartitionEntry) { // Instantiate a GuidPartitionTableEntry object GuidPartitionTableEntry entry = new GuidPartitionTableEntry(Helper.GetSubArray(bytes, (i + SECTOR_SIZE), (int)GPTHeader.SizeOfPartitionEntry)); // If entry's PartitionTypeGUID is 00000000-0000-0000-0000-000000000000 then it is not a partition if (entry.PartitionTypeGuid == new Guid("00000000-0000-0000-0000-000000000000")) { break; } partitionList.Add(entry); } PartitionTable = partitionList.ToArray(); }
internal GuidPartitionTable(string devicePath) { MasterBootRecord mbr = MasterBootRecord.Get(devicePath); if (mbr.PartitionTable[0].SystemId == "EFI_GPT_DISK") { using (FileStream streamToRead = Helper.getFileStream(devicePath)) { // Get Header GuidPartitionTableHeader GPTHeader = new GuidPartitionTableHeader(Helper.readDrive(streamToRead, GPT_OFFSET, SECTOR_SIZE)); Revision = GPTHeader.Revision; HeaderSize = GPTHeader.HeaderSize; MyLBA = GPTHeader.MyLBA; AlternateLBA = GPTHeader.AlternateLBA; FirstUsableLBA = GPTHeader.FirstUsableLBA; LastUsableLBA = GPTHeader.LastUsableLBA; DiskGuid = GPTHeader.DiskGUID; PartitionEntryLBA = GPTHeader.PartitionEntryLBA; NumberOfPartitionEntries = GPTHeader.NumberOfPartitionEntries; SizeOfPartitionEntry = GPTHeader.SizeOfPartitionEntry; // Get PartitionTable List<GuidPartitionTableEntry> partitionList = new List<GuidPartitionTableEntry>(); bool Continue = true; // Iterate through sectors that contain the GPT Entry Array for(ulong j = GPTHeader.PartitionEntryLBA; (j < GPTHeader.PartitionEntryLBA + (GPTHeader.NumberOfPartitionEntries / (SECTOR_SIZE / GPTHeader.SizeOfPartitionEntry))); j++) { // Read one sector byte[] partitionSectorBytes = Helper.readDrive(streamToRead, (SECTOR_SIZE * (long)j), SECTOR_SIZE); // Iterate through Partition Entries in Sector // Sectors (512 bytes) / Partitions (128 bytes) = 4 partitions per sector for (int i = 0; i < 512; i += (int)GPTHeader.SizeOfPartitionEntry) { // Instantiate a GuidPartitionTableEntry object GuidPartitionTableEntry entry = new GuidPartitionTableEntry(Helper.GetSubArray(partitionSectorBytes, i, (int)GPTHeader.SizeOfPartitionEntry)); // If entry's PartitionTypeGUID is 00000000-0000-0000-0000-000000000000 then it is not a partition if (entry.PartitionTypeGuid == new Guid("00000000-0000-0000-0000-000000000000")) { Continue = false; break; } partitionList.Add(entry); } if (!Continue) { break; } } PartitionTable = partitionList.ToArray(); } } else { throw new Exception("No GPT found. Please use Get-MBR cmdlet"); } }