status_t PartitionMapWriter::WriteExtendedHead(const LogicalPartition* logical, const PrimaryPartition* primary, bool clearCode) { if (primary == NULL) return B_BAD_VALUE; partition_table partitionTable; if (clearCode) { partitionTable.clear_code_area(); } else { status_t error = _ReadBlock(primary->Offset(), partitionTable); if (error != B_OK) return error; } partitionTable.signature = kPartitionTableSectorSignature; partition_descriptor* descriptor; if (logical == NULL) { for (int32 i = 0; i < 4; i++) { descriptor = &partitionTable.table[i]; memset(descriptor, 0, sizeof(partition_descriptor)); } } else { LogicalPartition partition; partition.SetPartitionTableOffset(primary->Offset()); partition.SetBlockSize(logical->BlockSize()); partition.SetOffset(logical->Offset()); partition.SetSize(logical->Size()); partition.SetType(logical->Type()); // set the logicals partition table to the correct location descriptor = &partitionTable.table[0]; partition.GetPartitionDescriptor(descriptor); descriptor = &partitionTable.table[1]; LogicalPartition* next = logical->Next(); if (next != NULL) next->GetPartitionDescriptor(descriptor, true); else memset(descriptor, 0, sizeof(partition_descriptor)); // last two descriptors are empty for (int32 i = 2; i < 4; i++) { descriptor = &partitionTable.table[i]; memset(descriptor, 0, sizeof(partition_descriptor)); } } status_t error = _WriteBlock(primary->Offset(), partitionTable); if (error != B_OK) return error; return B_OK; }