1 /* 2 MBRPart class, part of GPT fdisk program family. 3 Copyright (C) 2011 Roderick W. Smith 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License along 16 with this program; if not, write to the Free Software Foundation, Inc., 17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 #ifndef MBRPART_H 21 #define MBRPART_H 22 23 #include <stdint.h> 24 25 #define MAX_HEADS 255 /* numbered 0 - 254 */ 26 #define MAX_SECSPERTRACK 63 /* numbered 1 - 63 */ 27 #define MAX_CYLINDERS 1024 /* numbered 0 - 1023 */ 28 29 #define NONE 0 /* don't include partition when writing */ 30 #define PRIMARY 1 /* write partition as primary */ 31 #define LOGICAL 2 /* write partition as logical */ 32 #define EBR 4 /* sector is used as an EBR or MBR */ 33 #define INVALID 8 /* sector number is too large for disk */ 34 35 using namespace std; 36 37 // Data for a single MBR partition record 38 // Note that firstSector and lastSector are in CHS addressing, which 39 // splits the bits up in a weird way. 40 // On read or write of MBR entries, firstLBA is an absolute disk sector. 41 // On read of logical entries, it's relative to the EBR record for that 42 // partition. When writing EBR records, it's relative to the extended 43 // partition's start. 44 #pragma pack(1) 45 struct MBRRecord { 46 uint8_t status; 47 uint8_t firstSector[3]; 48 uint8_t partitionType; 49 uint8_t lastSector[3]; 50 uint32_t firstLBA; // see above 51 uint32_t lengthLBA; 52 }; // struct MBRRecord 53 54 class MBRPart { 55 protected: 56 uint8_t status; 57 uint8_t firstSector[3]; 58 uint8_t partitionType; 59 uint8_t lastSector[3]; 60 uint32_t firstLBA; // see above 61 uint32_t lengthLBA; 62 int includeAs; // PRIMARY, LOGICAL, or NONE 63 int canBeLogical; 64 int canBePrimary; 65 static uint32_t numHeads; 66 static uint32_t numSecspTrack; 67 static uint64_t diskSize; 68 static uint32_t blockSize; 69 static int numInstances; 70 71 public: 72 MBRPart(); 73 MBRPart(const MBRPart& other); 74 virtual ~MBRPart(); 75 virtual MBRPart& operator=(const MBRPart& orig); 76 virtual MBRPart& operator=(const struct MBRRecord& orig); 77 bool operator<(const MBRPart &other) const; 78 79 // Set information on partitions or disks... 80 void SetGeometry(uint32_t heads, uint32_t sectors, uint64_t ds, uint32_t bs); 81 void Empty(void); 82 void SetStartLBA(uint64_t s); 83 void SetLengthLBA(uint64_t l); 84 void SetLocation(uint64_t start, uint64_t length); 85 int SetType(uint8_t typeCode, int isExtended = 0); SetStatus(uint8_t s)86 void SetStatus(uint8_t s) {status = s;} 87 void SetInclusion(int status = PRIMARY) {includeAs = status;} SetCanBeLogical(int c)88 void SetCanBeLogical(int c) {canBeLogical = c;} SetCanBePrimary(int c)89 void SetCanBePrimary(int c) {canBePrimary = c;} 90 void StoreInStruct(struct MBRRecord *theStruct); 91 92 // Get information on partitions or disk.... GetType(void)93 uint8_t GetType(void) {return partitionType;} GetStatus(void)94 uint8_t GetStatus(void) {return status;} GetStartLBA(void)95 uint64_t GetStartLBA(void) {return firstLBA;} GetLengthLBA(void)96 uint64_t GetLengthLBA(void) {return lengthLBA;} 97 uint64_t GetLastLBA(void) const; GetInclusion(void)98 uint8_t GetInclusion(void) {return includeAs;} CanBeLogical(void)99 int CanBeLogical(void) {return canBeLogical;} CanBePrimary(void)100 int CanBePrimary(void) {return canBePrimary;} 101 int DoTheyOverlap (const MBRPart& other); 102 103 // Adjust information on partitions or disks... 104 int RecomputeCHS(void); 105 int LBAtoCHS(uint32_t lba, uint8_t * chs); 106 void ReverseByteOrder(void); 107 108 // User I/O... 109 void ShowData(int isGpt); 110 }; // MBRPart 111 112 #endif // MBRPART_H 113