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