diff options
author | srs5694 <srs5694@users.sourceforge.net> | 2009-08-18 13:16:10 -0400 |
---|---|---|
committer | srs5694 <srs5694@users.sourceforge.net> | 2009-08-18 13:16:10 -0400 |
commit | e7b4ff9317fc4e551cf974684eaa88697de5a28d (patch) | |
tree | 5b5cc2b2fdce62960d03ad537f151df8c581902e /mbr.h | |
download | sgdisk-e7b4ff9317fc4e551cf974684eaa88697de5a28d.tar.gz |
Initial git repository creation, version 0.3.1 plus changes
Diffstat (limited to 'mbr.h')
-rw-r--r-- | mbr.h | 95 |
1 files changed, 95 insertions, 0 deletions
@@ -0,0 +1,95 @@ +/* mbr.h -- MBR data structure definitions, types, and functions */ + +#include <stdint.h> +#include <sys/types.h> +#include <sys/ioctl.h> + +#ifndef __MBRSTRUCTS +#define __MBRSTRUCTS + +#define MBR_SIGNATURE UINT16_C(0xAA55) + +// Maximum number of logical partitions supported +#define NUM_LOGICALS 124 + +using namespace std; + +/**************************************** + * * + * 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. +struct MBRRecord { + uint8_t status; + uint8_t firstSector[3]; + uint8_t partitionType; + uint8_t lastSector[3]; + uint32_t firstLBA; + uint32_t lengthLBA; +}; // struct MBRRecord + +// Extended Boot Record (EBR) data, used to hold one logical partition's +// data within an extended partition. Includes pointer to next record for +// in-memory linked-list access. This is similar to MBRData, but with a +// few tweaks.... +struct EBRRecord { + uint8_t code[446]; // generally 0s (and we don't care if they aren't) + // First partition entry defines partition; second points to next + // entry in on-disk linked list; remaining two are unused. Note that + // addresses are relative to the extended partition, not to the disk + // as a whole. + struct MBRRecord partitions[4]; + uint16_t MBRSignature; +}; // struct EBRRecord + +// Possible states of the MBR +enum MBRValidity {invalid, gpt, hybrid, mbr}; + +// Full data in tweaked MBR format +class MBRData { +protected: + uint8_t code[440]; + uint32_t diskSignature; + uint16_t nulls; + struct MBRRecord partitions[4]; + 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 + char device[256]; + // Now an array of partitions for the logicals, in array form (easier + // than a linked list, and good enough for the GPT itself, so....) + struct MBRRecord logicals[NUM_LOGICALS]; + MBRValidity state; + struct MBRRecord* GetPartition(int i); // Return primary or logical partition +public: + MBRData(void); + MBRData(char* deviceFilename); + ~MBRData(void); + void EmptyMBR(void); + int ReadMBRData(char* deviceFilename); + void ReadMBRData(int fd); + int WriteMBRData(void); + void WriteMBRData(int fd); + int ReadLogicalPart(int fd, uint32_t extendedStart, uint32_t diskOffset, + int partNum); + void DisplayMBRData(void); + void MakeProtectiveMBR(void); + MBRValidity GetValidity(void) {return state;} + void ShowState(void); + void MakePart(int num, uint32_t startLBA, uint32_t lengthLBA, int type = 0x07, + int bootable = 0); + + // 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 MBRData + +#endif |