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