Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}