diff --git a/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.h b/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.h index 647e10c6be..56fdc2b913 100644 --- a/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.h +++ b/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.h @@ -75,7 +75,9 @@ struct partition_descriptor { // partition_table struct partition_table { - char code_area[446]; + char code_area[440]; + uint32 disk_id; + uint16 reserved; partition_descriptor table[4]; uint16 signature; diff --git a/src/add-ons/kernel/partitioning_systems/intel/PartitionMapWriter.cpp b/src/add-ons/kernel/partitioning_systems/intel/PartitionMapWriter.cpp index 3b966f8018..3f9be03b3c 100644 --- a/src/add-ons/kernel/partitioning_systems/intel/PartitionMapWriter.cpp +++ b/src/add-ons/kernel/partitioning_systems/intel/PartitionMapWriter.cpp @@ -10,11 +10,14 @@ #include #include -#include #include +#include #include +#include + + #ifndef _USER_MODE # include #endif @@ -134,13 +137,14 @@ PartitionMapWriter::WriteMBR(const PartitionMap* map, bool writeBootCode) return B_BAD_VALUE; partition_table partitionTable; + status_t error = _ReadBlock(0, partitionTable); + if (error != B_OK) + return error; if (writeBootCode) { + // the boot code must be small enough to fit in the code area + STATIC_ASSERT(sizeof(kBootCode) <= sizeof(partitionTable.code_area)); partitionTable.clear_code_area(); partitionTable.fill_code_area(kBootCode, sizeof(kBootCode)); - } else { - status_t error = _ReadBlock(0, partitionTable); - if (error != B_OK) - return error; } partitionTable.signature = kPartitionTableSectorSignature; @@ -152,7 +156,7 @@ PartitionMapWriter::WriteMBR(const PartitionMap* map, bool writeBootCode) partition->GetPartitionDescriptor(descriptor); } - status_t error = _WriteBlock(0, partitionTable); + error = _WriteBlock(0, partitionTable); return error; }