summaryrefslogtreecommitdiff
path: root/mbr.h
diff options
context:
space:
mode:
authorsrs5694 <srs5694@users.sourceforge.net>2009-08-18 13:16:10 -0400
committersrs5694 <srs5694@users.sourceforge.net>2009-08-18 13:16:10 -0400
commite7b4ff9317fc4e551cf974684eaa88697de5a28d (patch)
tree5b5cc2b2fdce62960d03ad537f151df8c581902e /mbr.h
downloadsgdisk-e7b4ff9317fc4e551cf974684eaa88697de5a28d.tar.gz
Initial git repository creation, version 0.3.1 plus changes
Diffstat (limited to 'mbr.h')
-rw-r--r--mbr.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/mbr.h b/mbr.h
new file mode 100644
index 0000000..86f792b
--- /dev/null
+++ b/mbr.h
@@ -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