blob: f5892e77947e9f31031e9020a876b9332adbdb0a [file] [log] [blame]
srs569496312232011-03-12 01:22:42 -05001/*
2 MBRPart class, part of GPT fdisk program family.
3 Copyright (C) 2011 Roderick W. Smith
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*/
19
20#ifndef MBRPART_H
21#define MBRPART_H
22
23#include <stdint.h>
24
25#define MAX_HEADS 255 /* numbered 0 - 254 */
26#define MAX_SECSPERTRACK 63 /* numbered 1 - 63 */
27#define MAX_CYLINDERS 1024 /* numbered 0 - 1023 */
28
29#define NONE 0 /* don't include partition when writing */
30#define PRIMARY 1 /* write partition as primary */
31#define LOGICAL 2 /* write partition as logical */
32#define EBR 4 /* sector is used as an EBR or MBR */
33#define INVALID 8 /* sector number is too large for disk */
34
35using namespace std;
36
37// Data for a single MBR partition record
38// Note that firstSector and lastSector are in CHS addressing, which
39// splits the bits up in a weird way.
40// On read or write of MBR entries, firstLBA is an absolute disk sector.
41// On read of logical entries, it's relative to the EBR record for that
42// partition. When writing EBR records, it's relative to the extended
43// partition's start.
44#pragma pack(1)
45struct MBRRecord {
46 uint8_t status;
47 uint8_t firstSector[3];
48 uint8_t partitionType;
49 uint8_t lastSector[3];
50 uint32_t firstLBA; // see above
51 uint32_t lengthLBA;
52}; // struct MBRRecord
53
54class MBRPart {
55protected:
56 uint8_t status;
57 uint8_t firstSector[3];
58 uint8_t partitionType;
59 uint8_t lastSector[3];
60 uint32_t firstLBA; // see above
61 uint32_t lengthLBA;
62 int includeAs; // PRIMARY, LOGICAL, or NONE
63 int canBeLogical;
64 int canBePrimary;
65 static uint32_t numHeads;
66 static uint32_t numSecspTrack;
67 static uint64_t diskSize;
68 static uint32_t blockSize;
69 static int numInstances;
70
71public:
72 MBRPart();
73 MBRPart(const MBRPart& other);
74 virtual ~MBRPart();
75 virtual MBRPart& operator=(const MBRPart& orig);
76 virtual MBRPart& operator=(const struct MBRRecord& orig);
srs5694c2f6e0c2011-03-16 02:42:33 -040077 bool operator<(const MBRPart &other) const;
srs569496312232011-03-12 01:22:42 -050078
79 // Set information on partitions or disks...
srs5694a17fe692011-09-10 20:30:20 -040080 void SetGeometry(uint32_t heads, uint32_t sectors, uint64_t ds, uint32_t bs);
srs569496312232011-03-12 01:22:42 -050081 void Empty(void);
82 void SetStartLBA(uint64_t s);
83 void SetLengthLBA(uint64_t l);
84 void SetLocation(uint64_t start, uint64_t length);
85 int SetType(uint8_t typeCode, int isExtended = 0);
86 void SetStatus(uint8_t s) {status = s;}
87 void SetInclusion(int status = PRIMARY) {includeAs = status;}
88 void SetCanBeLogical(int c) {canBeLogical = c;}
89 void SetCanBePrimary(int c) {canBePrimary = c;}
90 void StoreInStruct(struct MBRRecord *theStruct);
91
92 // Get information on partitions or disk....
93 uint8_t GetType(void) {return partitionType;}
94 uint8_t GetStatus(void) {return status;}
95 uint64_t GetStartLBA(void) {return firstLBA;}
96 uint64_t GetLengthLBA(void) {return lengthLBA;}
97 uint64_t GetLastLBA(void) const;
98 uint8_t GetInclusion(void) {return includeAs;}
99 int CanBeLogical(void) {return canBeLogical;}
100 int CanBePrimary(void) {return canBePrimary;}
101 int DoTheyOverlap (const MBRPart& other);
102
103 // Adjust information on partitions or disks...
srs5694a17fe692011-09-10 20:30:20 -0400104 int RecomputeCHS(void);
srs569496312232011-03-12 01:22:42 -0500105 int LBAtoCHS(uint32_t lba, uint8_t * chs);
106 void ReverseByteOrder(void);
107
108 // User I/O...
109 void ShowData(int isGpt);
110}; // MBRPart
111
112#endif // MBRPART_H