TestDisk: always search for partition aligned on 1 MB boundaries

This commit is contained in:
Christophe Grenier 2012-07-14 10:45:29 +02:00
parent 65bfbc1a7b
commit e27faf2a24
5 changed files with 24 additions and 69 deletions

View file

@ -72,7 +72,7 @@ static list_part_t *add_ext_part_i386(disk_t *disk_car, list_part_t *list_part,
static unsigned int tab_insert(uint64_t *tab, const uint64_t offset, unsigned int tab_nbr);
/* Optimization */
static inline uint64_t CHS2offset_inline(const disk_t *disk_car,const CHS_t*CHS);
static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_org, const int verbose, const int dump_ind, const int fast_mode, const int interface, const int search_vista_part, char **current_cmd);
static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_org, const int verbose, const int dump_ind, const int fast_mode, const int interface, char **current_cmd);
static inline void offset2CHS_inline(const disk_t *disk_car,const uint64_t offset, CHS_t*CHS);
static inline void offset2CHS_inline(const disk_t *disk_car,const uint64_t offset, CHS_t*CHS)
@ -409,7 +409,7 @@ static unsigned int tab_insert(uint64_t *tab, const uint64_t offset, unsigned in
- Geometry: don't care
*/
static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_org, const int verbose, const int dump_ind, const int fast_mode, const int interface, const int search_vista_part, char **current_cmd)
static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_org, const int verbose, const int dump_ind, const int fast_mode, const int interface, char **current_cmd)
{
unsigned char *buffer_disk;
unsigned char *buffer_disk0;
@ -514,7 +514,7 @@ static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_o
}
search_location=min_location;
/* Not every sector will be examined */
search_location_init(disk_car, location_boundary, fast_mode, search_vista_part);
search_location_init(disk_car, location_boundary, fast_mode);
/* Scan the disk */
while(ind_stop==0 && search_location < search_location_max)
{
@ -553,7 +553,7 @@ static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_o
if(disk_car->arch==&arch_i386)
search_now|= (start.sector==1 && fast_mode>1) ||
(start.sector==1 && start.head<=2) ||
(search_vista_part>0 && search_location%(2048*512)==0);
search_location%(2048*512)==0;
else
search_now|= (search_location%location_boundary==0);
while(try_offset_raid_nbr>0 && try_offset_raid[0]<=search_location)
@ -610,7 +610,7 @@ static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_o
{
if((disk_car->arch==&arch_i386 &&
((start.sector==7 && (start.head<=2 || fast_mode>1)) ||
(search_vista_part>0 && search_location%(2048*512)==(7-1)*512))) ||
search_location%(2048*512)==(7-1)*512)) ||
(disk_car->arch!=&arch_i386 && (search_location%location_boundary==(7-1)*512)))
res=search_FAT_backup(buffer_disk,disk_car,partition,verbose,dump_ind);
test_nbr++;
@ -620,7 +620,7 @@ static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_o
{
if((disk_car->arch==&arch_i386 &&
((start.sector==13 && (start.head<=2 || fast_mode>1)) ||
(search_vista_part>0 && search_location%(2048*512)==(13-1)*disk_car->sector_size))) ||
search_location%(2048*512)==(13-1)*disk_car->sector_size)) ||
(disk_car->arch!=&arch_i386 && (search_location%location_boundary==(13-1)*disk_car->sector_size)))
res=search_EXFAT_backup(buffer_disk, disk_car, partition);
test_nbr++;
@ -630,7 +630,7 @@ static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_o
if((disk_car->arch==&arch_i386 &&
((start.sector==disk_car->geom.sectors_per_head &&
(start.head==disk_car->geom.heads_per_cylinder-1 || fast_mode>1)) ||
(search_vista_part>0 && search_location%(2048*512)==(2048-1)*512))) ||
search_location%(2048*512)==(2048-1)*512)) ||
(disk_car->arch!=&arch_i386 && search_location%location_boundary==(location_boundary-512) &&
search_location>0))
res=search_NTFS_backup(buffer_disk,disk_car,partition,verbose,dump_ind);
@ -641,7 +641,7 @@ static list_part_t *search_part(disk_t *disk_car, const list_part_t *list_part_o
if((disk_car->arch==&arch_i386 &&
((start.sector==disk_car->geom.sectors_per_head &&
(start.head==disk_car->geom.heads_per_cylinder-1 || fast_mode>1)) ||
(search_vista_part>0 && search_location%(2048*512)==(2048-1)*512))) ||
search_location%(2048*512)==(2048-1)*512)) ||
(disk_car->arch!=&arch_i386 && search_location%location_boundary==(location_boundary-512) &&
search_location>0))
res=search_HFS_backup(buffer_disk,disk_car,partition,verbose,dump_ind);
@ -1288,7 +1288,7 @@ static int use_backup(disk_t *disk_car, const list_part_t *list_part, const int
return 0;
}
int interface_recovery(disk_t *disk_car, const list_part_t * list_part_org, const int verbose, const int dump_ind, const int align, const int ask_part_order, const unsigned int expert, const int search_vista_part, char **current_cmd)
int interface_recovery(disk_t *disk_car, const list_part_t * list_part_org, const int verbose, const int dump_ind, const int align, const int ask_part_order, const unsigned int expert, char **current_cmd)
{
int res_interface_write;
int fast_mode=0;
@ -1306,7 +1306,7 @@ int interface_recovery(disk_t *disk_car, const list_part_t * list_part_org, cons
wmove(stdscr,5,0);
#endif
res_interface_write=0;
list_part=search_part(disk_car, list_part_org, verbose, dump_ind, fast_mode, 1, search_vista_part, current_cmd);
list_part=search_part(disk_car, list_part_org, verbose, dump_ind, fast_mode, 1, current_cmd);
if(list_part!=NULL && (disk_car->arch==&arch_i386 || disk_car->arch==&arch_sun))
{ /* Correct disk geometry is necessary for successfull Intel and Sun partition recovery */
unsigned int heads_per_cylinder;

View file

@ -24,7 +24,7 @@ extern "C" {
#endif
typedef enum part_offset part_offset_t;
int interface_recovery(disk_t *disk_car, const list_part_t * list_part_org, const int verbose, const int dump_ind, const int align, const int ask_part_order, const unsigned int expert, const int search_vista_part, char **current_cmd);
int interface_recovery(disk_t *disk_car, const list_part_t * list_part_org, const int verbose, const int dump_ind, const int align, const int ask_part_order, const unsigned int expert, char **current_cmd);
void only_one_bootable( list_part_t *list_part, list_part_t *part_boot);
#ifdef __cplusplus

View file

@ -90,7 +90,7 @@ static void update_location(void)
search_location_nbr++;
}
void search_location_init(const disk_t *disk_car, const unsigned int location_boundary, const int fast_mode, const int search_vista_part)
void search_location_init(const disk_t *disk_car, const unsigned int location_boundary, const int fast_mode)
{
/* test_nbr==1... */
if(disk_car->arch==&arch_i386)
@ -113,12 +113,9 @@ void search_location_init(const disk_t *disk_car, const unsigned int location_bo
search_location_info[search_location_nbr].offset=CHS_to_offset(0,2,1,disk_car);
search_location_info[search_location_nbr].inc=CHS_to_offset(1,0,0,disk_car);
}
if(search_vista_part>0)
{
search_location_info[search_location_nbr].offset=0;
search_location_info[search_location_nbr].inc=2048*512;
update_location();
}
search_location_info[search_location_nbr].offset=0;
search_location_info[search_location_nbr].inc=2048*512;
update_location();
}
else
{
@ -148,12 +145,9 @@ void search_location_init(const disk_t *disk_car, const unsigned int location_bo
search_location_info[search_location_nbr].inc=location_boundary;
update_location();
}
if(search_vista_part>0)
{
search_location_info[search_location_nbr].offset=CHS_to_offset(0,0,7,disk_car);
search_location_info[search_location_nbr].inc=2048*512;
update_location();
}
search_location_info[search_location_nbr].offset=CHS_to_offset(0,0,7,disk_car);
search_location_info[search_location_nbr].inc=2048*512;
update_location();
/* test_nbr==3 ou test_nbr==4, NTFS or HFS backup boot sector */
if(disk_car->arch==&arch_i386)
{
@ -167,12 +161,9 @@ void search_location_init(const disk_t *disk_car, const unsigned int location_bo
search_location_info[search_location_nbr].inc=location_boundary;
update_location();
}
if(search_vista_part>0)
{
search_location_info[search_location_nbr].offset=(2048-1)*512;
search_location_info[search_location_nbr].inc=2048*512;
update_location();
}
search_location_info[search_location_nbr].offset=(2048-1)*512;
search_location_info[search_location_nbr].inc=2048*512;
update_location();
/* test_nbr==5*/
{
int s_log_block_size;

View file

@ -2,7 +2,7 @@
extern "C" {
#endif
void search_location_init(const disk_t *disk_car, const unsigned int location_boundary, const int fast_mode, const int search_vista_part);
void search_location_init(const disk_t *disk_car, const unsigned int location_boundary, const int fast_mode);
uint64_t search_location_update(const uint64_t location);
#ifdef __cplusplus

View file

@ -67,27 +67,9 @@ static int menu_disk_cli(disk_t *disk_car, const int verbose,int dump_ind, const
{
(*current_cmd)+=7;
{
int search_vista_part=0;
list_part_t *list_part;
list_part=interface_analyse(disk_car, verbose, saveheader, current_cmd);
if(disk_car->arch==&arch_i386)
{
const list_part_t *element;
for(element=list_part;element!=NULL;element=element->next)
{
if(element->part->part_offset%(2048*512)==0 && element->part->part_size%(2048*512)==0)
search_vista_part=1;
}
while(*current_cmd[0]==',')
(*current_cmd)++;
if(strncmp(*current_cmd,"mode_vista",10)==0)
{
(*current_cmd)+=10;
search_vista_part=1;
}
log_info("search_vista_part: %d\n", search_vista_part);
}
interface_recovery(disk_car, list_part, verbose, dump_ind, align, ask_part_order, expert, search_vista_part, current_cmd);
interface_recovery(disk_car, list_part, verbose, dump_ind, align, ask_part_order, expert, current_cmd);
part_free_list(list_part);
}
}
@ -167,27 +149,9 @@ static int menu_disk_ncurses(disk_t *disk_car, const int verbose,int dump_ind, c
case 'a':
case 'A':
{
int search_vista_part=0;
list_part_t *list_part;
list_part=interface_analyse(disk_car, verbose, saveheader, current_cmd);
if(disk_car->arch==&arch_i386)
{
const list_part_t *element;
for(element=list_part;element!=NULL;element=element->next)
{
if(element->part->part_offset%(2048*512)==0 && element->part->part_size%(2048*512)==0)
search_vista_part=1;
}
if(search_vista_part==0)
{
log_info("Ask the user for vista mode\n");
if(ask_confirmation_with_default('Y',
"Should TestDisk search for partition created under Vista or later ? [Y/N] (answer Yes if unsure)")!=0)
search_vista_part=1;
}
log_info("search_vista_part: %d\n", search_vista_part);
}
interface_recovery(disk_car, list_part, verbose, dump_ind, align, ask_part_order, expert, search_vista_part, current_cmd);
interface_recovery(disk_car, list_part, verbose, dump_ind, align, ask_part_order, expert, current_cmd);
part_free_list(list_part);
}
break;