📄 recovery.c
字号:
{ fseek(ostream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+ (unsigned long)bck_pad_flag* (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks, SEEK_SET); fwrite(protpad+1, 1, rec_size, ostream); if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); } else { protpad_bck[0]='\0'; cur_section=0; for(pad_ctr=1; pad_ctr<protpad_size; pad_ctr++) { protpad_bck[(cur_section+pad_flag-bck_pad_flag)%protpad_size]= protpad_bck[cur_section]^protpad[cur_section]^ protpad_r[(cur_section+protpad_size-bck_pad_flag)%protpad_size]; cur_section=(cur_section+pad_flag-bck_pad_flag)%protpad_size; } fseek(ostream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+ (unsigned long)pad_flag* (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks, SEEK_SET); fwrite(protpad_bck+1, 1, bck_rec_size, ostream); if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); for(pad_ctr=1; pad_ctr<protpad_size; pad_ctr++) protpad_bck[pad_ctr]^=protpad[pad_ctr]; fseek(ostream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+ (unsigned long)bck_pad_flag* (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks, SEEK_SET); fwrite(protpad_bck+1, 1, rec_size, ostream); if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); } } else { if(pad_damage_flag!=0) { if(pad_flag!=-1) abort_recovery(); fseek(ostream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+ (unsigned long)bck_pad_flag* (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks, SEEK_SET); fwrite(protpad+1, 1, rec_size, ostream); if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); } else { if(damage_flag!=0) { if(pad_flag!=-1) abort_recovery(); for(pad_ctr=1; pad_ctr<protpad_size; pad_ctr++) protpad_bck[pad_ctr]= protpad_r[(pad_ctr+protpad_size-bck_pad_flag)%protpad_size]; fseek(ostream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+ (unsigned long)bck_pad_flag* (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks, SEEK_SET); fwrite(protpad_bck+1, 1, rec_size, ostream); if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); } } } } } } if(rd_offset!=0L) create_protfile(ostream, total_blocks, 1); fclose(ostream); atstream=NULL; } else { fseek(astream, 0L, SEEK_SET); errors=0; ifile_size=orig_ifile_size; for(cur_stream=0; cur_stream<total_blocks; cur_stream++) { msg_cprintf(0, (FMSG *)prot_ticker); ins_lf=1; damage_level=0; fseek(xstream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+rd_offset, SEEK_SET); fread(single_pad, 1, DEFAULT_PROTPAD_SIZE, xstream); crc32term=CRC_MASK; crc32_for_block(single_pad+4, DEFAULT_PROTPAD_SIZE-4); if(mget_dword(&single_pad[0])!=crc32term) damage_level=2; fseek(xstream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+ 3L*(unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks+rd_offset, SEEK_SET); fread(single_pad_r, 1, DEFAULT_PROTPAD_SIZE, xstream); crc32term=CRC_MASK; crc32_for_block(single_pad_r+4, DEFAULT_PROTPAD_SIZE-4); if(mget_dword(&single_pad_r[0])!=crc32term) { if(damage_level==2) { if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_RECOVERY_2CRC_DAMAGED); abort_recovery(); } damage_level=1; } for(pad_ctr=0; pad_ctr<DEFAULT_PROTPAD_SIZE-14; pad_ctr++) { single_pad[pad_ctr]=single_pad[pad_ctr+14]; single_pad_r[pad_ctr]=single_pad_r[pad_ctr+14]; } fseek(xstream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+ (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks+rd_offset, SEEK_SET); fread(protpad, 1, DEFAULT_PROTPAD_SIZE, xstream); crc32term=CRC_MASK; crc32_for_block(protpad+4, DEFAULT_PROTPAD_SIZE-4); damage_flag=(mget_dword(&protpad[0])!=crc32term)?1:0; if(!damage_flag) { for(pad_ctr=0; pad_ctr<DEFAULT_PROTPAD_SIZE-4; pad_ctr++) protpad[pad_ctr]=protpad[pad_ctr+4]; for(pad_ctr=0; pad_ctr<pad1_size; pad_ctr++) { if(damage_level==2) protpad[pad_ctr+protpad_size-pad1_size]=single_pad_r[pad_ctr]; else protpad[pad_ctr+protpad_size-pad1_size]=single_pad[pad_ctr]; } } fseek(xstream, (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)cur_stream+2L* (unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks+rd_offset, SEEK_SET); fread(protpad_r, 1, DEFAULT_PROTPAD_SIZE, xstream); crc32term=CRC_MASK; crc32_for_block(protpad_r+4, DEFAULT_PROTPAD_SIZE-4); pad_damage_flag=(mget_dword(&protpad_r[0])!=crc32term)?1:0; if(!pad_damage_flag) { for(pad_ctr=0; pad_ctr<DEFAULT_PROTPAD_SIZE-4; pad_ctr++) protpad_r[pad_ctr]=protpad_r[pad_ctr+4]; for(pad_ctr=0; pad_ctr<pad1_size; pad_ctr++) { if(damage_level==2) protpad_r[pad_ctr+protpad_size-pad1_size]= single_pad_r[pad1_size+pad_ctr]; else protpad_r[pad_ctr+protpad_size-pad1_size]= single_pad[pad1_size+pad_ctr]; } } cur_section=0; bck_pad_flag=pad_flag=-1; block_offset=(unsigned long)cur_stream*(unsigned long)DEFAULT_PROTPAD_SIZE; while(block_offset<ifile_size) { fseek(astream, block_offset, SEEK_SET); section_size=fread(protpad_bck+1, 1, DEFAULT_PROTPAD_SIZE, astream); protpad_bck[0]='\0'; for(pad_ctr=section_size+1; pad_ctr<protpad_size; pad_ctr++) protpad_bck[pad_ctr]='\0'; data_damage=0; crc32term=(unsigned long) crc16_for_block(protpad_bck+1, DEFAULT_PROTPAD_SIZE); crc32_for_block(protpad_bck+1, DEFAULT_PROTPAD_SIZE); if(damage_level==0||damage_level==1) { if(mget_word (&single_pad[(pad1_size<<1)+((cur_section<<2)>>1)])!= (unsigned short)(crc32term%65536L)) data_damage=1; } if(damage_level==0||damage_level==2) { if(mget_word (&single_pad_r[(pad1_size<<1)+((cur_section<<2)>>1)])!= (unsigned short)(crc32term>>16)) data_damage=1; } if(data_damage) { errors++; if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_DAMAGED, cur_stream, cur_section); if(bck_pad_flag==-1) { bck_pad_flag=cur_section; rec_size=section_size; } else if(pad_flag==-1) { pad_flag=cur_section; bck_rec_size=section_size; } else abort_recovery(); } else { for(pad_ctr=0; pad_ctr<protpad_size; pad_ctr++) { protpad[pad_ctr]^=protpad_bck[pad_ctr]; protpad_r[pad_ctr]^=protpad_bck[(pad_ctr+cur_section)%protpad_size]; } } block_offset+=(unsigned long)DEFAULT_PROTPAD_SIZE* (unsigned long)total_blocks; cur_section++; } if(bck_pad_flag!=-1) { if(damage_flag!=0&&pad_damage_flag!=0&&bck_pad_flag!=-1) abort_recovery(); else { if(damage_flag==0&&pad_damage_flag==0) { if(pad_flag==-1) { if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); } else { protpad_bck[0]='\0'; cur_section=0; for(pad_ctr=1; pad_ctr<protpad_size; pad_ctr++) { protpad_bck[(cur_section+pad_flag-bck_pad_flag)%protpad_size]= protpad_bck[cur_section]^protpad[cur_section]^ protpad_r[(cur_section+protpad_size-bck_pad_flag)%protpad_size]; cur_section=(cur_section+pad_flag-bck_pad_flag)%protpad_size; } if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); for(pad_ctr=1; pad_ctr<protpad_size; pad_ctr++) protpad_bck[pad_ctr]^=protpad[pad_ctr]; if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); } } else { if(pad_damage_flag!=0) { if(pad_flag!=-1) abort_recovery(); if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); } else { if(damage_flag!=0) { if(pad_flag!=-1) abort_recovery(); for(pad_ctr=1; pad_ctr<protpad_size; pad_ctr++) protpad_bck[pad_ctr]= protpad_r[(pad_ctr+protpad_size-bck_pad_flag)%protpad_size]; if(ins_lf) { nputlf(); ins_lf=0; } msg_cprintf(0, M_SECTION_RECOVERED, cur_stream); } } } } } } } } if(ins_lf) nputlf(); if(rd_offset==0L) fclose(xstream); fclose(astream); free(protpad); free(protpad_r); free(single_pad); free(single_pad_r); free(protpad_bck); return(errors?0:1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -