1 // copyright (c) 2017-2021 hors<horsicq@gmail.com>
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9
10 // The above copyright notice and this permission notice shall be included in all
11 // copies or substantial portions of the Software.
12
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 // SOFTWARE.
20 //
21 #include "lewidget.h"
22 #include "ui_lewidget.h"
23
LEWidget(QWidget * pParent)24 LEWidget::LEWidget(QWidget *pParent) :
25 FormatWidget(pParent),
26 ui(new Ui::LEWidget)
27 {
28 ui->setupUi(this);
29
30 initHexViewWidget(ui->widgetHex);
31 // initSearchSignaturesWidget(ui->widgetSignatures);
32 initSearchStringsWidget(ui->widgetStrings);
33 initToolsWidget(ui->widgetHex_DOS_HEADER);
34 initToolsWidget(ui->widgetHex_Object);
35 initToolsWidget(ui->widgetHex_OVERLAY);
36 initToolsWidget(ui->widgetHex_VXD_HEADER);
37 }
38
LEWidget(QIODevice * pDevice,FW_DEF::OPTIONS options,QWidget * pParent)39 LEWidget::LEWidget(QIODevice *pDevice, FW_DEF::OPTIONS options, QWidget *pParent) :
40 LEWidget(pParent)
41 {
42 LEWidget::setData(pDevice,options,0,0,0);
43 LEWidget::reload();
44 }
45
~LEWidget()46 LEWidget::~LEWidget()
47 {
48 delete ui;
49 }
50
setShortcuts(XShortcuts * pShortcuts)51 void LEWidget::setShortcuts(XShortcuts *pShortcuts)
52 {
53 ui->widgetHex->setShortcuts(pShortcuts);
54 ui->widgetDisasm->setShortcuts(pShortcuts);
55 ui->widgetStrings->setShortcuts(pShortcuts);
56 ui->widgetEntropy->setShortcuts(pShortcuts);
57 ui->widgetHeuristicScan->setShortcuts(pShortcuts);
58 ui->widgetMemoryMap->setShortcuts(pShortcuts);
59 ui->widgetHex_DOS_HEADER->setShortcuts(pShortcuts);
60 ui->widgetHex_Object->setShortcuts(pShortcuts);
61 ui->widgetHex_OVERLAY->setShortcuts(pShortcuts);
62 ui->widgetHex_VXD_HEADER->setShortcuts(pShortcuts);
63
64 FormatWidget::setShortcuts(pShortcuts);
65 }
66
clear()67 void LEWidget::clear()
68 {
69 LEWidget::reset();
70
71 memset(g_lineEdit_DOS_HEADER,0,sizeof g_lineEdit_DOS_HEADER);
72 memset(g_lineEdit_VXD_HEADER,0,sizeof g_lineEdit_VXD_HEADER);
73 memset(g_comboBox,0,sizeof g_comboBox);
74 memset(g_invWidget,0,sizeof g_invWidget);
75 memset(g_subDevice,0,sizeof g_subDevice);
76
77 ui->checkBoxReadonly->setChecked(true);
78
79 ui->treeWidgetNavi->clear();
80 }
81
cleanup()82 void LEWidget::cleanup()
83 {
84
85 }
86
reload()87 void LEWidget::reload()
88 {
89 LEWidget::clear();
90
91 ui->checkBoxReadonly->setEnabled(!isReadonly());
92
93 XLE le(getDevice(),getOptions().bIsImage,getOptions().nImageBase);
94
95 if(le.isValid())
96 {
97 setFileType(le.getFileType());
98
99 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_HEX,tr("Hex")));
100 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_DISASM,tr("Disasm")));
101 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_STRINGS,tr("Strings")));
102 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_MEMORYMAP,tr("Memory map")));
103 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_ENTROPY,tr("Entropy")));
104 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_HEURISTICSCAN,tr("Heuristic scan")));
105 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_DOS_HEADER,"DOS_HEADER"));
106 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_VXD_HEADER,"VXD_HEADER"));
107 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_OBJECTS,"Objects"));
108
109 if(le.isOverlayPresent())
110 {
111 ui->treeWidgetNavi->addTopLevelItem(createNewItem(SLE::TYPE_OVERLAY,tr("Overlay")));
112 }
113
114 ui->treeWidgetNavi->expandAll();
115
116 setTreeItem(ui->treeWidgetNavi,getOptions().nStartType);
117 }
118 }
119
_setValue(QVariant vValue,int nStype,int nNdata,int nVtype,int nPosition,qint64 nOffset)120 FormatWidget::SV LEWidget::_setValue(QVariant vValue, int nStype, int nNdata, int nVtype, int nPosition, qint64 nOffset)
121 {
122 Q_UNUSED(nVtype)
123 Q_UNUSED(nPosition)
124 Q_UNUSED(nOffset)
125
126 SV result=SV_NONE;
127
128 blockSignals(true);
129
130 quint64 nValue=vValue.toULongLong();
131
132 if(getDevice()->isWritable())
133 {
134 XLE le(getDevice(),getOptions().bIsImage,getOptions().nImageBase);
135
136 if(le.isValid())
137 {
138 switch(nStype)
139 {
140 case SLE::TYPE_DOS_HEADER:
141 switch(nNdata)
142 {
143 case N_LE_DOS_HEADER::e_magic: g_comboBox[CB_DOS_HEADER_e_magic]->setValue(nValue); break;
144 case N_LE_DOS_HEADER::e_lfanew: g_invWidget[INV_DOS_HEADER_e_lfanew]->setOffsetAndSize(&le,(quint32)nValue,0); break;
145 }
146 break;
147 case SLE::TYPE_VXD_HEADER:
148 switch(nNdata)
149 {
150 case N_VXD_HEADER::e32_magic: g_comboBox[CB_VXD_HEADER_e32_magic]->setValue(nValue); break;
151 case N_VXD_HEADER::e32_cpu: g_comboBox[CB_VXD_HEADER_e32_cpu]->setValue(nValue); break;
152 case N_VXD_HEADER::e32_os: g_comboBox[CB_VXD_HEADER_e32_os]->setValue(nValue); break;
153 }
154 break;
155 }
156
157 switch(nStype)
158 {
159 case SLE::TYPE_DOS_HEADER:
160 switch(nNdata)
161 {
162 case N_LE_DOS_HEADER::e_magic: le.set_e_magic((quint16)nValue); break;
163 case N_LE_DOS_HEADER::e_cblp: le.set_e_cblp((quint16)nValue); break;
164 case N_LE_DOS_HEADER::e_cp: le.set_e_cp((quint16)nValue); break;
165 case N_LE_DOS_HEADER::e_crlc: le.set_e_crlc((quint16)nValue); break;
166 case N_LE_DOS_HEADER::e_cparhdr: le.set_e_cparhdr((quint16)nValue); break;
167 case N_LE_DOS_HEADER::e_minalloc: le.set_e_minalloc((quint16)nValue); break;
168 case N_LE_DOS_HEADER::e_maxalloc: le.set_e_maxalloc((quint16)nValue); break;
169 case N_LE_DOS_HEADER::e_ss: le.set_e_ss((quint16)nValue); break;
170 case N_LE_DOS_HEADER::e_sp: le.set_e_sp((quint16)nValue); break;
171 case N_LE_DOS_HEADER::e_csum: le.set_e_csum((quint16)nValue); break;
172 case N_LE_DOS_HEADER::e_ip: le.set_e_ip((quint16)nValue); break;
173 case N_LE_DOS_HEADER::e_cs: le.set_e_cs((quint16)nValue); break;
174 case N_LE_DOS_HEADER::e_lfarlc: le.set_e_lfarlc((quint16)nValue); break;
175 case N_LE_DOS_HEADER::e_ovno: le.set_e_ovno((quint16)nValue); break;
176 case N_LE_DOS_HEADER::e_res_0: le.set_e_res(0,(quint16)nValue); break;
177 case N_LE_DOS_HEADER::e_res_1: le.set_e_res(1,(quint16)nValue); break;
178 case N_LE_DOS_HEADER::e_res_2: le.set_e_res(2,(quint16)nValue); break;
179 case N_LE_DOS_HEADER::e_res_3: le.set_e_res(3,(quint16)nValue); break;
180 case N_LE_DOS_HEADER::e_oemid: le.set_e_oemid((quint16)nValue); break;
181 case N_LE_DOS_HEADER::e_oeminfo: le.set_e_oeminfo((quint16)nValue); break;
182 case N_LE_DOS_HEADER::e_res2_0: le.set_e_res2(0,(quint16)nValue); break;
183 case N_LE_DOS_HEADER::e_res2_1: le.set_e_res2(1,(quint16)nValue); break;
184 case N_LE_DOS_HEADER::e_res2_2: le.set_e_res2(2,(quint16)nValue); break;
185 case N_LE_DOS_HEADER::e_res2_3: le.set_e_res2(3,(quint16)nValue); break;
186 case N_LE_DOS_HEADER::e_res2_4: le.set_e_res2(4,(quint16)nValue); break;
187 case N_LE_DOS_HEADER::e_res2_5: le.set_e_res2(5,(quint16)nValue); break;
188 case N_LE_DOS_HEADER::e_res2_6: le.set_e_res2(6,(quint16)nValue); break;
189 case N_LE_DOS_HEADER::e_res2_7: le.set_e_res2(7,(quint16)nValue); break;
190 case N_LE_DOS_HEADER::e_res2_8: le.set_e_res2(8,(quint16)nValue); break;
191 case N_LE_DOS_HEADER::e_res2_9: le.set_e_res2(9,(quint16)nValue); break;
192 case N_LE_DOS_HEADER::e_lfanew: le.set_e_lfanew((quint32)nValue); break;
193 }
194
195 ui->widgetHex_DOS_HEADER->reload();
196
197 break;
198
199 case SLE::TYPE_VXD_HEADER:
200 switch(nNdata)
201 {
202 case N_VXD_HEADER::e32_magic: le.setImageVxdHeader_magic((quint16)nValue); break;
203 case N_VXD_HEADER::e32_border: le.setImageVxdHeader_border((quint8)nValue); break;
204 case N_VXD_HEADER::e32_worder: le.setImageVxdHeader_worder((quint8)nValue); break;
205 case N_VXD_HEADER::e32_level: le.setImageVxdHeader_level((quint32)nValue); break;
206 case N_VXD_HEADER::e32_cpu: le.setImageVxdHeader_cpu((quint16)nValue); break;
207 case N_VXD_HEADER::e32_os: le.setImageVxdHeader_os((quint16)nValue); break;
208 case N_VXD_HEADER::e32_ver: le.setImageVxdHeader_ver((quint32)nValue); break;
209 case N_VXD_HEADER::e32_mflags: le.setImageVxdHeader_mflags((quint32)nValue); break;
210 case N_VXD_HEADER::e32_mpages: le.setImageVxdHeader_mpages((quint32)nValue); break;
211 case N_VXD_HEADER::e32_startobj: le.setImageVxdHeader_startobj((quint32)nValue); break;
212 case N_VXD_HEADER::e32_eip: le.setImageVxdHeader_eip((quint32)nValue); break;
213 case N_VXD_HEADER::e32_stackobj: le.setImageVxdHeader_stackobj((quint32)nValue); break;
214 case N_VXD_HEADER::e32_esp: le.setImageVxdHeader_esp((quint32)nValue); break;
215 case N_VXD_HEADER::e32_pagesize: le.setImageVxdHeader_pagesize((quint32)nValue); break;
216 case N_VXD_HEADER::e32_lastpagesize:le.setImageVxdHeader_lastpagesize((quint32)nValue); break;
217 case N_VXD_HEADER::e32_fixupsize: le.setImageVxdHeader_fixupsize((quint32)nValue); break;
218 case N_VXD_HEADER::e32_fixupsum: le.setImageVxdHeader_fixupsum((quint32)nValue); break;
219 case N_VXD_HEADER::e32_ldrsize: le.setImageVxdHeader_ldrsize((quint32)nValue); break;
220 case N_VXD_HEADER::e32_ldrsum: le.setImageVxdHeader_ldrsum((quint32)nValue); break;
221 case N_VXD_HEADER::e32_objtab: le.setImageVxdHeader_objtab((quint32)nValue); break;
222 case N_VXD_HEADER::e32_objcnt: le.setImageVxdHeader_objcnt((quint32)nValue); break;
223 case N_VXD_HEADER::e32_objmap: le.setImageVxdHeader_objmap((quint32)nValue); break;
224 case N_VXD_HEADER::e32_itermap: le.setImageVxdHeader_itermap((quint32)nValue); break;
225 case N_VXD_HEADER::e32_rsrctab: le.setImageVxdHeader_rsrctab((quint32)nValue); break;
226 case N_VXD_HEADER::e32_rsrccnt: le.setImageVxdHeader_rsrccnt((quint32)nValue); break;
227 case N_VXD_HEADER::e32_restab: le.setImageVxdHeader_restab((quint32)nValue); break;
228 case N_VXD_HEADER::e32_enttab: le.setImageVxdHeader_enttab((quint32)nValue); break;
229 case N_VXD_HEADER::e32_dirtab: le.setImageVxdHeader_dirtab((quint32)nValue); break;
230 case N_VXD_HEADER::e32_dircnt: le.setImageVxdHeader_dircnt((quint32)nValue); break;
231 case N_VXD_HEADER::e32_fpagetab: le.setImageVxdHeader_fpagetab((quint32)nValue); break;
232 case N_VXD_HEADER::e32_frectab: le.setImageVxdHeader_frectab((quint32)nValue); break;
233 case N_VXD_HEADER::e32_impmod: le.setImageVxdHeader_impmod((quint32)nValue); break;
234 case N_VXD_HEADER::e32_impmodcnt: le.setImageVxdHeader_impmodcnt((quint32)nValue); break;
235 case N_VXD_HEADER::e32_impproc: le.setImageVxdHeader_impproc((quint32)nValue); break;
236 case N_VXD_HEADER::e32_pagesum: le.setImageVxdHeader_pagesum((quint32)nValue); break;
237 case N_VXD_HEADER::e32_datapage: le.setImageVxdHeader_datapage((quint32)nValue); break;
238 case N_VXD_HEADER::e32_preload: le.setImageVxdHeader_preload((quint32)nValue); break;
239 case N_VXD_HEADER::e32_nrestab: le.setImageVxdHeader_nrestab((quint32)nValue); break;
240 case N_VXD_HEADER::e32_cbnrestab: le.setImageVxdHeader_cbnrestab((quint32)nValue); break;
241 case N_VXD_HEADER::e32_nressum: le.setImageVxdHeader_nressum((quint32)nValue); break;
242 case N_VXD_HEADER::e32_autodata: le.setImageVxdHeader_autodata((quint32)nValue); break;
243 case N_VXD_HEADER::e32_debuginfo: le.setImageVxdHeader_debuginfo((quint32)nValue); break;
244 case N_VXD_HEADER::e32_debuglen: le.setImageVxdHeader_debuglen((quint32)nValue); break;
245 case N_VXD_HEADER::e32_instpreload: le.setImageVxdHeader_instpreload((quint32)nValue); break;
246 case N_VXD_HEADER::e32_instdemand: le.setImageVxdHeader_instdemand((quint32)nValue); break;
247 case N_VXD_HEADER::e32_heapsize: le.setImageVxdHeader_heapsize((quint32)nValue); break;
248 }
249
250 ui->widgetHex_VXD_HEADER->reload();
251
252 break;
253 }
254
255 result=SV_EDITED;
256 }
257 }
258
259 blockSignals(false);
260
261 return result;
262 }
263
setReadonly(bool bState)264 void LEWidget::setReadonly(bool bState)
265 {
266 setLineEditsReadOnly(g_lineEdit_DOS_HEADER,N_LE_DOS_HEADER::__data_size,bState);
267 setLineEditsReadOnly(g_lineEdit_VXD_HEADER,N_VXD_HEADER::__data_size,bState);
268
269 setComboBoxesReadOnly(g_comboBox,__CB_size,bState);
270
271 ui->widgetHex->setReadonly(bState);
272 }
273
blockSignals(bool bState)274 void LEWidget::blockSignals(bool bState)
275 {
276 _blockSignals((QObject **)g_lineEdit_DOS_HEADER,N_LE_DOS_HEADER::__data_size,bState);
277 _blockSignals((QObject **)g_lineEdit_VXD_HEADER,N_VXD_HEADER::__data_size,bState);
278
279 _blockSignals((QObject **)g_comboBox,__CB_size,bState);
280 }
281
adjustHeaderTable(int nType,QTableWidget * pTableWidget)282 void LEWidget::adjustHeaderTable(int nType, QTableWidget *pTableWidget)
283 {
284 // TODO like MACH !!!
285 Q_UNUSED(nType)
286
287 int nSymbolWidth=XLineEditHEX::getSymbolWidth(this);
288
289 pTableWidget->horizontalHeader()->setSectionResizeMode(HEADER_COLUMN_NAME,QHeaderView::ResizeToContents);
290 pTableWidget->horizontalHeader()->setSectionResizeMode(HEADER_COLUMN_OFFSET,QHeaderView::ResizeToContents);
291 pTableWidget->horizontalHeader()->setSectionResizeMode(HEADER_COLUMN_TYPE,QHeaderView::ResizeToContents);
292 pTableWidget->setColumnWidth(HEADER_COLUMN_VALUE,nSymbolWidth*12);
293 pTableWidget->setColumnWidth(HEADER_COLUMN_INFO,nSymbolWidth*15);
294 }
295
reloadData()296 void LEWidget::reloadData()
297 {
298 int nType=ui->treeWidgetNavi->currentItem()->data(0,Qt::UserRole+FW_DEF::SECTION_DATA_TYPE).toInt();
299 qint64 nDataOffset=ui->treeWidgetNavi->currentItem()->data(0,Qt::UserRole+FW_DEF::SECTION_DATA_OFFSET).toLongLong();
300 qint64 nDataSize=ui->treeWidgetNavi->currentItem()->data(0,Qt::UserRole+FW_DEF::SECTION_DATA_SIZE).toLongLong();
301
302 QString sInit=getInitString(ui->treeWidgetNavi->currentItem());
303
304 ui->stackedWidgetInfo->setCurrentIndex(nType);
305
306 XLE le(getDevice(),getOptions().bIsImage,getOptions().nImageBase);
307
308 if(le.isValid())
309 {
310 if(nType==SLE::TYPE_HEX)
311 {
312 if(!isInitPresent(sInit))
313 {
314 XHexView::OPTIONS options={};
315 options.bMenu_Disasm=true;
316 options.bMenu_MemoryMap=true;
317 options.sSignaturesPath=getOptions().sSearchSignaturesPath;
318 ui->widgetHex->setData(getDevice(),options);
319 // ui->widgetHex->setBackupFileName(getOptions().sBackupFileName);
320 ui->widgetHex->enableReadOnly(false);
321
322 ui->widgetHex->reload();
323 }
324 }
325 else if(nType==SLE::TYPE_DISASM)
326 {
327 if(!isInitPresent(sInit))
328 {
329 XMultiDisasmWidget::OPTIONS options={};
330 options.fileType=le.getFileType();
331 options.nInitAddress=le.getEntryPointAddress();
332 options.sSignaturesPath=getOptions().sSearchSignaturesPath;
333
334 ui->widgetDisasm->setData(getDevice(),options);
335 }
336 }
337 else if(nType==SLE::TYPE_STRINGS)
338 {
339 if(!isInitPresent(sInit))
340 {
341 SearchStringsWidget::OPTIONS stringsOptions={};
342 stringsOptions.bMenu_Hex=true;
343 stringsOptions.bMenu_Demangle=true;
344 stringsOptions.bAnsi=true;
345 stringsOptions.bUTF8=false;
346 stringsOptions.bUnicode=true;
347
348 ui->widgetStrings->setData(getDevice(),stringsOptions,true);
349 }
350 }
351 else if(nType==SLE::TYPE_MEMORYMAP)
352 {
353 if(!isInitPresent(sInit))
354 {
355 ui->widgetMemoryMap->setData(getDevice(),le.getFileType(),getOptions().sSearchSignaturesPath);
356 }
357 }
358 else if(nType==SLE::TYPE_ENTROPY)
359 {
360 if(!isInitPresent(sInit))
361 {
362 ui->widgetEntropy->setData(getDevice(),0,getDevice()->size(),le.getFileType(),true);
363 }
364 }
365 else if(nType==SLE::TYPE_HEURISTICSCAN)
366 {
367 if(!isInitPresent(sInit))
368 {
369 ui->widgetHeuristicScan->setData(getDevice(),true,le.getFileType());
370 }
371 }
372 else if(nType==SLE::TYPE_DOS_HEADER)
373 {
374 if(!isInitPresent(sInit))
375 {
376 createHeaderTable(SLE::TYPE_DOS_HEADER,ui->tableWidget_DOS_HEADER,N_LE_DOS_HEADER::records,g_lineEdit_DOS_HEADER,N_LE_DOS_HEADER::__data_size,0);
377 g_comboBox[CB_DOS_HEADER_e_magic]=createComboBox(ui->tableWidget_DOS_HEADER,XMSDOS::getImageMagicsS(),SLE::TYPE_DOS_HEADER,N_LE_DOS_HEADER::e_magic,XComboBoxEx::CBTYPE_LIST);
378 g_invWidget[INV_DOS_HEADER_e_lfanew]=createInvWidget(ui->tableWidget_DOS_HEADER,SLE::TYPE_DOS_HEADER,N_LE_DOS_HEADER::e_lfanew,InvWidget::TYPE_HEX);
379 blockSignals(true);
380
381 XMSDOS_DEF::IMAGE_DOS_HEADEREX msdosheaderex=le.getDosHeaderEx();
382
383 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_magic]->setValue(msdosheaderex.e_magic);
384 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_cblp]->setValue(msdosheaderex.e_cblp);
385 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_cp]->setValue(msdosheaderex.e_cp);
386 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_crlc]->setValue(msdosheaderex.e_crlc);
387 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_cparhdr]->setValue(msdosheaderex.e_cparhdr);
388 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_minalloc]->setValue(msdosheaderex.e_minalloc);
389 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_maxalloc]->setValue(msdosheaderex.e_maxalloc);
390 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_ss]->setValue(msdosheaderex.e_ss);
391 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_sp]->setValue(msdosheaderex.e_sp);
392 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_csum]->setValue(msdosheaderex.e_csum);
393 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_ip]->setValue(msdosheaderex.e_ip);
394 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_cs]->setValue(msdosheaderex.e_cs);
395 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_lfarlc]->setValue(msdosheaderex.e_lfarlc);
396 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_ovno]->setValue(msdosheaderex.e_ovno);
397 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res_0]->setValue(msdosheaderex.e_res[0]);
398 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res_1]->setValue(msdosheaderex.e_res[1]);
399 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res_2]->setValue(msdosheaderex.e_res[2]);
400 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res_3]->setValue(msdosheaderex.e_res[3]);
401 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_oemid]->setValue(msdosheaderex.e_oemid);
402 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_oeminfo]->setValue(msdosheaderex.e_oeminfo);
403 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_0]->setValue(msdosheaderex.e_res2[0]);
404 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_1]->setValue(msdosheaderex.e_res2[1]);
405 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_2]->setValue(msdosheaderex.e_res2[2]);
406 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_3]->setValue(msdosheaderex.e_res2[3]);
407 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_4]->setValue(msdosheaderex.e_res2[4]);
408 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_5]->setValue(msdosheaderex.e_res2[5]);
409 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_6]->setValue(msdosheaderex.e_res2[6]);
410 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_7]->setValue(msdosheaderex.e_res2[7]);
411 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_8]->setValue(msdosheaderex.e_res2[8]);
412 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_res2_9]->setValue(msdosheaderex.e_res2[9]);
413 g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_lfanew]->setValue(msdosheaderex.e_lfanew);
414
415 g_comboBox[CB_DOS_HEADER_e_magic]->setValue(msdosheaderex.e_magic);
416
417 g_invWidget[INV_DOS_HEADER_e_lfanew]->setOffsetAndSize(&le,msdosheaderex.e_lfanew,0);
418
419 qint64 nOffset=le.getDosHeaderExOffset();
420 qint64 nSize=le.getDosHeaderExSize();
421
422 loadHexSubdevice(nOffset,nSize,nOffset,&g_subDevice[SLE::TYPE_DOS_HEADER],ui->widgetHex_DOS_HEADER);
423
424 blockSignals(false);
425 }
426 }
427 else if(nType==SLE::TYPE_VXD_HEADER)
428 {
429 if(!isInitPresent(sInit))
430 {
431 createHeaderTable(SLE::TYPE_VXD_HEADER,ui->tableWidget_VXD_HEADER,N_VXD_HEADER::records,g_lineEdit_VXD_HEADER,N_VXD_HEADER::__data_size,0);
432 g_comboBox[CB_VXD_HEADER_e32_magic]=createComboBox(ui->tableWidget_VXD_HEADER,XLE::getImageLEMagicsS(),SLE::TYPE_VXD_HEADER,N_VXD_HEADER::e32_magic,XComboBoxEx::CBTYPE_LIST);
433 g_comboBox[CB_VXD_HEADER_e32_cpu]=createComboBox(ui->tableWidget_VXD_HEADER,XLE::getImageLECpusS(),SLE::TYPE_VXD_HEADER,N_VXD_HEADER::e32_cpu,XComboBoxEx::CBTYPE_LIST);
434 g_comboBox[CB_VXD_HEADER_e32_os]=createComboBox(ui->tableWidget_VXD_HEADER,XLE::getImageLEOssS(),SLE::TYPE_VXD_HEADER,N_VXD_HEADER::e32_os,XComboBoxEx::CBTYPE_LIST);
435
436 blockSignals(true);
437
438 XLE_DEF::IMAGE_VXD_HEADER vxdheader=le.getImageVxdHeader();
439
440 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_magic]->setValue(vxdheader.e32_magic);
441 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_border]->setValue(vxdheader.e32_border);
442 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_worder]->setValue(vxdheader.e32_worder);
443 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_level]->setValue(vxdheader.e32_level);
444 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_cpu]->setValue(vxdheader.e32_cpu);
445 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_os]->setValue(vxdheader.e32_os);
446 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_ver]->setValue(vxdheader.e32_ver);
447 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_mflags]->setValue(vxdheader.e32_mflags);
448 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_mpages]->setValue(vxdheader.e32_mpages);
449 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_startobj]->setValue(vxdheader.e32_startobj);
450 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_eip]->setValue(vxdheader.e32_eip);
451 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_stackobj]->setValue(vxdheader.e32_stackobj);
452 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_esp]->setValue(vxdheader.e32_esp);
453 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_pagesize]->setValue(vxdheader.e32_pagesize);
454 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_lastpagesize]->setValue(vxdheader.e32_lastpagesize);
455 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_fixupsize]->setValue(vxdheader.e32_fixupsize);
456 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_fixupsum]->setValue(vxdheader.e32_fixupsum);
457 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_ldrsize]->setValue(vxdheader.e32_ldrsize);
458 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_ldrsum]->setValue(vxdheader.e32_ldrsum);
459 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_objtab]->setValue(vxdheader.e32_objtab);
460 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_objcnt]->setValue(vxdheader.e32_objcnt);
461 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_objmap]->setValue(vxdheader.e32_objmap);
462 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_itermap]->setValue(vxdheader.e32_itermap);
463 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_rsrctab]->setValue(vxdheader.e32_rsrctab);
464 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_rsrccnt]->setValue(vxdheader.e32_rsrccnt);
465 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_restab]->setValue(vxdheader.e32_restab);
466 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_enttab]->setValue(vxdheader.e32_enttab);
467 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_dirtab]->setValue(vxdheader.e32_dirtab);
468 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_dircnt]->setValue(vxdheader.e32_dircnt);
469 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_fpagetab]->setValue(vxdheader.e32_fpagetab);
470 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_frectab]->setValue(vxdheader.e32_frectab);
471 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_impmod]->setValue(vxdheader.e32_impmod);
472 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_impmodcnt]->setValue(vxdheader.e32_impmodcnt);
473 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_impproc]->setValue(vxdheader.e32_impproc);
474 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_pagesum]->setValue(vxdheader.e32_pagesum);
475 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_datapage]->setValue(vxdheader.e32_datapage);
476 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_preload]->setValue(vxdheader.e32_preload);
477 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_nrestab]->setValue(vxdheader.e32_nrestab);
478 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_cbnrestab]->setValue(vxdheader.e32_cbnrestab);
479 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_nressum]->setValue(vxdheader.e32_nressum);
480 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_autodata]->setValue(vxdheader.e32_autodata);
481 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_debuginfo]->setValue(vxdheader.e32_debuginfo);
482 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_debuglen]->setValue(vxdheader.e32_debuglen);
483 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_instpreload]->setValue(vxdheader.e32_instpreload);
484 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_instdemand]->setValue(vxdheader.e32_instdemand);
485 g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_heapsize]->setValue(vxdheader.e32_heapsize);
486
487 g_comboBox[CB_VXD_HEADER_e32_magic]->setValue(vxdheader.e32_magic);
488 g_comboBox[CB_VXD_HEADER_e32_cpu]->setValue(vxdheader.e32_cpu);
489 g_comboBox[CB_VXD_HEADER_e32_os]->setValue(vxdheader.e32_os);
490
491 qint64 nOffset=le.getImageVxdHeaderOffset();
492 qint64 nSize=le.getImageVxdHeaderSize();
493
494 loadHexSubdevice(nOffset,nSize,nOffset,&g_subDevice[SLE::TYPE_VXD_HEADER],ui->widgetHex_VXD_HEADER);
495
496 blockSignals(false);
497 }
498 }
499 else if(nType==SLE::TYPE_OBJECTS)
500 {
501 if(!isInitPresent(sInit))
502 {
503 LEProcessData leProcessData(SLE::TYPE_OBJECTS,&g_tvModel[SLE::TYPE_OBJECTS],&le,nDataOffset,nDataSize);
504
505 ajustTableView(&leProcessData,&g_tvModel[SLE::TYPE_OBJECTS],ui->tableView_Objects);
506
507 connect(ui->tableView_Objects->selectionModel(),SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),this,SLOT(onTableView_Objects_currentRowChanged(QModelIndex,QModelIndex)));
508
509 if(g_tvModel[SLE::TYPE_OBJECTS]->rowCount())
510 {
511 ui->tableView_Objects->setCurrentIndex(ui->tableView_Objects->model()->index(0,0));
512 }
513 }
514 }
515 else if(nType==SLE::TYPE_OVERLAY)
516 {
517 qint64 nOverLayOffset=le.getOverlayOffset();
518 qint64 nOverlaySize=le.getOverlaySize();
519
520 loadHexSubdevice(nOverLayOffset,nOverlaySize,nOverLayOffset,&g_subDevice[SLE::TYPE_OVERLAY],ui->widgetHex_OVERLAY);
521 }
522
523 setReadonly(ui->checkBoxReadonly->isChecked());
524 }
525
526 addInit(sInit);
527 }
528
widgetValueChanged(quint64 nValue)529 void LEWidget::widgetValueChanged(quint64 nValue)
530 {
531 QWidget *pWidget=qobject_cast<QWidget *>(sender());
532 int nStype=pWidget->property("STYPE").toInt();
533 int nNdata=pWidget->property("NDATA").toInt();
534
535 switch(nStype)
536 {
537 case SLE::TYPE_DOS_HEADER:
538 switch(nNdata)
539 {
540 case N_LE_DOS_HEADER::e_magic: g_lineEdit_DOS_HEADER[N_LE_DOS_HEADER::e_magic]->setValue((quint16)nValue); break;
541 }
542 break;
543 case SLE::TYPE_VXD_HEADER:
544 switch(nNdata)
545 {
546 case N_VXD_HEADER::e32_magic: g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_magic]->setValue((quint16)nValue); break;
547 case N_VXD_HEADER::e32_cpu: g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_cpu]->setValue((quint16)nValue); break;
548 case N_VXD_HEADER::e32_os: g_lineEdit_VXD_HEADER[N_VXD_HEADER::e32_os]->setValue((quint16)nValue); break;
549 }
550 break;
551 }
552 }
553
on_treeWidgetNavi_currentItemChanged(QTreeWidgetItem * pCurrent,QTreeWidgetItem * pPrevious)554 void LEWidget::on_treeWidgetNavi_currentItemChanged(QTreeWidgetItem *pCurrent, QTreeWidgetItem *pPrevious)
555 {
556 Q_UNUSED(pPrevious)
557
558 if(pCurrent)
559 {
560 reloadData();
561 addPage(pCurrent);
562 ui->toolButtonPrev->setEnabled(isPrevPageAvailable());
563 ui->toolButtonNext->setEnabled(isNextPageAvailable());
564 }
565 }
566
on_checkBoxReadonly_toggled(bool bChecked)567 void LEWidget::on_checkBoxReadonly_toggled(bool bChecked)
568 {
569 setReadonly(bChecked);
570 }
571
on_pushButtonReload_clicked()572 void LEWidget::on_pushButtonReload_clicked()
573 {
574 ui->pushButtonReload->setEnabled(false);
575 reload();
576
577 QTimer::singleShot(1000,this,SLOT(enableButton())); // TODO const
578 }
579
enableButton()580 void LEWidget::enableButton()
581 {
582 ui->pushButtonReload->setEnabled(true);
583 }
584
on_tableWidget_DOS_HEADER_currentCellChanged(int nCurrentRow,int nCurrentColumn,int nPreviousRow,int nPreviousColumn)585 void LEWidget::on_tableWidget_DOS_HEADER_currentCellChanged(int nCurrentRow, int nCurrentColumn, int nPreviousRow, int nPreviousColumn)
586 {
587 Q_UNUSED(nCurrentRow)
588 Q_UNUSED(nCurrentColumn)
589 Q_UNUSED(nPreviousRow)
590 Q_UNUSED(nPreviousColumn)
591
592 setHeaderTableSelection(ui->widgetHex_DOS_HEADER,ui->tableWidget_DOS_HEADER);
593 }
594
on_tableWidget_VXD_HEADER_currentCellChanged(int nCurrentRow,int nCurrentColumn,int nPreviousRow,int nPreviousColumn)595 void LEWidget::on_tableWidget_VXD_HEADER_currentCellChanged(int nCurrentRow, int nCurrentColumn, int nPreviousRow, int nPreviousColumn)
596 {
597 Q_UNUSED(nCurrentRow)
598 Q_UNUSED(nCurrentColumn)
599 Q_UNUSED(nPreviousRow)
600 Q_UNUSED(nPreviousColumn)
601
602 setHeaderTableSelection(ui->widgetHex_VXD_HEADER,ui->tableWidget_VXD_HEADER);
603 }
604
on_tableView_Objects_customContextMenuRequested(const QPoint & pos)605 void LEWidget::on_tableView_Objects_customContextMenuRequested(const QPoint &pos)
606 {
607 int nRow=ui->tableView_Objects->currentIndex().row();
608
609 if(nRow!=-1)
610 {
611 bool bIsEnable=getTableViewItemSize(ui->tableView_Objects);
612
613 QMenu contextMenu(this);
614
615 QAction actionEdit(tr("Edit"),this);
616 // connect(&actionEdit, SIGNAL(triggered()), this, SLOT(editSectionHeader()));
617 contextMenu.addAction(&actionEdit);
618
619 QAction actionHex(tr("Hex"),this);
620 // connect(&actionHex, SIGNAL(triggered()), this, SLOT(sectionHex()));
621 actionHex.setEnabled(bIsEnable);
622 contextMenu.addAction(&actionHex);
623
624 QAction actionEntropy(tr("Entropy"),this);
625 // connect(&actionEntropy, SIGNAL(triggered()), this, SLOT(sectionEntropy()));
626 actionHex.setEnabled(bIsEnable);
627 contextMenu.addAction(&actionEntropy);
628
629 contextMenu.exec(ui->tableView_Objects->viewport()->mapToGlobal(pos));
630 }
631 }
632
on_tableView_Objects_doubleClicked(const QModelIndex & index)633 void LEWidget::on_tableView_Objects_doubleClicked(const QModelIndex &index)
634 {
635 Q_UNUSED(index)
636
637 // editSectionHeader();
638 }
639
onTableView_Objects_currentRowChanged(const QModelIndex & current,const QModelIndex & previous)640 void LEWidget::onTableView_Objects_currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous)
641 {
642 Q_UNUSED(current)
643 Q_UNUSED(previous)
644
645 loadHexSubdeviceByTableView(current.row(),SLE::TYPE_OBJECTS,ui->widgetHex_Object,ui->tableView_Objects,&g_subDevice[SLE::TYPE_OBJECTS]);
646 }
647
on_toolButtonPrev_clicked()648 void LEWidget::on_toolButtonPrev_clicked()
649 {
650 setAddPageEnabled(false);
651 ui->treeWidgetNavi->setCurrentItem(getPrevPage());
652 setAddPageEnabled(true);
653 }
654
on_toolButtonNext_clicked()655 void LEWidget::on_toolButtonNext_clicked()
656 {
657 setAddPageEnabled(false);
658 ui->treeWidgetNavi->setCurrentItem(getNextPage());
659 setAddPageEnabled(true);
660 }
661