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