Check for boot/active flag on 0xEE protective partition in verify

function.
This commit is contained in:
Roderick W. Smith
2013-08-31 17:40:15 -04:00
parent af39cb48d0
commit 042f38a2f7
5 changed files with 27 additions and 2 deletions

5
NEWS
View File

@@ -1,7 +1,10 @@
0.8.8 (?/??/2013):
------------------
- Added check for an active/bootable 0xEE protective partition to the
verify ('v') function. If found, this is not counted as an error, but
it is called out to the user, since it can cause some EFIs (such as
VirtualBox's EFI) to ignore the disk.
0.8.7 (7/8/2013):
-----------------

View File

@@ -921,6 +921,18 @@ int BasicMBRData::IsLegal(void) {
return allOK;
} // BasicMBRData::IsLegal()
// Returns 1 if the 0xEE partition in the protective/hybrid MBR is marked as
// active/bootable.
int BasicMBRData::IsEEActive(void) {
int i, IsActive = FALSE;
for (i = 0; i < MAX_MBR_PARTS; i++) {
if (partitions[i].GetStatus() & 0x80)
IsActive = TRUE;
}
return IsActive;
} // BasicMBRData::IsEEActive()
// Finds the next in-use partition, starting with start (will return start
// if it's in use). Returns -1 if no subsequent partition is in use.
int BasicMBRData::FindNextInUse(int start) {

View File

@@ -103,6 +103,7 @@ public:
int DoTheyFit(void);
int SpaceBeforeAllLogicals(void);
int IsLegal(void);
int IsEEActive(void);
int FindNextInUse(int start);
// Functions to create, delete, or change partitions

9
gpt.cc
View File

@@ -279,6 +279,15 @@ int GPTData::Verify(void) {
// Check for MBR-specific problems....
problems += VerifyMBR();
// Check for a 0xEE protective partition that's marked as active....
if (protectiveMBR.IsEEActive()) {
cout << "\nWarning: The 0xEE protective partition in the MBR is marked as active. This is\n"
<< "technically a violation of the GPT specification, and can cause some EFIs to\n"
<< "ignore the disk, but it is required to boot from a GPT disk on some BIOS-based\n"
<< "computers. You can clear this flag by creating a fresh protective MBR using\n"
<< "the 'n' option on the experts' menu.\n";
}
// Verify that partitions don't run into GPT data areas....
problems += CheckGPTSize();

View File

@@ -8,7 +8,7 @@
#ifndef __GPTSUPPORT
#define __GPTSUPPORT
#define GPTFDISK_VERSION "0.8.7"
#define GPTFDISK_VERSION "0.8.7.1"
#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__)
// Darwin (Mac OS) & FreeBSD: disk IOCTLs are different, and there is no lseek64