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 &current, 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