Check for boot/active flag on 0xEE protective partition in verify
function.
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 @@
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 @@
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 @@
// 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