Esempio n. 1
0
        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);
        }
Esempio n. 4
0
        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");
            }
        }
Esempio n. 5
0
        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();
        }
Esempio n. 6
0
        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");
            }
        }