gptpart.h revision 699941e25a1fcf0beec124203747c8ed20842989
1a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs//
2a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs// C++ Interface: gptpart
3a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs//
4a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs// Description: Class to implement a single GPT partition
5a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs//
6a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs//
7a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs// Author: Rod Smith <rodsmith@rodsbooks.com>, (C) 2009
8a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs//
9a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs// Copyright: See COPYING file that comes with this distribution
10a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs//
11a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs//
12978041ca613dcb881763b36cf53639d924e52a56srs// This program is copyright (c) 2009 by Roderick W. Smith. It is distributed
13978041ca613dcb881763b36cf53639d924e52a56srs// under the terms of the GNU GPL version 2, as detailed in the COPYING file.
14a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
15a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs#ifndef __GPTPART_H
16a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs#define __GPTPART_H
17a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
18a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs#include <stdint.h>
19546a9c7c369df465021feecb20f6a8f81b6df6bcsrs#include <string>
20a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs#include <sys/types.h>
21a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs#include "support.h"
22a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs#include "parttypes.h"
236699b01eda84d24bfaf80ad725304fef2b0e1b2asrs#include "guid.h"
240873e9d0e9345a2c4418b4718db525c9f1111c83srs#include "attributes.h"
25a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
26a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrsusing namespace std;
27a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
28978041ca613dcb881763b36cf53639d924e52a56srs/****************************************
29978041ca613dcb881763b36cf53639d924e52a56srs *                                      *
30978041ca613dcb881763b36cf53639d924e52a56srs * GPTPart class and related structures *
31978041ca613dcb881763b36cf53639d924e52a56srs *                                      *
32978041ca613dcb881763b36cf53639d924e52a56srs ****************************************/
33a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
34a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrsclass GPTPart {
35a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs   protected:
36ba00fed2efd6c0cba60da9afb0ce3dff84fc69f9srs      // Caution: The non-static data in GPTPart is precisely the right size
37a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      // to enable easy loading of the data directly from disk. If any
38a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      // non-static variables are added to the below, the data size will
39a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      // change and the program will stop working. This can be corrected by
40a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      // adjusting the data-load operation in GPTData::LoadMainTable() and
41ba00fed2efd6c0cba60da9afb0ce3dff84fc69f9srs      // GPTData::LoadSecondTableAsMain() and then removing the GPTPart
42ba00fed2efd6c0cba60da9afb0ce3dff84fc69f9srs      // size check in SizesOK() (in gpt.cc file).
436699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      PartType partitionType;
446699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      GUIDData uniqueGUID;
45a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      uint64_t firstLBA;
46a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      uint64_t lastLBA;
470873e9d0e9345a2c4418b4718db525c9f1111c83srs      Attributes attributes;
48a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      unsigned char name[NAME_SIZE];
49a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs   public:
50a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      GPTPart(void);
51a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      ~GPTPart(void);
52a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
53a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      // Simple data retrieval:
546699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      PartType & GetType(void) {return partitionType;}
55bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs      uint16_t GetHexType(void) const;
566699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      string GetTypeName(void);
575a6085310b7f8fe1c35e56bcab7de161808b488dsrs      UnicodeString GetUTypeName(void);
585a081757ea2e32a491349544fea92826ccf739f6srs      const GUIDData GetUniqueGUID(void) const {return uniqueGUID;}
595a081757ea2e32a491349544fea92826ccf739f6srs      uint64_t GetFirstLBA(void) const {return firstLBA;}
605a081757ea2e32a491349544fea92826ccf739f6srs      uint64_t GetLastLBA(void) const {return lastLBA;}
61bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs      uint64_t GetLengthLBA(void) const;
620873e9d0e9345a2c4418b4718db525c9f1111c83srs      Attributes GetAttributes(void) {return attributes;}
630873e9d0e9345a2c4418b4718db525c9f1111c83srs      void ShowAttributes(uint32_t partNum) {attributes.ShowAttributes(partNum);}
645a6085310b7f8fe1c35e56bcab7de161808b488dsrs      UnicodeString GetDescription(void);
6508bb0da07953af605b4918e268272de15ac151aasrs      int IsUsed(void);
66a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
67a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      // Simple data assignment:
686699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      void SetType(PartType t);
696699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      void SetType(uint16_t hex) {partitionType = hex;}
706699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      void SetUniqueGUID(GUIDData u) {uniqueGUID = u;}
716699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      void RandomizeUniqueGUID(void) {uniqueGUID.Randomize();}
72a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      void SetFirstLBA(uint64_t f) {firstLBA = f;}
73a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      void SetLastLBA(uint64_t l) {lastLBA = l;}
74a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      void SetAttributes(uint64_t a) {attributes = a;}
750873e9d0e9345a2c4418b4718db525c9f1111c83srs      void SetAttributes(void) {attributes.ChangeAttributes();}
76699941e25a1fcf0beec124203747c8ed20842989srs      void SetName(const string & theName);
77699941e25a1fcf0beec124203747c8ed20842989srs#ifndef _WIN32
78699941e25a1fcf0beec124203747c8ed20842989srs      void SetName(const UnicodeString & theName);
79699941e25a1fcf0beec124203747c8ed20842989srs#endif
806699b01eda84d24bfaf80ad725304fef2b0e1b2asrs      void SetDefaultDescription(void);
81a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
82a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      // Additional functions
83a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      GPTPart & operator=(const GPTPart & orig);
849a46b042c57144c26a67781d335e6ba4128382d2srs      bool operator<(const GPTPart &other) const;
85978041ca613dcb881763b36cf53639d924e52a56srs      void ShowSummary(int partNum, uint32_t blockSize); // display summary information (1-line)
86a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      void ShowDetails(uint32_t blockSize); // display detailed information (multi-line)
87a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      void BlankPartition(void); // empty partition of data
880a6973119c9e9984ad47a6da3231e8d16f996c5csrs      int DoTheyOverlap(const GPTPart & other); // returns 1 if there's overlap
89a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      void ReversePartBytes(void); // reverse byte order of all integer fields
90a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
91a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      // Functions requiring user interaction
92a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs      void ChangeType(void); // Change the type code
93a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs}; // struct GPTPart
94a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs
95a0eb11a64b4a5b78caff58f804a5fb78ddf3a5dfsrs#endif
96