1 // 2 // C++ Interface: gptpart 3 // 4 // Description: Class to implement a single GPT partition 5 // 6 // 7 // Author: Rod Smith <rodsmith@rodsbooks.com>, (C) 2009 8 // 9 // Copyright: See COPYING file that comes with this distribution 10 // 11 // 12 // This program is copyright (c) 2009 by Roderick W. Smith. It is distributed 13 // under the terms of the GNU GPL version 2, as detailed in the COPYING file. 14 15 #ifndef __GPTPART_H 16 #define __GPTPART_H 17 18 #include <stdint.h> 19 #include <string> 20 #include <sys/types.h> 21 #include "support.h" 22 #include "parttypes.h" 23 #include "guid.h" 24 #include "attributes.h" 25 26 using namespace std; 27 28 // Values returned by GPTPart::IsSizedForMBR() 29 #define MBR_SIZED_GOOD 0 /* Whole partition under 2^32 sectors */ 30 #define MBR_SIZED_IFFY 1 /* Partition starts under 2^32 & is less than 2^32, but ends over 2^32 */ 31 #define MBR_SIZED_BAD 2 /* Partition starts over 2^32, is bigger than 2^32, or otherwise bad */ 32 33 /**************************************** 34 * * 35 * GPTPart class and related structures * 36 * * 37 ****************************************/ 38 39 class GPTPart { 40 protected: 41 // Caution: The non-static data in GPTPart is precisely the right size 42 // to enable easy loading of the data directly from disk. If any 43 // non-static variables are added to the below, the data size will 44 // change and the program will stop working. This can be corrected by 45 // adjusting the data-load operation in GPTData::LoadMainTable() and 46 // GPTData::LoadSecondTableAsMain() and then removing the GPTPart 47 // size check in SizesOK() (in gpt.cc file). 48 PartType partitionType; 49 GUIDData uniqueGUID; 50 uint64_t firstLBA; 51 uint64_t lastLBA; 52 Attributes attributes; 53 uint16_t name[NAME_SIZE]; 54 public: 55 GPTPart(void); 56 GPTPart(const GPTPart &); 57 ~GPTPart(void); 58 59 // Simple data retrieval: GetType(void)60 PartType & GetType(void) {return partitionType;} 61 uint16_t GetHexType(void) const; 62 string GetTypeName(void); 63 UnicodeString GetUTypeName(void); GetUniqueGUID(void)64 const GUIDData GetUniqueGUID(void) const {return uniqueGUID;} GetFirstLBA(void)65 uint64_t GetFirstLBA(void) const {return firstLBA;} GetLastLBA(void)66 uint64_t GetLastLBA(void) const {return lastLBA;} 67 uint64_t GetLengthLBA(void) const; GetAttributes(void)68 Attributes GetAttributes(void) {return attributes;} ShowAttributes(uint32_t partNum)69 void ShowAttributes(uint32_t partNum) {attributes.ShowAttributes(partNum);} 70 UnicodeString GetDescription(void); 71 int IsUsed(void); 72 int IsSizedForMBR(void); 73 74 // Simple data assignment: 75 void SetType(PartType t); SetType(uint16_t hex)76 void SetType(uint16_t hex) {partitionType = hex;} SetUniqueGUID(GUIDData u)77 void SetUniqueGUID(GUIDData u) {uniqueGUID = u;} RandomizeUniqueGUID(void)78 void RandomizeUniqueGUID(void) {uniqueGUID.Randomize();} SetFirstLBA(uint64_t f)79 void SetFirstLBA(uint64_t f) {firstLBA = f;} SetLastLBA(uint64_t l)80 void SetLastLBA(uint64_t l) {lastLBA = l;} SetAttributes(uint64_t a)81 void SetAttributes(uint64_t a) {attributes = a;} SetAttributes(void)82 void SetAttributes(void) {attributes.ChangeAttributes();} 83 void SetName(const string & theName); 84 #ifdef USE_UTF16 85 void SetName(const UnicodeString & theName); 86 #endif 87 void SetDefaultDescription(void); 88 89 // Additional functions 90 GPTPart & operator=(const GPTPart & orig); 91 bool operator<(const GPTPart &other) const; 92 void ShowSummary(int partNum, uint32_t blockSize); // display summary information (1-line) 93 void ShowDetails(uint32_t blockSize); // display detailed information (multi-line) 94 void BlankPartition(void); // empty partition of data 95 int DoTheyOverlap(const GPTPart & other); // returns 1 if there's overlap 96 void ReversePartBytes(void); // reverse byte order of all integer fields 97 98 // Functions requiring user interaction 99 void ChangeType(void); // Change the type code 100 }; // struct GPTPart 101 102 #endif 103