1
0
Fork 0

Fix multiple issues (#730)

* GUI: invalidate font cache

* Fix incorrect logical sequence

* GUI: fix #257 (MMX,XMM,YMM show as little endian)

* GUI: fix #257(MMX,XMM,YMM show as little endian)

* GUI: fix #257(MMX,XMM,YMM show as little endian)

* GUI: fix #257(MMX,XMM,YMM show as little endian)

* GUI: fix #257(MMX,XMM,YMM show as little endian)

* GUI: fix #257 and #701

* GUI: fix #257(MMX,XMM,YMM show as little endian)

* Save column widths

* Save column widths

* translate this file

* Save column widths

* translate this file

* Save column widths

* Save column widths

* Save column widths

* Save column widths

* Save column widths

* Save column widths

* Save column widths

* Save column widths

* Save column widths

* Save column widths

* Save column widths

* Save column widths

main window have to be stored in a pointer now because column widths are saved only at destructors.

* Save column widths
This commit is contained in:
Torusrxxx 2016-06-08 21:52:13 +00:00 committed by Duncan Ogilvie
parent e4920c72a8
commit ab4df7e600
23 changed files with 203 additions and 13 deletions

View File

@ -51,6 +51,12 @@ AbstractTableView::AbstractTableView(QWidget* parent)
Initialize();
}
AbstractTableView::~AbstractTableView()
{
if(ConfigBool("Gui", "SaveColumnOrder"))
saveColumnToConfig();
}
/************************************************************************************
Configuration
************************************************************************************/
@ -109,6 +115,48 @@ void AbstractTableView::slot_updateShortcuts()
updateShortcuts();
}
void AbstractTableView::loadColumnFromConfig(const QString& viewName)
{
int columnCount = getColumnCount();
for(int i = 0; i < columnCount; i++)
{
duint width = ConfigUint("Gui", QString("%1ColumnWidth%2").arg(viewName).arg(i).toUtf8().constData());
duint hidden = ConfigUint("Gui", QString("%1ColumnHidden%2").arg(viewName).arg(i).toUtf8().constData());
duint order = ConfigUint("Gui", QString("%1ColumnOrder%2").arg(viewName).arg(i).toUtf8().constData());
if(width != 0)
setColumnWidth(i, width);
if(hidden != 2)
setColumnHidden(i, !!hidden);
if(order != 0)
mColumnOrder[i] = order - 1;
}
mViewName = viewName;
}
void AbstractTableView::saveColumnToConfig()
{
if(mViewName.length() == 0)
return;
int columnCount = getColumnCount();
auto cfg = Config();
for(int i = 0; i < columnCount; i++)
{
cfg->setUint("Gui", QString("%1ColumnWidth%2").arg(mViewName).arg(i).toUtf8().constData(), getColumnWidth(i));
cfg->setUint("Gui", QString("%1ColumnHidden%2").arg(mViewName).arg(i).toUtf8().constData(), getColumnHidden(i) ? 1 : 0);
cfg->setUint("Gui", QString("%1ColumnOrder%2").arg(mViewName).arg(i).toUtf8().constData(), mColumnOrder[i] + 1);
}
}
void AbstractTableView::setupColumnConfigDefaultValue(QMap<QString, duint>& map, const QString& viewName, int columnCount)
{
for(int i = 0; i < columnCount; i++)
{
map.insert(QString("%1ColumnWidth%2").arg(viewName).arg(i), 0);
map.insert(QString("%1ColumnHidden%2").arg(viewName).arg(i), 2);
map.insert(QString("%1ColumnOrder%2").arg(viewName).arg(i), 0);
}
}
/************************************************************************************
Painting Stuff
************************************************************************************/

View File

@ -47,6 +47,7 @@ public:
// Constructor
explicit AbstractTableView(QWidget* parent = 0);
~AbstractTableView();
// Configuration
virtual void Initialize();
@ -104,6 +105,13 @@ public:
void setNbrOfLineToPrint(int parNbrOfLineToPrint);
void setShowHeader(bool show);
int getCharWidth();
bool getColumnHidden(int col);
void setColumnHidden(int col, bool hidden);
// UI customization
void loadColumnFromConfig(const QString& viewName);
void saveColumnToConfig();
static void setupColumnConfigDefaultValue(QMap<QString, duint>& map, const QString& viewName, int columnCount);
// Content drawing control
bool getDrawDebugOnly();
@ -201,8 +209,6 @@ private:
ScrollBar64_t mScrollBarAttributes;
int getColumnDisplayIndexFromX(int x);
bool getColumnHidden(int col);
void setColumnHidden(int col, bool hidden);
friend class ColumnReorderDialog;
protected:
bool mAllowPainting;
@ -214,6 +220,7 @@ protected:
QColor separatorColor;
QColor headerTextColor;
QColor selectionColor;
QString mViewName;
// Font metrics
CachedFontMetrics* mFontMetrics;

