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