1
0
Fork 0

PROJECT: updated todo

GUI: added key press signal to StdTabe
GUI: better searching in symbol view (only the resultsar edisplayed)
This commit is contained in:
Mr. eXoDia 2014-02-23 02:02:04 +01:00
parent 7f3376df08
commit 69c76b5db8
6 changed files with 115 additions and 13 deletions

View File

@ -64,4 +64,5 @@
- highlight register changes (only when CIP changed also)
- 'dead' bytes custom analysis
- loops lines database for analysis
- enable/disable hw+mem breakpoint
- enable/disable hw+mem breakpoint
- highlight words

View File

@ -206,7 +206,7 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
}
else if(instr.arg[i].value and (disasmgetstringat(instr.arg[i].value, &strtype, ascii, unicode, len_left) or _dbg_addrinfoget(instr.arg[i].value, instr.arg[i].segment, &newinfo)))
{
if(instr.type!=instr_normal)
if(instr.type!=instr_normal) //stack/jumps (eg add esp,4 or jmp 401110) cannot directly point to strings
strtype=str_none;
switch(strtype)
{

View File

@ -115,6 +115,7 @@ void StdTable::mouseReleaseEvent(QMouseEvent* event)
void StdTable::keyPressEvent(QKeyEvent* event)
{
emit keyPressedSignal(event);
int key = event->key();
if(key == Qt::Key_Up || key == Qt::Key_Down)

View File

@ -36,6 +36,7 @@ public:
signals:
void selectionChangedSignal(int index);
void keyPressedSignal(QKeyEvent* event);
public slots:

View File

@ -8,6 +8,7 @@ SymbolView::SymbolView(QWidget *parent) :
ui->setupUi(this);
mainLayout = new QVBoxLayout;
mainLayout->setContentsMargins(1, 1, 1, 1);
mainLayout->addWidget(ui->mainSplitter);
setLayout(mainLayout);
@ -21,14 +22,33 @@ SymbolView::SymbolView(QWidget *parent) :
mModuleList->addColumnAt(charwidth*2*sizeof(int_t)+8, "Base", false);
mModuleList->addColumnAt(0, "Module", true);
// Create symbol list
mSymbolList = new StdTable();
mSymbolList->setContextMenuPolicy(Qt::CustomContextMenu);
mSymbolList->addColumnAt(charwidth*2*sizeof(int_t)+8, "Address", true);
mSymbolList->addColumnAt(charwidth*80, "Symbol", true);
mSymbolList->addColumnAt(0, "Symbol (undecorated)", true);
// Create search list
mSymbolSearchList = new StdTable();
mSymbolSearchList->addColumnAt(charwidth*2*sizeof(int_t)+8, "Address", true);
mSymbolSearchList->addColumnAt(charwidth*80, "Symbol Search", true);
mSymbolSearchList->addColumnAt(0, "Symbol (undecorated)", true);
mSymbolSearchList->hide();
// Create symbol layout
symbolLayout = new QVBoxLayout();
symbolLayout->setContentsMargins(0, 0, 0, 0);
symbolLayout->setSpacing(0);
symbolLayout->addWidget(mSymbolList);
symbolLayout->addWidget(mSymbolSearchList);
// Create symbol placeholder
symbolPlaceholder = new QWidget();
symbolPlaceholder->setLayout(symbolLayout);
ui->listSplitter->addWidget(mModuleList);
ui->listSplitter->addWidget(mSymbolList);
ui->listSplitter->addWidget(symbolPlaceholder);
#ifdef _WIN64
// mModuleList : mSymbolList = 40 : 100
ui->listSplitter->setStretchFactor(0, 40);
@ -59,6 +79,8 @@ SymbolView::SymbolView(QWidget *parent) :
connect(Bridge::getBridge(), SIGNAL(updateSymbolList(int,SYMBOLMODULEINFO*)), this, SLOT(updateSymbolList(int,SYMBOLMODULEINFO*)));
connect(Bridge::getBridge(), SIGNAL(setSymbolProgress(int)), ui->symbolProgress, SLOT(setValue(int)));
connect(mSymbolList, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(symbolContextMenu(const QPoint &)));
connect(mSymbolList, SIGNAL(keyPressedSignal(QKeyEvent*)), this, SLOT(symbolKeyPressed(QKeyEvent*)));
connect(mSymbolSearchList, SIGNAL(keyPressedSignal(QKeyEvent*)), this, SLOT(symbolKeyPressed(QKeyEvent*)));
connect(ui->searchBox, SIGNAL(textChanged(QString)), this, SLOT(searchTextChanged(QString)));
}
@ -118,6 +140,8 @@ void SymbolView::moduleSelectionChanged(int index)
mSymbolList->reloadData();
mSymbolList->setSingleSelection(0);
mSymbolList->setTableOffset(0);
mSymbolList->setFocus();
ui->searchBox->setText("");
}
void SymbolView::updateSymbolList(int module_count, SYMBOLMODULEINFO* modules)
@ -159,38 +183,109 @@ void SymbolView::symbolContextMenu(const QPoint & pos)
void SymbolView::symbolFollow()
{
DbgCmdExecDirect(QString("disasm " + mSymbolList->getCellContent(mSymbolList->getInitialSelection(), 0)).toUtf8().constData());
StdTable* curList;
if(mSymbolList->isHidden()) //search is active
curList=mSymbolSearchList;
else
curList=mSymbolList;
DbgCmdExecDirect(QString("disasm " + curList->getCellContent(curList->getInitialSelection(), 0)).toUtf8().constData());
emit showCpu();
}
void SymbolView::symbolAddressCopy()
{
Bridge::CopyToClipboard(mSymbolList->getCellContent(mSymbolList->getInitialSelection(), 0).toUtf8().constData());
StdTable* curList;
if(mSymbolList->isHidden()) //search is active
curList=mSymbolSearchList;
else
curList=mSymbolList;
Bridge::CopyToClipboard(curList->getCellContent(curList->getInitialSelection(), 0).toUtf8().constData());
}
void SymbolView::symbolDecoratedCopy()
{
Bridge::CopyToClipboard(mSymbolList->getCellContent(mSymbolList->getInitialSelection(), 1).toUtf8().constData());
StdTable* curList;
if(mSymbolList->isHidden()) //search is active
curList=mSymbolSearchList;
else
curList=mSymbolList;
Bridge::CopyToClipboard(curList->getCellContent(curList->getInitialSelection(), 1).toUtf8().constData());
}
void SymbolView::symbolUndecoratedCopy()
{
Bridge::CopyToClipboard(mSymbolList->getCellContent(mSymbolList->getInitialSelection(), 2).toUtf8().constData());
StdTable* curList;
if(mSymbolList->isHidden()) //search is active
curList=mSymbolSearchList;
else
curList=mSymbolList;
Bridge::CopyToClipboard(curList->getCellContent(curList->getInitialSelection(), 2).toUtf8().constData());
}
void SymbolView::symbolKeyPressed(QKeyEvent* event)
{
char ch=event->text().toUtf8().constData()[0];
if(isprint(ch)) //add a char to the search box
ui->searchBox->setText(ui->searchBox->text()+QString(QChar(ch)));
else if(event->key()==Qt::Key_Backspace) //remove a char from the search box
{
QString newText;
if(event->modifiers()==Qt::ControlModifier) //clear the search box
newText="";
else
{
newText=ui->searchBox->text();
newText.chop(1);
}
ui->searchBox->setText(newText);
}
else if((event->key()==Qt::Key_Return || event->key()==Qt::Key_Enter) && event->modifiers()==Qt::NoModifier) //user pressed enter
mFollowSymbolAction->trigger();
}
void SymbolView::searchTextChanged(const QString &arg1)
{
if(arg1.length())
{
mSymbolList->hide();
mSymbolSearchList->show();
}
else
{
mSymbolSearchList->hide();
mSymbolList->show();
mSymbolList->setFocus();
}
mSymbolSearchList->setRowCount(0);
int count=mSymbolList->getRowCount();
for(int i=0; i<count; i++)
for(int i=0,j=0; i<count; i++)
{
if(mSymbolList->getCellContent(i, 1).contains(arg1, Qt::CaseInsensitive) || mSymbolList->getCellContent(i, 2).contains(arg1, Qt::CaseInsensitive))
{
int cur=i-mSymbolList->getViewableRowsCount()/2;
if(!mSymbolList->isValidIndex(cur, 0))
cur=i;
mSymbolList->setTableOffset(cur);
mSymbolList->setSingleSelection(i);
mSymbolSearchList->setRowCount(j+1);
mSymbolSearchList->setCellContent(j, 0, mSymbolList->getCellContent(i, 0));
mSymbolSearchList->setCellContent(j, 1, mSymbolList->getCellContent(i, 1));
mSymbolSearchList->setCellContent(j, 2, mSymbolList->getCellContent(i, 2));
j++;
}
}
count=mSymbolSearchList->getRowCount();
mSymbolSearchList->setTableOffset(0);
for(int i=0; i<count; i++)
{
if(mSymbolSearchList->getCellContent(i, 1).startsWith(arg1, Qt::CaseInsensitive) || mSymbolSearchList->getCellContent(i, 2).startsWith(arg1, Qt::CaseInsensitive))
{
if(count>mSymbolSearchList->getViewableRowsCount())
{
int cur=i-mSymbolSearchList->getViewableRowsCount()/2;
if(!mSymbolSearchList->isValidIndex(cur, 0))
cur=i;
mSymbolSearchList->setTableOffset(cur);
}
mSymbolSearchList->setSingleSelection(i);
break;
}
}
mSymbolSearchList->reloadData();
mSymbolSearchList->setFocus();
}

View File

@ -31,6 +31,7 @@ public slots:
void symbolAddressCopy();
void symbolDecoratedCopy();
void symbolUndecoratedCopy();
void symbolKeyPressed(QKeyEvent* event);
void searchTextChanged(const QString &arg1);
signals:
@ -39,9 +40,12 @@ signals:
private:
Ui::SymbolView *ui;
QVBoxLayout* mainLayout;
QVBoxLayout* symbolLayout;
QWidget* symbolPlaceholder;
StdTable* mModuleList;
StdTable* mSymbolList;
StdTable* mSymbolSearchList;
QList<uint_t> moduleBaseList;