View File

@ -55,6 +55,7 @@ void HexDump::updateColors()
void HexDump::updateFonts()
{
setFont(ConfigFont("HexDump"));
invalidateCachedFont();
}
void HexDump::updateShortcuts()

View File

@ -20,6 +20,7 @@ BreakpointsView::BreakpointsView(QWidget* parent) : QWidget(parent)
mSoftBPTable->addColumnAt(8 + wCharWidth * 2, tr("Fast resume"), false);
mSoftBPTable->addColumnAt(8 + wCharWidth * 16, tr("Command on hit"), false);
mSoftBPTable->addColumnAt(wCharWidth * 10, tr("Comment"), false);
mSoftBPTable->loadColumnFromConfig("SoftwareBreakpoint");
// Hardware
mHardBPTable = new StdTable(this);
@ -34,6 +35,7 @@ BreakpointsView::BreakpointsView(QWidget* parent) : QWidget(parent)
mHardBPTable->addColumnAt(8 + wCharWidth * 2, tr("Fast resume"), false);
mHardBPTable->addColumnAt(8 + wCharWidth * 16, tr("Command on hit"), false);
mHardBPTable->addColumnAt(wCharWidth * 10, tr("Comment"), false);
mHardBPTable->loadColumnFromConfig("HardwareBreakpoint");
// Memory
mMemBPTable = new StdTable(this);
@ -48,6 +50,7 @@ BreakpointsView::BreakpointsView(QWidget* parent) : QWidget(parent)
mMemBPTable->addColumnAt(8 + wCharWidth * 2, tr("Fast resume"), false);
mMemBPTable->addColumnAt(8 + wCharWidth * 16, tr("Command on hit"), false);
mMemBPTable->addColumnAt(wCharWidth * 10, tr("Comment"), false);
mMemBPTable->loadColumnFromConfig("MemoryBreakpoint");
// Splitter
mSplitter = new QSplitter(this);

View File

@ -443,7 +443,7 @@ void CPUDisassembly::setupRightClickContextMenu()
MenuBuilder* mSearchAllMenu = new MenuBuilder(this);
// Search in Current Region menu
mFindCommandRegion = makeShortcutAction("C&ommand", SLOT(findCommandSlot()), "ActionFind");
mFindCommandRegion = makeShortcutAction(tr("C&ommand"), SLOT(findCommandSlot()), "ActionFind");
mFindConstantRegion = makeAction(tr("&Constant"), SLOT(findConstantSlot()));
mFindStringsRegion = makeAction(tr("&String references"), SLOT(findStringsSlot()));
mFindCallsRegion = makeAction(tr("&Intermodular calls"), SLOT(findCallsSlot()));

View File

@ -13,6 +13,7 @@ CPUMultiDump::CPUMultiDump(CPUDisassembly* disas, int nbCpuDumpTabs, QWidget* pa
for(uint i = 0; i < mMaxCPUDumpTabs; i++)
{
CPUDump* cpuDump = new CPUDump(disas, this);
cpuDump->loadColumnFromConfig(QString("CPUDump%1").arg(i + 1));
connect(cpuDump, SIGNAL(displayReferencesWidget()), this, SLOT(displayReferencesWidgetSlot()));
this->addTabEx(cpuDump, QIcon(":/icons/images/dump.png"), tr("Dump ") + QString::number(i + 1), QString("Dump ") + QString::number(i + 1));
}

View File

@ -69,6 +69,10 @@ CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget)
mStack = new CPUStack(mDump, 0); //stack widget
ui->mBotRightFrameLayout->addWidget(mStack);
// load column config
mDisas->loadColumnFromConfig("CPUDisassembly");
mStack->loadColumnFromConfig("CPUStack");
}
CPUWidget::~CPUWidget()

View File

