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