diff options
author | srs5694 <srs5694@users.sourceforge.net> | 2011-03-01 22:03:54 -0500 |
---|---|---|
committer | srs5694 <srs5694@users.sourceforge.net> | 2011-03-01 22:03:54 -0500 |
commit | 64cbd171067eb34054741bfcd73f0b91d727a371 (patch) | |
tree | b5964f8b2476429a45a683937d434c2278ca63b2 /mbr.h | |
parent | f2efa7defc5db19ede49ac4a7dc298eaf47c8ac0 (diff) | |
download | sgdisk-64cbd171067eb34054741bfcd73f0b91d727a371.tar.gz |
Misc. bug fixes & restructuring.
Diffstat (limited to 'mbr.h')
-rw-r--r-- | mbr.h | 118 |
1 files changed, 9 insertions, 109 deletions
@@ -6,23 +6,16 @@ #include <stdint.h> #include <sys/types.h> #include "gptpart.h" -#include "partnotes.h" +//#include "partnotes.h" #include "diskio.h" +#include "basicmbr.h" #ifndef __MBRSTRUCTS #define __MBRSTRUCTS -#define MBR_SIGNATURE UINT16_C(0xAA55) -#define MAX_HEADS 255 /* numbered 0 - 254 */ -#define MAX_SECSPERTRACK 63 /* numbered 1 - 63 */ -#define MAX_CYLINDERS 1024 /* numbered 0 - 1023 */ - -// Maximum number of MBR partitions -#define MAX_MBR_PARTS 128 - using namespace std; -class PartNotes; +// class PartNotes; /**************************************** * * @@ -30,115 +23,22 @@ class PartNotes; * * ****************************************/ -// Data for a single MBR partition record -// Note that firstSector and lastSector are in CHS addressing, which -// splits the bits up in a weird way. -// On read or write of MBR entries, firstLBA is an absolute disk sector. -// On read of logical entries, it's relative to the EBR record for that -// partition. When writing EBR records, it's relative to the extended -// partition's start. -#pragma pack(1) -struct MBRRecord { - uint8_t status; - uint8_t firstSector[3]; - uint8_t partitionType; - uint8_t lastSector[3]; - uint32_t firstLBA; // see above - uint32_t lengthLBA; -}; // struct MBRRecord - -// A 512-byte data structure into which the MBR can be loaded in one -// go. Also used when loading logical partitions. -#pragma pack(1) -struct TempMBR { - uint8_t code[440]; - uint32_t diskSignature; - uint16_t nulls; - struct MBRRecord partitions[4]; - uint16_t MBRSignature; -}; // struct TempMBR - -// Possible states of the MBR -enum MBRValidity {invalid, gpt, hybrid, mbr}; - // Full data in tweaked MBR format -class MBRData { +class MBRData : public BasicMBRData { protected: - uint8_t code[440]; - uint32_t diskSignature; - uint16_t nulls; - // MAX_MBR_PARTS defaults to 128. This array holds both the primary and - // the logical partitions, to simplify data retrieval for GPT conversions. - struct MBRRecord partitions[MAX_MBR_PARTS]; - uint16_t MBRSignature; - - // Above are basic MBR data; now add more stuff.... - uint32_t blockSize; // block size (usually 512) - uint64_t diskSize; // size in blocks - uint64_t numHeads; // number of heads, in CHS scheme - uint64_t numSecspTrack; // number of sectors per track, in CHS scheme - DiskIO* myDisk; - int canDeleteMyDisk; - string device; - MBRValidity state; - struct MBRRecord* GetPartition(int i); // Return primary or logical partition + int foo; public: - MBRData(void); - MBRData(string deviceFilename); - ~MBRData(void); - - // File I/O functions... - int ReadMBRData(const string & deviceFilename); - int ReadMBRData(DiskIO * theDisk, int checkBlockSize = 1); - // ReadLogicalPart() returns last partition # read to logicals[] array, - // or -1 if there was a problem.... - int ReadLogicalPart(uint32_t extendedStart, uint32_t diskOffset, - int partNum); - int WriteMBRData(void); - int WriteMBRData(DiskIO *theDisk); - int WriteMBRData(const string & deviceFilename); - int WriteMBRData(struct TempMBR & mbr, DiskIO *theDisk, uint64_t sector); - void SetDisk(DiskIO *theDisk) {myDisk = theDisk; canDeleteMyDisk = 0;} - - // Display data for user... - void DisplayMBRData(int maxParts = 4); - void ShowState(void); - - // Functions that set or get disk metadata (size, CHS geometry, etc.) - void SetDiskSize(uint64_t ds) {diskSize = ds;} - MBRValidity GetValidity(void) {return state;} - void SetHybrid(void) {state = hybrid;} // Set hybrid flag - void SetCHSGeom(uint32_t h, uint32_t s); - int LBAtoCHS(uint64_t lba, uint8_t * chs); // Convert LBA to CHS - int Verify(void); + MBRData(void) {} + MBRData(string deviceFilename) : BasicMBRData(deviceFilename) {} + MBRData & operator=(const MBRData & orig); // Functions to create, delete, or change partitions // Pass EmptyMBR 1 to clear the boot loader code, 0 to leave it intact - void EmptyMBR(int clearBootloader = 1); - void EmptyBootloader(void); void MakeProtectiveMBR(int clearBoot = 0); - void MakePart(int num, uint32_t startLBA, uint32_t lengthLBA, int type = 0x07, - int bootable = 0); - int SetPartType(int num, int type); - int SetPartBootable(int num, int bootable = 1); - int MakeBiggestPart(int i, int type); // Make partition filling most space - void DeletePartition(int i); - int DeleteByLocation(uint64_t start64, uint64_t length64); void OptimizeEESize(void); - void RecomputeCHS(int partNum); - int CreateLogicals(PartNotes * notes); - - // Functions to find information on free space.... - uint32_t FindFirstAvailable(uint32_t start = 1); - uint32_t FindLastInFree(uint32_t start); - uint32_t FindFirstInFree(uint32_t start); - int IsFree(uint32_t sector); + int DeleteByLocation(uint64_t start64, uint64_t length64); // Functions to extract data on specific partitions.... - uint8_t GetStatus(int i); - uint8_t GetType(int i); - uint32_t GetFirstSector(int i); - uint32_t GetLength(int i); GPTPart AsGPT(int i); }; // struct MBRData |