@ -9,6 +9,7 @@ CallStackView::CallStackView(StdTable* parent) : StdTable(parent)
addColumnAt(8 + charwidth * sizeof(dsint) * 2, tr("To"), true); //return to
addColumnAt(8 + charwidth * sizeof(dsint) * 2, tr("From"), true); //return from
addColumnAt(0, tr("Comment"), true);
loadColumnFromConfig("CallStack");
connect(Bridge::getBridge(), SIGNAL(updateCallStack()), this, SLOT(updateCallStack()));
connect(this, SIGNAL(contextMenuSignal(QPoint)), this, SLOT(contextMenuSlot(QPoint)));

View File

@ -13,6 +13,7 @@ HandlesView::HandlesView(QWidget* parent) : QWidget(parent)
mHandlesTable->addColumnAt(8 + sizeof(duint) * 2 * wCharWidth, tr("Handle"), false);
mHandlesTable->addColumnAt(8 + 16 * wCharWidth, tr("Access"), false);
mHandlesTable->addColumnAt(8 + wCharWidth * 20, tr("Name"), false);
mHandlesTable->loadColumnFromConfig("Handle");
mTcpConnectionsTable = new StdTable(this);
mTcpConnectionsTable->setDrawDebugOnly(true);
@ -20,12 +21,14 @@ HandlesView::HandlesView(QWidget* parent) : QWidget(parent)
mTcpConnectionsTable->addColumnAt(8 + 64 * wCharWidth, tr("Remote address"), false);
mTcpConnectionsTable->addColumnAt(8 + 64 * wCharWidth, tr("Local address"), false);
mTcpConnectionsTable->addColumnAt(8 + 8 * wCharWidth, tr("State", "TcpConnection"), false);
mTcpConnectionsTable->loadColumnFromConfig("TcpConnection");
mPrivilegesTable = new StdTable(this);
mPrivilegesTable->setDrawDebugOnly(true);
mPrivilegesTable->setContextMenuPolicy(Qt::CustomContextMenu);
mPrivilegesTable->addColumnAt(8 + 32 * wCharWidth, tr("Privilege"), false);
mPrivilegesTable->addColumnAt(8 + 16 * wCharWidth, tr("State", "Privilege"), false);
mPrivilegesTable->loadColumnFromConfig("Privilege");
// Splitter
mSplitter = new QSplitter(this);

View File

@ -21,6 +21,7 @@ MemoryMapView::MemoryMapView(StdTable* parent) : StdTable(parent)
addColumnAt(8 + charwidth * 11, tr("Protection"), false, tr("Current Protection")); //current protection
addColumnAt(8 + charwidth * 8, tr("Initial"), false, tr("Allocation Protection")); //allocation protection
addColumnAt(100, "", false);
loadColumnFromConfig("MemoryMap");
connect(Bridge::getBridge(), SIGNAL(updateMemory()), this, SLOT(refreshMap()));
connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(stateChangedSlot(DBGSTATE)));

View File

@ -7,6 +7,7 @@
#include "LineEditDialog.h"
#include "EditFloatRegister.h"
#include "SelectFields.h"
#include "MiscUtil.h"
int RegistersView::getEstimateHeight()
{
@ -1168,6 +1169,7 @@ void RegistersView::fontsUpdatedSlot()
wRowsHeight = (wRowsHeight % 2) == 0 ? wRowsHeight : wRowsHeight + 1;
mRowHeight = wRowsHeight;
mCharWidth = QFontMetrics(this->font()).averageCharWidth();
setFixedHeight(getEstimateHeight());
repaint();
}
@ -1438,7 +1440,12 @@ QString RegistersView::GetRegStringValueFromValue(REGISTER_NAME reg, char* value
{
SIZE_T size = GetSizeRegister(reg);
if(size != 0)
valueText = QString(QByteArray(value, size).toHex()).toUpper();
{
if(ConfigBool("Gui", "FpuRegistersLittleEndian"))
valueText = QString(QByteArray(value, size).toHex()).toUpper();
else
valueText = QString(ByteReverse(QByteArray(value, size)).toHex()).toUpper();
}
else
valueText = QString("???");
}

View File

@ -12,6 +12,7 @@ SEHChainView::SEHChainView(StdTable* parent) : StdTable(parent)
connect(Bridge::getBridge(), SIGNAL(updateSEHChain()), this, SLOT(updateSEHChain()));
connect(this, SIGNAL(contextMenuSignal(QPoint)), this, SLOT(contextMenuSlot(QPoint)));
connect(this, SIGNAL(doubleClickedSignal()), this, SLOT(doubleClickedSlot()));
loadColumnFromConfig("SEH");
setupContextMenu();
}

