summaryrefslogtreecommitdiff
path: root/basicmbr.h
diff options
context:
space:
mode:
authorsrs5694 <srs5694@users.sourceforge.net>2011-03-01 22:03:26 -0500
committersrs5694 <srs5694@users.sourceforge.net>2011-03-01 22:03:26 -0500
commitf2efa7defc5db19ede49ac4a7dc298eaf47c8ac0 (patch)
tree6ba5c0461e32ca58600920ca73d3387994e91c5d /basicmbr.h
parentdf9d363d341a0ffdd05250fd4ffb842f59815690 (diff)
downloadsgdisk-f2efa7defc5db19ede49ac4a7dc298eaf47c8ac0.tar.gz
New files
Diffstat (limited to 'basicmbr.h')
-rw-r--r--basicmbr.h142
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