diff options
author | srs5694 <srs5694@users.sourceforge.net> | 2011-03-01 22:03:26 -0500 |
---|---|---|
committer | srs5694 <srs5694@users.sourceforge.net> | 2011-03-01 22:03:26 -0500 |
commit | f2efa7defc5db19ede49ac4a7dc298eaf47c8ac0 (patch) | |
tree | 6ba5c0461e32ca58600920ca73d3387994e91c5d /basicmbr.h | |
parent | df9d363d341a0ffdd05250fd4ffb842f59815690 (diff) | |
download | sgdisk-f2efa7defc5db19ede49ac4a7dc298eaf47c8ac0.tar.gz |
New files
Diffstat (limited to 'basicmbr.h')
-rw-r--r-- | basicmbr.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/basicmbr.h b/basicmbr.h new file mode 100644 index 0000000..d758994 --- /dev/null +++ b/basicmbr.h @@ -0,0 +1,142 @@ +/* basicmbr.h -- MBR data structure definitions, types, and functions */ + +/* This program is copyright (c) 2009 by Roderick W. Smith. It is distributed + under the terms of the GNU GPL version 2, as detailed in the COPYING file. */ + +#include <stdint.h> +#include <sys/types.h> +#include "partnotes.h" +#include "diskio.h" + +#ifndef __BASICMBRSTRUCTS +#define __BASICMBRSTRUCTS + +#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; + +/**************************************** + * * + * MBRData class and related structures * + * * + ****************************************/ + +// 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 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 +public: + BasicMBRData(void); + BasicMBRData(string deviceFilename); + ~BasicMBRData(void); + BasicMBRData & operator=(const BasicMBRData & orig); + + // 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;} + void SetBlockSize(uint32_t bs) {blockSize = bs;} + 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); + + // 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 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); + 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); + + // 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); +}; // struct BasicMBRData + +#endif |