View File

@ -17,6 +17,7 @@ ScriptView::ScriptView(StdTable* parent) : StdTable(parent)
addColumnAt(8 + charwidth * 4, tr("Line"), false);
addColumnAt(8 + charwidth * 60, tr("Text"), false);
addColumnAt(8 + charwidth * 40, tr("Info"), false);
loadColumnFromConfig("Script");
setIp(0); //no IP

View File

@ -173,6 +173,12 @@ void SettingsDialog::LoadSettings()
ui->chkOnlyCipAutoComments->setChecked(settings.disasmOnlyCipAutoComments);
ui->chkTabBetweenMnemonicAndArguments->setChecked(settings.disasmTabBetweenMnemonicAndArguments);
//Gui tab
GetSettingBool("Gui", "FpuRegistersLittleEndian", &settings.guiFpuRegistersLittleEndian);
GetSettingBool("Gui", "SaveColumnOrder", &settings.guiSaveColumnOrder);
ui->chkFpuRegistersLittleEndian->setChecked(settings.guiFpuRegistersLittleEndian);
ui->chkSaveColumnOrder->setChecked(settings.guiSaveColumnOrder);
//Misc tab
if(DbgFunctions()->GetJit)
{
@ -276,6 +282,10 @@ void SettingsDialog::SaveSettings()
BridgeSettingSetUint("Disassembler", "OnlyCipAutoComments", settings.disasmOnlyCipAutoComments);
BridgeSettingSetUint("Disassembler", "TabbedMnemonic", settings.disasmTabBetweenMnemonicAndArguments);
//Gui tab
BridgeSettingSetUint("Gui", "FpuRegistersLittleEndian", settings.guiFpuRegistersLittleEndian);
BridgeSettingSetUint("Gui", "SaveColumnOrder", settings.guiSaveColumnOrder);
//Misc tab
if(DbgFunctions()->GetJit)
{
@ -648,3 +658,19 @@ void SettingsDialog::on_chkSaveLoadTabOrder_stateChanged(int arg1)
emit chkSaveLoadTabOrderStateChanged((bool)arg1);
}
void SettingsDialog::on_chkFpuRegistersLittleEndian_stateChanged(int arg1)
{
if(arg1 == Qt::Unchecked)
settings.guiFpuRegistersLittleEndian = false;
else
settings.guiFpuRegistersLittleEndian = true;
}
void SettingsDialog::on_chkSaveColumnOrder_stateChanged(int arg1)
{
if(arg1 == Qt::Unchecked)
settings.guiSaveColumnOrder = false;
else
settings.guiSaveColumnOrder = true;
}

View File

@ -59,6 +59,9 @@ private slots:
void on_chkUppercase_stateChanged(int arg1);
void on_chkOnlyCipAutoComments_stateChanged(int arg1);
void on_chkTabBetweenMnemonicAndArguments_stateChanged(int arg1);
//Gui Tab
void on_chkFpuRegistersLittleEndian_stateChanged(int arg1);
void on_chkSaveColumnOrder_stateChanged(int arg1);
//Misc tab
void on_chkSetJIT_stateChanged(int arg1);
void on_chkConfirmBeforeAtt_stateChanged(int arg1);
@ -127,6 +130,9 @@ private:
bool disasmUppercase;
bool disasmOnlyCipAutoComments;
bool disasmTabBetweenMnemonicAndArguments;
//Gui Tab
bool guiFpuRegistersLittleEndian;
bool guiSaveColumnOrder;
//Misc Tab
bool miscSetJIT;
bool miscSetJITAuto;

View File

@ -434,6 +434,46 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tabGui">
<attribute name="title">
<string>GUI</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QCheckBox" name="chkFpuRegistersLittleEndian">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Show FPU registers as little endian</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkSaveColumnOrder">
<property name="text">
<string>Save column order and width</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_7">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabMisc">
<attribute name="title">
<string>Misc</string>

View File

@ -34,7 +34,7 @@ void StatusLabel::debugStateChangedSlot(DBGSTATE state)
this->setStyleSheet("QLabel { background-color : #ffff00; }");
break;
case running:
this->setText("Running");
this->setText(tr("Running"));
this->setStyleSheet("QLabel { background-color : #c0c0c0; }");
break;
case stopped:

View File

@ -203,6 +203,7 @@ ThreadView::ThreadView(StdTable* parent) : StdTable(parent)
addColumnAt(8 + charwidth * 12, tr("Wait Reason"), false);
addColumnAt(8 + charwidth * 11, tr("Last Error"), false);
addColumnAt(0, "Name", false);
loadColumnFromConfig("Thread");
//setCopyMenuOnly(true);

View File

@ -38,9 +38,9 @@ public:
QChar temp;
for(const QChar & ch : text)
{
if(ch.isLowSurrogate())
if(ch.isHighSurrogate())
temp = ch;
else if(ch.isHighSurrogate())
else if(ch.isLowSurrogate())
result += mFontMetrics.width(QString(temp) + ch);
else
result += width(ch);

View File

@ -3,11 +3,13 @@
#include <QFontInfo>
#include <QMessageBox>
#include <QIcon>
#include "AbstractTableView.h"
Configuration* Configuration::mPtr = NULL;
Configuration* Configuration::mPtr = nullptr;
Configuration::Configuration() : QObject(), noMoreMsgbox(false)
{
mPtr = this;
//setup default color map
defaultColors.clear();
defaultColors.insert("AbstractTableViewSeparatorColor", QColor("#808080"));
@ -182,6 +184,29 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false)
miscellaneousBool.insert("LoadSaveTabOrder", false);
defaultBools.insert("Miscellaneous", miscellaneousBool);
QMap<QString, bool> guiBool;
guiBool.insert("FpuRegistersLittleEndian", false);
guiBool.insert("SaveColumnOrder", true);
defaultBools.insert("Gui", guiBool);
QMap<QString, duint> guiUint;
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "CPUDisassembly", 4);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "CPUStack", 3);
for(int i = 1; i <= 5; i++)
AbstractTableView::setupColumnConfigDefaultValue(guiUint, QString("CPUDump%1").arg(i), 4);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "SoftwareBreakpoint", 10);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "HardwareBreakpoint", 10);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "MemoryBreakpoint", 10);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "MemoryMap", 7);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "CallStack", 4);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "SEH", 4);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Script", 3);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Thread", 10);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Handle", 5);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "TcpConnection", 3);
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Privilege", 2);
defaultUints.insert("Gui", guiUint);
//uint settings
QMap<QString, duint> hexdumpUint;
hexdumpUint.insert("DefaultView", 0);
@ -335,7 +360,6 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false)
Shortcuts = defaultShortcuts;
load();
mPtr = this;
}
Configuration* Config()

