mirror of
https://github.com/forth32/balongflash
synced 2024-11-09 07:10:39 +00:00
Добавлено распознавание и распаковка разделов, сжатых LZMA-методом
This commit is contained in:
parent
2885cd96cb
commit
df1e92c649
4
Makefile
4
Makefile
@ -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
|
||||
|
42
ptable.c
42
ptable.c
@ -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();
|
||||
|
1
ptable.h
1
ptable.h
@ -33,6 +33,7 @@ struct ptb_t{
|
||||
uint8_t* pimage; // образ раздела
|
||||
uint32_t offset; // смещение в файле до начала раздела
|
||||
uint32_t zflag; // признак сжатого раздела
|
||||
uint8_t ztype; // тип сжатия
|
||||
};
|
||||
|
||||
//******************************************************
|
||||
|
19
util.c
19
util.c
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user