Home | History | Annotate | Download | only in gptfdisk
      1 /* basicmbr.h -- MBR data structure definitions, types, and functions */
      2 
      3 /* This program is copyright (c) 2009-2013 by Roderick W. Smith. It is distributed
      4   under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
      5 
      6 #include <stdint.h>
      7 #include <sys/types.h>
      8 #include "diskio.h"
      9 #include "mbrpart.h"
     10 
     11 #ifndef __BASICMBRSTRUCTS
     12 #define __BASICMBRSTRUCTS
     13 
     14 #define MBR_SIGNATURE UINT16_C(0xAA55)
     15 
     16 // Maximum number of MBR partitions
     17 #define MAX_MBR_PARTS 128
     18 
     19 using namespace std;
     20 
     21 /****************************************
     22  *                                      *
     23  * MBRData class and related structures *
     24  *                                      *
     25  ****************************************/
     26 
     27 // A 512-byte data structure into which the MBR can be loaded in one
     28 // go. Also used when loading logical partitions.
     29 #pragma pack(1)
     30 struct TempMBR {
     31    uint8_t code[440];
     32    uint32_t diskSignature;
     33    uint16_t nulls;
     34    struct MBRRecord partitions[4];
     35    uint16_t MBRSignature;
     36 }; // struct TempMBR
     37 
     38 // Possible states of the MBR
     39 enum MBRValidity {invalid, gpt, hybrid, mbr};
     40 
     41 // Full data in tweaked MBR format
     42 class BasicMBRData {
     43 protected:
     44    uint8_t code[440];
     45    uint32_t diskSignature;
     46    uint16_t nulls;
     47    // MAX_MBR_PARTS defaults to 128. This array holds both the primary and
     48    // the logical partitions, to simplify data retrieval for GPT conversions.
     49    MBRPart partitions[MAX_MBR_PARTS];
     50    uint16_t MBRSignature;
     51 
     52    // Above are basic MBR data; now add more stuff....
     53    uint32_t blockSize; // block size (usually 512)
     54    uint64_t diskSize; // size in blocks
     55    uint32_t numHeads; // number of heads, in CHS scheme
     56    uint32_t numSecspTrack; // number of sectors per track, in CHS scheme
     57    DiskIO* myDisk;
     58    int canDeleteMyDisk;
     59    string device;
     60    MBRValidity state;
     61    MBRPart* GetPartition(int i); // Return primary or logical partition
     62 public:
     63    BasicMBRData(void);
     64    BasicMBRData(string deviceFilename);
     65    ~BasicMBRData(void);
     66    BasicMBRData & operator=(const BasicMBRData & orig);
     67 
     68    // File I/O functions...
     69    int ReadMBRData(const string & deviceFilename);
     70    int ReadMBRData(DiskIO * theDisk, int checkBlockSize = 1);
     71    int ReadLogicalParts(uint64_t extendedStart, int partNum);
     72    int WriteMBRData(void);
     73    int WriteMBRData(DiskIO *theDisk);
     74    int WriteMBRData(const string & deviceFilename);
     75    int WriteMBRData(struct TempMBR & mbr, DiskIO *theDisk, uint64_t sector);
     76    void DiskSync(void) {myDisk->DiskSync();}
     77    void SetDisk(DiskIO *theDisk);
     78 
     79    // Display data for user...
     80    void DisplayMBRData(void);
     81    void ShowState(void);
     82 
     83    // GPT checks and fixes...
     84    int CheckForGPT(void);
     85    int BlankGPTData(void);
     86 
     87    // Functions that set or get disk metadata (size, CHS geometry, etc.)
     88    void SetDiskSize(uint64_t ds) {diskSize = ds;}
     89    void SetBlockSize(uint32_t bs) {blockSize = bs;}
     90    MBRValidity GetValidity(void) {return state;}
     91    void SetHybrid(void) {state = hybrid;} // Set hybrid flag
     92    void ReadCHSGeom(void);
     93    int GetPartRange(uint32_t* low, uint32_t* high);
     94    int LBAtoCHS(uint64_t lba, uint8_t * chs); // Convert LBA to CHS
     95    int FindOverlaps(void);
     96    int NumPrimaries(void);
     97    int NumLogicals(void);
     98    int CountParts(void);
     99    void UpdateCanBeLogical(void);
    100    uint64_t FirstLogicalLBA(void);
    101    uint64_t LastLogicalLBA(void);
    102    int AreLogicalsContiguous(void);
    103    int DoTheyFit(void);
    104    int SpaceBeforeAllLogicals(void);
    105    int IsLegal(void);
    106    int IsEEActive(void);
    107    int FindNextInUse(int start);
    108 
    109    // Functions to create, delete, or change partitions
    110    // Pass EmptyMBR 1 to clear the boot loader code, 0 to leave it intact
    111    void EmptyMBR(int clearBootloader = 1);
    112    void EmptyBootloader(void);
    113    void AddPart(int num, const MBRPart& newPart);
    114    void MakePart(int num, uint64_t startLBA, uint64_t lengthLBA, int type = 0x07,
    115                  int bootable = 0);
    116    int SetPartType(int num, int type);
    117    int SetPartBootable(int num, int bootable = 1);
    118    int MakeBiggestPart(int i, int type); // Make partition filling most space
    119    void DeletePartition(int i);
    120    int SetInclusionwChecks(int num, int inclStatus);
    121    void RecomputeCHS(int partNum);
    122    void SortMBR(int start = 0);
    123    int DeleteOversizedParts();
    124    int DeleteExtendedParts();
    125    void OmitOverlaps(void);
    126    void MaximizeLogicals();
    127    void MaximizePrimaries();
    128    void TrimPrimaries();
    129    void MakeLogicalsContiguous(void);
    130    void MakeItLegal(void);
    131    int RemoveLogicalsFromFirstFour(void);
    132    int MovePrimariesToFirstFour(void);
    133    int CreateExtended(void);
    134 
    135    // Functions to find information on free space....
    136    uint64_t FindFirstAvailable(uint64_t start = 1);
    137    uint64_t FindLastInFree(uint64_t start);
    138    uint64_t FindFirstInFree(uint64_t start);
    139    int SectorUsedAs(uint64_t sector, int topPartNum = MAX_MBR_PARTS);
    140 
    141    // Functions to extract data on specific partitions....
    142    uint8_t GetStatus(int i);
    143    uint8_t GetType(int i);
    144    uint64_t GetFirstSector(int i);
    145    uint64_t GetLength(int i);
    146 
    147    // User interaction functions....
    148    int DoMenu(const string& prompt = "\nMBR command (? for help): ");
    149    void ShowCommands(void);
    150 }; // class BasicMBRData
    151 
    152 #endif
    153