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 35using 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) 45struct 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 54class MBRPart { 55protected: 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 71public: 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); 86 void SetStatus(uint8_t s) {status = s;} 87 void SetInclusion(int status = PRIMARY) {includeAs = status;} 88 void SetCanBeLogical(int c) {canBeLogical = c;} 89 void SetCanBePrimary(int c) {canBePrimary = c;} 90 void StoreInStruct(struct MBRRecord *theStruct); 91 92 // Get information on partitions or disk.... 93 uint8_t GetType(void) {return partitionType;} 94 uint8_t GetStatus(void) {return status;} 95 uint64_t GetStartLBA(void) {return firstLBA;} 96 uint64_t GetLengthLBA(void) {return lengthLBA;} 97 uint64_t GetLastLBA(void) const; 98 uint8_t GetInclusion(void) {return includeAs;} 99 int CanBeLogical(void) {return canBeLogical;} 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