bool DiskImagePro::readSector(quint16 sector, QByteArray &data) { if (!seekToSector(sector)) { return false; } QByteArray header; header = sourceFile->read(12); if ((quint8)header[5] != 0) { int dupnum = count[sector]; qDebug() << "!e" << tr("Duplicate sector: %1 dupnum: %2").arg(sector).arg(dupnum); count[sector] = (count[sector]+1) % ((quint8)header[5]+1); if (dupnum != 0) { sector = m_geometry.sectorCount() + (quint8)header[6+dupnum]; /* can dupnum be 5? */ if (dupnum > 4 || sector <= 0 || sector > ((sourceFile->size()-16)/(128+12))) { qCritical() << "!e" << tr("Error in .pro image: sector: %1 dupnum: %2").arg(sector).arg(dupnum); return false; } seekToSector(sector); /* read sector header */ header = sourceFile->read(12); } } wd1772status = header[1]; if (wd1772status != 0xff) { qDebug() << "!e" << tr("Bad sector"); return false; } data = sourceFile->read(m_geometry.bytesPerSector(sector)); if (data.size() != m_geometry.bytesPerSector(sector)) { qCritical() << "!e" << tr("[%1] Cannot read from sector %2: %3.") .arg(deviceName()) .arg(sector) .arg(sourceFile->errorString()); return false; } return true; }
int main (int argc, const char * argv[]) { FILE* fp;// = fopen("samplefat.bin", "rb"); if (argc == 2) { fp = fopen(argv[1], "rb"); if(fp == NULL) { printf("Invalid file path.\n"); return 0; } } else { printf("usage: %s %s\n", argv[0], "sample.bin"); return 1; } BootStrapSector bss; readBootStrapSector(&bss, fp); if(bss.magic55AA[0] != 0x55 || bss.magic55AA[1] !=0xAA) { printf("Invalid FAT-12 file.\n"); return 1; } sector_t rootDirectorySector = FIRST_FAT_SECTOR + bss.numSectorsInFAT * bss.numCopiesFAT; size_t numSectorsInDirectory = bss.numEntriesRootDir * 32 / bss.numBytesPerSector; sector_t firstClusterSector = rootDirectorySector + numSectorsInDirectory; seekToSector(fp, rootDirectorySector, bss.numBytesPerSector); // Extract int i; int fileCounter = 0; seekToSector(fp, rootDirectorySector, bss.numBytesPerSector); printf("Extracting...\n"); for (i = 0; i < bss.numEntriesRootDir; i++) { DirectoryEntry de; readDirectoryEntry(&de, fp); if (isFile(&de)) { fileCounter++; long offsetToNextDirectoryEntry = ftell(fp); printf("%s.%s%s", de.filename, de.file_extension, (i < bss.numEntriesRootDir ? ", " : "\n")); FILE* fat_file_p = fopen(de.filename, "wb"); UINT16 curCluster = de.start_cluster; //printf("%x\n", curCluster); BYTE buffer[bss.numBytesPerSector * bss.numSectorsPerCluster]; int fileSize = de.file_size; while (curCluster < 0xFF8 && fileSize > 0) { readCluster(fp, curCluster, firstClusterSector, bss.numBytesPerSector, bss.numSectorsPerCluster, buffer); //} if(fileSize < bss.numBytesPerSector * bss.numSectorsPerCluster) { fwrite(buffer, sizeof(BYTE), fileSize, fat_file_p); } else { fwrite(buffer, sizeof(BYTE), sizeof(buffer), fat_file_p); } seekToSector(fp, FIRST_FAT_SECTOR, bss.numBytesPerSector); curCluster = extract12File(fp, curCluster); fileSize -= bss.numBytesPerSector * bss.numSectorsPerCluster; } fclose(fat_file_p); fseek(fp, offsetToNextDirectoryEntry, SEEK_SET); } } printf("\nExtracted: %i files\n", fileCounter); fclose(fp); return 0; }