-
Notifications
You must be signed in to change notification settings - Fork 0
/
ptable.h
110 lines (93 loc) · 4.05 KB
/
ptable.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#ifndef __PTABLE_H
#define __PTABLE_H
// структура описания заголовка раздела
struct __attribute__ ((__packed__)) pheader {
uint32_t magic; // 0xa55aaa55
uint32_t hdsize; // размер заголовка
uint32_t hdversion; // вресия заголовка
uint8_t unlock[8]; // платформа
uint32_t code; // тип раздела
uint32_t psize; // разме поля данных
uint8_t date[16];
uint8_t time[16]; // дата-время сборки прошивки
uint8_t version[32]; // версия пршоивки
uint16_t crc; // CRC заголовка
uint32_t blocksize; // размер блока CRC образа прошивки
};
// Типы структуры разделов
enum parttypes {
part_bin, // неформатные двоичные разделы
part_cpio, // разделы CPIO-формата
part_nvram, // разделы nvdload
part_iso, // образы CD
part_ptable, // таблицы разделов
part_oem // oeminfo
};
// Структура описания таблицы разделов
struct ptb_t{
unsigned char pname[20]; // буквенное имя раздела
struct pheader hd; // образ заголовка
uint16_t* csumblock; // блок контрольных сумм
uint8_t* pimage; // образ раздела
uint32_t zflag; // признак сжатого раздела
enum parttypes ptype; // тип раздела, согласно enum parttypes
};
//**********************************************************
//* Класс для работы с таблицей разделов
//**********************************************************
class ptable_list {
// хранилище таблицы разделов
struct ptb_t table[120];
int npart; // число разделов в таблице
public:
// конструктор
ptable_list() { npart=0; }
// деструктор
~ptable_list() {clear();}
// извлечение разделов из файла
void extract(FILE* in);
// очистка всей таблицы
void clear();
// получение размера таблицы
int index() {return npart; }
// получение размера заголовка
uint32_t crcsize(int n) { return table[n].hd.hdsize-sizeof(pheader); }
// получение размера образа
uint32_t psize(int n) { return table[n].hd.psize; }
// получение кода раздела
uint32_t code(int n) { return table[n].hd.code; }
// получение имени раздела
uint8_t* name(int n) { return table[n].pname; }
// получение ссылки на заголовок
struct pheader* hptr(int n) { return &table[n].hd; }
// получение ссылки на образ раздела
uint8_t* iptr(int n) { return table[n].pimage; }
// получение типа раздела
enum parttypes ptype(int n) { return table[n].ptype; }
// получаение сжатого размера
uint32_t zsize(int n) { return table[n].zflag; }
// получение ссылок на описательные поля заголовка
uint8_t* platform(int n) { return table[n].hd.unlock; }
uint8_t* date(int n) { return table[n].hd.date; }
uint8_t* time(int n) { return table[n].hd.time; }
uint8_t* version(int n) { return table[n].hd.version; }
// замена образа раздела
void replace(int n, uint8_t* data, uint32_t len);
void findparts(FILE* in);
void loadimage(int np, FILE* in);
void save_part(int n,FILE* out, bool zflag);
void calc_crc16(int n);
void calc_hd_crc16(int n);
// удаление раздела
void delpart(int n);
// перемещение вверх
void moveup(int n);
// перемещение вниз
void movedown(int n);
};
extern ptable_list* ptable;
char* fw_description(uint8_t code);
void find_pname(unsigned int id,unsigned char* pname);
// тип прошивки
extern int dload_id;
#endif