diff --git a/src/drive.c b/src/drive.c index 15310495..14da117d 100644 --- a/src/drive.c +++ b/src/drive.c @@ -664,7 +664,7 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys PDRIVE_LAYOUT_INFORMATION_EX DriveLayout = (PDRIVE_LAYOUT_INFORMATION_EX)(void*)layout; char* volume_name; char tmp[256]; - DWORD i, j; + DWORD i, j, big_floppy = FALSE; if (FileSystemName == NULL) return FALSE; @@ -725,16 +725,23 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys SelectedDrive.nPartitions++; } } - suprintf("Partition type: MBR, NB Partitions: %d\n", SelectedDrive.nPartitions); - SelectedDrive.has_mbr_uefi_marker = (DriveLayout->Mbr.Signature == MBR_UEFI_MARKER); - suprintf("Disk ID: 0x%08X %s\n", DriveLayout->Mbr.Signature, SelectedDrive.has_mbr_uefi_marker?"(UEFI target)":""); - AnalyzeMBR(hPhysical, "Drive"); + // Detect drives that are using the whole disk as a single partition + if ((DriveLayout->PartitionEntry[0].Mbr.PartitionType != PARTITION_ENTRY_UNUSED) && + (DriveLayout->PartitionEntry[0].StartingOffset.QuadPart == 0LL)) { + suprintf("Partition type: BFD (Big Floppy Disk)"); + big_floppy = TRUE; + } else { + suprintf("Partition type: MBR, NB Partitions: %d\n", SelectedDrive.nPartitions); + SelectedDrive.has_mbr_uefi_marker = (DriveLayout->Mbr.Signature == MBR_UEFI_MARKER); + suprintf("Disk ID: 0x%08X %s\n", DriveLayout->Mbr.Signature, SelectedDrive.has_mbr_uefi_marker ? "(UEFI target)" : ""); + AnalyzeMBR(hPhysical, "Drive"); + } for (i=0; iPartitionCount; i++) { if (DriveLayout->PartitionEntry[i].Mbr.PartitionType != PARTITION_ENTRY_UNUSED) { part_type = DriveLayout->PartitionEntry[i].Mbr.PartitionType; isUefiNtfs = (i == 1) && (part_type == 0xef) && (DriveLayout->PartitionEntry[i].PartitionLength.QuadPart <= 1*MB); - suprintf("Partition %d%s:\n", i+1, isUefiNtfs?" (UEFI:NTFS)":""); + suprintf("Partition %d%s:\n", i+(big_floppy?0:1), isUefiNtfs?" (UEFI:NTFS)":""); for (j=0; jPartitionEntry[i].PartitionLength.QuadPart, TRUE, FALSE), DriveLayout->PartitionEntry[i].PartitionLength.QuadPart, DriveLayout->PartitionEntry[i].StartingOffset.QuadPart / SelectedDrive.SectorSize, - DriveLayout->PartitionEntry[i].Mbr.BootIndicator?"Yes":"No", - DriveLayout->PartitionEntry[i].Mbr.RecognizedPartition?"Yes":"No"); + DriveLayout->PartitionEntry[i].Mbr.BootIndicator?"Yes":"No"); SelectedDrive.FirstDataSector = min(SelectedDrive.FirstDataSector, (DWORD)(DriveLayout->PartitionEntry[i].StartingOffset.QuadPart / SelectedDrive.SectorSize)); if ((part_type == RUFUS_EXTRA_PARTITION_TYPE) || (isUefiNtfs)) diff --git a/src/format.c b/src/format.c index 0473df18..3d163ab7 100644 --- a/src/format.c +++ b/src/format.c @@ -826,6 +826,10 @@ static BOOL ClearMBRGPT(HANDLE hPhysicalDrive, LONGLONG DiskSize, DWORD SectorSi // with GPT drives that contain a lot of small partitions) we try not not to clear // sectors further than the lowest partition already residing on the disk. num_sectors_to_clear = min(SelectedDrive.FirstDataSector, (DWORD)((add1MB ? 2048 : 0) + MAX_SECTORS_TO_CLEAR)); + // Special case for big floppy disks (FirstDataSector = 0) + if (num_sectors_to_clear < 4) + num_sectors_to_clear = (DWORD)((add1MB ? 2048 : 0) + MAX_SECTORS_TO_CLEAR); + uprintf("Erasing %d sectors", num_sectors_to_clear); for (i=0; i