/* fat_unformat() * @param struct ph_param *params * @param const struct ph_options *options * @param alloc_data_t *list_search_space * * @returns: * 0: Completed or not possible * 1: Stop by user request * params->offset is set */ int fat_unformat(struct ph_param *params, const struct ph_options *options, alloc_data_t *list_search_space) { unsigned int sectors_per_cluster=0; uint64_t start_data=0; params->blocksize=0; if(pfind_sectors_per_cluster(params->disk, params->partition, options->verbose, §ors_per_cluster, &start_data, list_search_space)==0) { display_message("Can't find FAT cluster size\n"); return 0; } if(start_data <= params->partition->part_offset) { display_message("FAT filesystem was beginning before the actual partition."); return 0; } start_data *= params->disk->sector_size; del_search_space(list_search_space, params->partition->part_offset, start_data - 1); { uint64_t offset=start_data; params->blocksize=sectors_per_cluster * params->disk->sector_size; #ifdef HAVE_NCURSES if(options->expert>0) params->blocksize=menu_choose_blocksize(params->blocksize, params->disk->sector_size, &offset); #endif update_blocksize(params->blocksize, list_search_space, offset); } /* start_data is relative to the disk */ return fat_unformat_aux(params, options, start_data, list_search_space); }
int QPhotorec::photorec(alloc_data_t *list_search_space) { pstatus_t ind_stop=PSTATUS_OK; const unsigned int blocksize_is_known=params->blocksize; params_reset(params, options); /* make the first recup_dir */ params->dir_num=photorec_mkdir(params->recup_dir, params->dir_num); for(params->pass=0; params->status!=STATUS_QUIT; params->pass++) { timer->start(); switch(params->status) { case STATUS_UNFORMAT: /* FIXME */ break; case STATUS_FIND_OFFSET: { uint64_t start_offset=0; if(blocksize_is_known>0) { ind_stop=PSTATUS_OK; if(!td_list_empty(&list_search_space->list)) start_offset=(td_list_entry(list_search_space->list.next, alloc_data_t, list))->start % params->blocksize; } else { ind_stop=photorec_find_blocksize(list_search_space); params->blocksize=find_blocksize(list_search_space, params->disk->sector_size, &start_offset); } update_blocksize(params->blocksize, list_search_space, start_offset); } break; case STATUS_EXT2_ON_BF: case STATUS_EXT2_OFF_BF: /* FIXME */ break; default: ind_stop=photorec_aux(list_search_space); break; } timer->stop(); qphotorec_search_updateUI(); session_save(list_search_space, params, options); switch(ind_stop) { case PSTATUS_EACCES: { int ret=QMessageBox::warning(this, tr("QPhotoRec: Failed to create file!"), tr("Failed to create file! Please choose another destination"), QMessageBox::Ok| QMessageBox::Cancel, QMessageBox::Ok); if(ret==QMessageBox::Cancel) { params->status=STATUS_QUIT; } else { setExistingDirectory(); free(params->recup_dir); QByteArray byteArray = (directoryLabel->text() + "/" + DEFAULT_RECUP_DIR).toUtf8(); params->recup_dir=strdup(byteArray.constData()); params->dir_num=photorec_mkdir(params->recup_dir, params->dir_num); } } break; case PSTATUS_ENOSPC: { int ret=QMessageBox::warning(this, tr("QPhotoRec: Not enough space!"), tr("There is not enough space left! Please free disk space and/or choose another destination"), QMessageBox::Ok| QMessageBox::Cancel, QMessageBox::Ok); if(ret==QMessageBox::Cancel) { params->status=STATUS_QUIT; } else { setExistingDirectory(); free(params->recup_dir); QByteArray byteArray = (directoryLabel->text() + "/" + DEFAULT_RECUP_DIR).toUtf8(); params->recup_dir=strdup(byteArray.constData()); params->dir_num=photorec_mkdir(params->recup_dir, params->dir_num); } } break; case PSTATUS_OK: status_inc(params, options); if(params->status==STATUS_QUIT) unlink("photorec.ses"); break; case PSTATUS_STOP: params->status=STATUS_QUIT; break; } update_stats(params->file_stats, list_search_space); qphotorec_search_updateUI(); } free_search_space(list_search_space); free_header_check(); free(params->file_stats); params->file_stats=NULL; return 0; }