View File

@ -7,3 +7,15 @@ void SetApplicationIcon(WId winId)
SendMessageW((HWND)winId, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
DestroyIcon(hIcon);
}
QByteArray& ByteReverse(QByteArray& array)
{
int length = array.length();
for(int i = 0; i < length / 2; i++)
{
char temp = array[i];
array[i] = array[length - i - 1];
array[length - i - 1] = temp;
}
return array;
}

View File

@ -4,5 +4,6 @@
#include <QWidget>
void SetApplicationIcon(WId winId);
QByteArray& ByteReverse(QByteArray& array);
#endif // MISCUTIL_H

View File

@ -117,11 +117,12 @@ int main(int argc, char* argv[])
Bridge::initBridge();
// Start GUI
MainWindow mainWindow;
mainWindow.show();
MainWindow* mainWindow;
mainWindow = new MainWindow();
mainWindow->show();
// Set some data
Bridge::getBridge()->winId = (void*)mainWindow.winId();
Bridge::getBridge()->winId = (void*)mainWindow->winId();
// Init debugger
const char* errormsg = DbgInit();
@ -136,12 +137,13 @@ int main(int argc, char* argv[])
//execute the application
int result = application.exec();
mConfiguration->save(); //save config on exit
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
QAbstractEventDispatcher::instance(application.thread())->removeNativeEventFilter(filter);
#else
QAbstractEventDispatcher::instance(application.thread())->setEventFilter(nullptr);
#endif
delete mainWindow;
mConfiguration->save(); //save config on exit
//TODO free capstone/config/bridge and prevent use after free.