You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.7 KiB
103 lines
3.7 KiB
//
|
|
// C++ Interface: gptpart
|
|
//
|
|
// Description: Class to implement a single GPT partition
|
|
//
|
|
//
|
|
// Author: Rod Smith <rodsmith@rodsbooks.com>, (C) 2009
|
|
//
|
|
// Copyright: See COPYING file that comes with this distribution
|
|
//
|
|
//
|
|
// This program is copyright (c) 2009 by Roderick W. Smith. It is distributed
|
|
// under the terms of the GNU GPL version 2, as detailed in the COPYING file.
|
|
|
|
#ifndef __GPTPART_H
|
|
#define __GPTPART_H
|
|
|
|
#include <stdint.h>
|
|
#include <string>
|
|
#include <sys/types.h>
|
|
#include "support.h"
|
|
#include "parttypes.h"
|
|
#include "guid.h"
|
|
#include "attributes.h"
|
|
|
|
using namespace std;
|
|
|
|
// Values returned by GPTPart::IsSizedForMBR()
|
|
#define MBR_SIZED_GOOD 0 /* Whole partition under 2^32 sectors */
|
|
#define MBR_SIZED_IFFY 1 /* Partition starts under 2^32 & is less than 2^32, but ends over 2^32 */
|
|
#define MBR_SIZED_BAD 2 /* Partition starts over 2^32, is bigger than 2^32, or otherwise bad */
|
|
|
|
/****************************************
|
|
* *
|
|
* GPTPart class and related structures *
|
|
* *
|
|
****************************************/
|
|
|
|
class GPTPart {
|
|
protected:
|
|
// Caution: The non-static data in GPTPart is precisely the right size
|
|
// to enable easy loading of the data directly from disk. If any
|
|
// non-static variables are added to the below, the data size will
|
|
// change and the program will stop working. This can be corrected by
|
|
// adjusting the data-load operation in GPTData::LoadMainTable() and
|
|
// GPTData::LoadSecondTableAsMain() and then removing the GPTPart
|
|
// size check in SizesOK() (in gpt.cc file).
|
|
PartType partitionType;
|
|
GUIDData uniqueGUID;
|
|
uint64_t firstLBA;
|
|
uint64_t lastLBA;
|
|
Attributes attributes;
|
|
uint16_t name[NAME_SIZE];
|
|
public:
|
|
GPTPart(void);
|
|
GPTPart(const GPTPart &);
|
|
~GPTPart(void);
|
|
|
|
// Simple data retrieval:
|
|
PartType & GetType(void) {return partitionType;}
|
|
uint16_t GetHexType(void) const;
|
|
string GetTypeName(void);
|
|
UnicodeString GetUTypeName(void);
|
|
const GUIDData GetUniqueGUID(void) const {return uniqueGUID;}
|
|
uint64_t GetFirstLBA(void) const {return firstLBA;}
|
|
uint64_t GetLastLBA(void) const {return lastLBA;}
|
|
uint64_t GetLengthLBA(void) const;
|
|
Attributes GetAttributes(void) {return attributes;}
|
|
void ShowAttributes(uint32_t partNum) {attributes.ShowAttributes(partNum);}
|
|
UnicodeString GetDescription(void);
|
|
int IsUsed(void);
|
|
int IsSizedForMBR(void);
|
|
|
|
// Simple data assignment:
|
|
void SetType(PartType t);
|
|
void SetType(uint16_t hex) {partitionType = hex;}
|
|
void SetUniqueGUID(GUIDData u) {uniqueGUID = u;}
|
|
void RandomizeUniqueGUID(void) {uniqueGUID.Randomize();}
|
|
void SetFirstLBA(uint64_t f) {firstLBA = f;}
|
|
void SetLastLBA(uint64_t l) {lastLBA = l;}
|
|
void SetAttributes(uint64_t a) {attributes = a;}
|
|
void SetAttributes(void) {attributes.ChangeAttributes();}
|
|
void SetName(const string & theName);
|
|
#ifdef USE_UTF16
|
|
void SetName(const UnicodeString & theName);
|
|
#endif
|
|
void SetDefaultDescription(void);
|
|
|
|
// Additional functions
|
|
GPTPart & operator=(const GPTPart & orig);
|
|
bool operator<(const GPTPart &other) const;
|
|
void ShowSummary(int partNum, uint32_t blockSize); // display summary information (1-line)
|
|
void ShowDetails(uint32_t blockSize); // display detailed information (multi-line)
|
|
void BlankPartition(void); // empty partition of data
|
|
int DoTheyOverlap(const GPTPart & other); // returns 1 if there's overlap
|
|
void ReversePartBytes(void); // reverse byte order of all integer fields
|
|
|
|
// Functions requiring user interaction
|
|
void ChangeType(void); // Change the type code
|
|
}; // struct GPTPart
|
|
|
|
#endif
|