Добавлено распознавание и распаковка разделов, сжатых LZMA-методом

This commit is contained in:
forth32 2017-09-20 14:21:40 +03:00
parent 2885cd96cb
commit df1e92c649
5 changed files with 62 additions and 12 deletions

View File

@ -2,7 +2,7 @@ CC = gcc
LIBS = -lz
#BUILDNO = `cat build`
BUILDNO=$(shell cat build)
CFLAGS = -O2 -Wunused -Wno-unused-result -D BUILDNO=$(BUILDNO) $(LIBS)
CFLAGS = -O2 -Wunused -Wno-unused-result -D BUILDNO=$(BUILDNO) -D_7ZIP_ST $(LIBS)
.PHONY: all clean
all: balong_flash
@ -11,7 +11,7 @@ clean:
rm *.o
rm balong_flash
balong_flash: balong_flash.o hdlcio_linux.o ptable.o flasher.o util.o signver.o
balong_flash: balong_flash.o hdlcio_linux.o ptable.o flasher.o util.o signver.o lzma/Alloc.o lzma/LzmaDec.o
@gcc $^ -o $@ $(LIBS)
@echo Current buid: $(BUILDNO)
@echo $$((`cat build`+1)) >build

2
build
View File

@ -1 +1 @@
256
277

View File

@ -17,6 +17,8 @@
#include "util.h"
#include "signver.h"
int32_t lzma_decode(uint8_t* inbuf,uint32_t fsize,uint8_t* outbuf);
//******************************************************
//* поиск символического имени раздела по его коду
//******************************************************
@ -160,10 +162,9 @@ uint16_t hcrc,crc;
uint16_t* crcblock;
uint32_t crcblocksize;
uint8_t* zbuf;
long unsigned int zlen;
long int zlen;
int res;
ptable[npart].zflag=0;
// читаем заголовок в структуру
ptable[npart].offset=ftell(in);
@ -205,8 +206,11 @@ else if (memcmp(crcblock,ptable[npart].csumblock,crcblocksize) != 0) {
free(crcblock);
ptable[npart].ztype=' ';
// Определение zlib-сжатия
if ((*(uint16_t*)ptable[npart].pimage) == 0xda78) {
ptable[npart].zflag=ptable[npart].hd.psize; // сохраняем сжатый размер
zlen=52428800;
@ -226,6 +230,35 @@ if ((*(uint16_t*)ptable[npart].pimage) == 0xda78) {
// перерассчитываем контрольные суммы
calc_crc16(npart);
ptable[npart].hd.crc=crc16((uint8_t*)&ptable[npart].hd,sizeof(struct pheader));
ptable[npart].ztype='Z';
}
// Определение lzma-сжатия
if ((ptable[npart].pimage[0] == 0x5d) && (*(uint64_t*)(ptable[npart].pimage+5) == 0xffffffffffffffff)) {
ptable[npart].zflag=ptable[npart].hd.psize; // сохраняем сжатый размер
zlen=52428800;
zbuf=malloc(zlen); // буфер в 50М
// распаковываем образ раздела
zlen=lzma_decode(ptable[npart].pimage, ptable[npart].hd.psize, zbuf);
if (zlen>52428800) {
printf("\n Превышен размер буфера\n");
exit(1);
}
if (res == -1) {
printf("\n! Ошибка распаковки раздела %s (%02x)\n",ptable[npart].pname,ptable[npart].hd.code>>16);
errflag=1;
}
// создаем новый буфер образа раздела и копируем в него рапаковынные данные
free(ptable[npart].pimage);
ptable[npart].pimage=malloc(zlen);
memcpy(ptable[npart].pimage,zbuf,zlen);
ptable[npart].hd.psize=zlen;
free(zbuf);
// перерассчитываем контрольные суммы
calc_crc16(npart);
ptable[npart].hd.crc=crc16((uint8_t*)&ptable[npart].hd,sizeof(struct pheader));
ptable[npart].ztype='L';
}
@ -254,6 +287,7 @@ int32_t hd_dload_id;
const unsigned int dpattern=0xa55aaa55;
unsigned int i;
// поиск начала цепочки разделов в файле
while (fread(&i,1,4,in) == 4) {
if (i == dpattern) break;
@ -279,16 +313,18 @@ if (dload_id > 0xf) {
printf("\n Неверный код типа прошивки (dload_id) в заголовке - %x",dload_id);
exit(0);
}
printf("\n Код файла прошивки: %x (%s)",hd_dload_id,fw_description(hd_dload_id));
printf("\n Код файла прошивки: %x (%s)\n",hd_dload_id,fw_description(hd_dload_id));
// поиск остальных разделов
do {
printf("\r Поиск раздела # %i",npart); fflush(stdout);
if (fread(&i,1,4,in) != 4) break; // конец файла
if (i != dpattern) break; // образец не найден - конец цепочки разделов
fseek(in,-4,SEEK_CUR); // отъезжаем назад, на начало заголовка
extract(in); // извлекаем раздел
} while(1);
printf("\r \r");
// ищем цифровую подпись
signsize=serach_sign();

View File

@ -33,6 +33,7 @@ struct ptb_t{
uint8_t* pimage; // образ раздела
uint32_t offset; // смещение в файле до начала раздела
uint32_t zflag; // признак сжатого раздела
uint8_t ztype; // тип сжатия
};
//******************************************************

19
util.c
View File

@ -252,11 +252,24 @@ void show_file_map() {
int i;
printf("\n\n ## Смещение Размер Сжатие Имя\n-------------------------------------");
printf("\n\n ## Смещение Размер Сжатие Имя\n-----------------------------------------------");
for (i=0;i<npart;i++) {
printf("\n %02i %08x %8i ",i,ptable[i].offset,ptable[i].hd.psize);
if (ptable[i].zflag == 0) printf(" ");
else printf(" %3i%% ",(ptable[i].hd.psize-ptable[i].zflag)*100/ptable[i].hd.psize);
if (ptable[i].zflag == 0)
// несжатый раздел
printf(" ");
else {
// сжатый раздел
switch(ptable[i].ztype) {
case 'L':
printf("Lzma");
break;
case 'Z':
printf("Gzip");
break;
}
printf(" %3i%% ",(ptable[i].hd.psize-ptable[i].zflag)*100/ptable[i].hd.psize);
}
printf(" %s",ptable[i].pname);
}
printf("\n");