diff --git a/NEWS b/NEWS index a4faeb1..d61cb41 100644 --- a/NEWS +++ b/NEWS @@ -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): ----------------- diff --git a/basicmbr.cc b/basicmbr.cc index 7483734..080de76 100644 --- a/basicmbr.cc +++ b/basicmbr.cc @@ -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) { diff --git a/basicmbr.h b/basicmbr.h index 1a79856..d38f963 100644 --- a/basicmbr.h +++ b/basicmbr.h @@ -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 diff --git a/gpt.cc b/gpt.cc index f571ad7..afe6ab2 100644 --- a/gpt.cc +++ b/gpt.cc @@ -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(); diff --git a/support.h b/support.h index bf60fd5..53e6405 100644 --- a/support.h +++ b/support.h @@ -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