forked from forth32/qhuaweiflash
-
Notifications
You must be signed in to change notification settings - Fork 0
/
nvexplorer.h
151 lines (122 loc) · 4.54 KB
/
nvexplorer.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//-------------- Редактор двоичных образов NVRAM ----------------------------
#ifndef _NVEXPLORER_H_
#define _NVEXPLORER_H_
#include <stdint.h>
#include <QtWidgets>
//------------------------- Структуры данных файла nvram ------------------------------
// Хуавеевские типы данных
#define U32 uint32_t
#define U16 uint16_t
#define U8 uint8_t
#define FILE_MAGIC_NUM 0x224e4944 // Сигнатура заголовка файла
// Структура файла NVRAM
//
//------- управляющая Структура -----------------
// +00 Заголовок (nvfile_header) - 96 байта
// +file_offset - каталог файлов
// +item_offset - каталог ячеек
// 4 байта CRC управляющей структуры
//-------- Данные ячеек ----------------------
// данные идут последовательно ячейка за ячейкой, без разрывов
//
// Струкура заголовка nv-файла
struct nvfile_header {
U32 magicnum; // сигнатура
U32 ctrl_size; // размер управляющих структур (смещение до данных)
U16 version; // * file version * /
U8 modem_num; // номер модема для мультимодемных конфигураций
U8 crcflag; // признак наличия CRC
U32 file_offset; // смещение до списка файлов
U32 file_num; // число файлов в списке
U32 file_size; // размер списка файлов
U32 item_offset; // смещение до списка ячеек
U32 item_count; // число ячеек в списке
U32 item_size; // размер списка ячеек
U8 reserve2 [12];
U32 timetag [4]; // отметка воемени
U8 product_version [32]; // версия устройства
};
// Элемент каталога файлов
struct nv_file {
U32 id; // номер файла
U8 name [28]; // имя файла
U32 size; // размер файла
U32 offset; // смещение до файла
};
// Элемент каталога ячеек
struct nv_item {
U16 id; // номер ячейки
U16 len; // размер в байтах
U32 off; // смещение от начала файла
U16 file_id; // файл, к которому относится ячейка
U16 priority; // приоритет ячейки
U8 modem_num; // номер модема
U8 reserved [3];
};
//***********************************************************
//* Класс главного окна редактора
//***********************************************************
class nvexplorer : public QMainWindow {
Q_OBJECT
bool changed=false;
uint8_t* srcdata;
uint8_t* pdata;
uint32_t plen;
struct nvfile_header nvhd; // заголовок nvram-файла
// Каталог файлов
struct nv_file flist[15];
// каталог ячеек
struct nv_item* itemlist;
// uint32_t maxitemlen=0; // максимальный размер ячейки
// Подпрограммы библиотеки nvio для доступа к структурам nvram
uint32_t fileoff(int fid);
int32_t fileidx(int fid);
uint32_t itemoff_idx(int idx);
int32_t itemidx(int item);
int32_t itemoff (int item);
int32_t itemlen (int item);
int load_item(int item, char* buf);
void datacell(int);
void changed_item(int);
// тип CRC, используемый в файле
// 0 - нет crc
// 1 - первый тип CRC, для V7R11, с массивом контрольных сумм
// 2 - второй тип CRC, для V7R22, с индивидуальной КС
int crcmode;
// Смещение до поля CRC в образе nvram
uint32_t crcoff;
// Подпрограммы работы с CRC
uint32_t calc_crcsize();
void recalc_crc();
void recalc_ctrl_crc();
uint32_t load_item_crc(int);
uint32_t calc_item_crc(int);
void restore_item_crc(int);
bool verify_item_crc(int idx);
// GUI
QWidget* central;
QSettings* config;
QVBoxLayout* vlm;
// таблица nvram
QTableWidget* nvtable;
// Главное меню
QMenuBar* menubar;
QMenu* menu_file;
QMenu* menu_edit;
QMenu* menu_view;
// тулбар
QToolBar* toolbar;
void zoom(int);
public:
nvexplorer(uint8_t* data, uint32_t len);
~nvexplorer();
public slots:
void save_all();
void zoomin();
void zoomout();
void edititem();
void extract_item();
void replace_item();
};
char* find_desc(int item);
#endif // _NVEXPLORER_H_