Оптимизирован код поиска разделов

master
forth32 8 years ago
parent 14af6c1db3
commit 8d188054fc

@ -174,10 +174,12 @@ FILE* out;
struct ptb_t ptable[100];
unsigned char buf[40960];
unsigned char* buf;
unsigned char devname[50]="/dev/ttyUSB0";
unsigned int err;
unsigned char OKrsp[]={0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a};
@ -351,18 +353,19 @@ if (eflag|sflag) {
if(sflag) {
// запись заголовка
fwrite(&dpattern,1,4,out); // маркер- magic заголовка блока
buf=malloc(ptable[i].hdsize);
fseek(in,ptable[i].hdoffset,SEEK_SET); // встаем на начало заголовка
fread(buf,1,ptable[i].offset-ptable[i].hdoffset,in);
fwrite(buf,1,ptable[i].offset-ptable[i].hdoffset,out);
fread(buf,1,ptable[i].hdsize,in);
fwrite(buf,1,ptable[i].hdsize,out);
free(buf);
}
// запись тела
fseek(in,ptable[i].offset,SEEK_SET); // встаем на начало
for(j=0;j<ptable[i].size;j+=4) {
fread(buf,4,1,in);
fwrite(buf,4,1,out);
}
buf=malloc(ptable[i].size);
fread(buf,ptable[i].size,1,in);
fwrite(buf,ptable[i].size,1,out);
fclose(out);
free(buf);
}
printf("\n");
return;

@ -3,6 +3,7 @@
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include "ptable.h"
//******************************************************
//* поиск символического имени раздела по его коду
@ -84,15 +85,26 @@ struct {
const unsigned int dpattern=0xa55aaa55;
unsigned int i,npart=0;
// поиск начала цепочки разделов в файле
while (fread(&i,1,4,in) == 4) {
if (i != dpattern) continue; // ищем разделитель
if (i == dpattern) break;
}
if (feof(in)) {
printf("\n В файле не найдены разделы - файл не содержит образа прошивки");
exit(0);
}
while (fread(&i,1,4,in) == 4) {
if (i != dpattern) {
fseek(in,-3,SEEK_CUR);
continue; // ищем разделитель
}
// Выделяем параметры раздела
ptable[npart].hdoffset=ftell(in); // позиция начала заголовка раздела
fseek(in,-4,SEEK_CUR); // встаем на начало заголовка
ptable[npart].hdoffset=ftell(in); // позиция начала заголовка раздела
fread(&header,1,sizeof(header),in); // читаем заголовок
ptable[npart].hdsize=header.hdsize-4; // размер заголовка
ptable[npart].hdsize=header.hdsize; // размер заголовка
ptable[npart].offset=ptable[npart].hdoffset+ptable[npart].hdsize; // смещение до тела раздела
ptable[npart].size=header.psize; // размер раздела
ptable[npart].code=header.code; // тип раздела
@ -108,7 +120,8 @@ while (fread(&i,1,4,in) == 4) {
// увеличиваем счетчик разделов
npart++;
// пропускаем тело раздела
fseek(in,(header.psize+header.hdsize-sizeof(header)-4)&0xfffffffc,SEEK_CUR);
fseek(in,(header.psize+header.hdsize-sizeof(header)),SEEK_CUR);
// fseek(in,(header.psize+header.hdsize-sizeof(header))&0xfffffffc,SEEK_CUR);
}
return npart;
}

Loading…
Cancel
Save