Add DLL ordinal to symbol table and fix symbol table comparator
This commit is contained in:
parent
5a4f15e9f5
commit
0065f204a3
|
@ -598,6 +598,7 @@ typedef struct SYMBOLINFO_
|
||||||
SYMBOLTYPE type;
|
SYMBOLTYPE type;
|
||||||
bool freeDecorated;
|
bool freeDecorated;
|
||||||
bool freeUndecorated;
|
bool freeUndecorated;
|
||||||
|
DWORD ordinal;
|
||||||
} SYMBOLINFO;
|
} SYMBOLINFO;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
|
@ -1195,6 +1195,7 @@ void MODIMPORT::convertToGuiSymbol(duint base, SYMBOLINFO* info) const
|
||||||
info->decoratedSymbol = (char*)name.c_str();
|
info->decoratedSymbol = (char*)name.c_str();
|
||||||
info->undecoratedSymbol = (char*)undecoratedName.c_str();
|
info->undecoratedSymbol = (char*)undecoratedName.c_str();
|
||||||
info->freeDecorated = info->freeUndecorated = false;
|
info->freeDecorated = info->freeUndecorated = false;
|
||||||
|
info->ordinal = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MODEXPORT::convertToGuiSymbol(duint base, SYMBOLINFO* info) const
|
void MODEXPORT::convertToGuiSymbol(duint base, SYMBOLINFO* info) const
|
||||||
|
@ -1204,4 +1205,5 @@ void MODEXPORT::convertToGuiSymbol(duint base, SYMBOLINFO* info) const
|
||||||
info->decoratedSymbol = (char*)name.c_str();
|
info->decoratedSymbol = (char*)name.c_str();
|
||||||
info->undecoratedSymbol = (char*)undecoratedName.c_str();
|
info->undecoratedSymbol = (char*)undecoratedName.c_str();
|
||||||
info->freeDecorated = info->freeUndecorated = false;
|
info->freeDecorated = info->freeUndecorated = false;
|
||||||
|
info->ordinal = ordinal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ struct SymbolInfo : SymbolInfoGui
|
||||||
info->undecoratedSymbol = (char*)this->undecoratedName.c_str();
|
info->undecoratedSymbol = (char*)this->undecoratedName.c_str();
|
||||||
info->type = sym_symbol;
|
info->type = sym_symbol;
|
||||||
info->freeDecorated = info->freeUndecorated = false;
|
info->freeDecorated = info->freeUndecorated = false;
|
||||||
|
info->ordinal = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ ZehSymbolTable::ZehSymbolTable(QWidget* parent)
|
||||||
setAddressColumn(0);
|
setAddressColumn(0);
|
||||||
addColumnAt(charwidth * 2 * sizeof(dsint) + 8, tr("Address"), true);
|
addColumnAt(charwidth * 2 * sizeof(dsint) + 8, tr("Address"), true);
|
||||||
addColumnAt(charwidth * 6 + 8, tr("Type"), true);
|
addColumnAt(charwidth * 6 + 8, tr("Type"), true);
|
||||||
|
addColumnAt(charwidth * 7 + 8, tr("Ordinal"), true);
|
||||||
addColumnAt(charwidth * 80, tr("Symbol"), true);
|
addColumnAt(charwidth * 80, tr("Symbol"), true);
|
||||||
addColumnAt(2000, tr("Symbol (undecorated)"), true);
|
addColumnAt(2000, tr("Symbol (undecorated)"), true);
|
||||||
loadColumnFromConfig("Symbol");
|
loadColumnFromConfig("Symbol");
|
||||||
|
@ -67,6 +68,11 @@ QString ZehSymbolTable::getCellContent(int r, int c)
|
||||||
default:
|
default:
|
||||||
__debugbreak();
|
__debugbreak();
|
||||||
}
|
}
|
||||||
|
case ColOrdinal:
|
||||||
|
if(info->type == sym_export)
|
||||||
|
return QString::number(info->ordinal);
|
||||||
|
else
|
||||||
|
return QString();
|
||||||
case ColDecorated:
|
case ColDecorated:
|
||||||
return info->decoratedSymbol;
|
return info->decoratedSymbol;
|
||||||
case ColUndecorated:
|
case ColUndecorated:
|
||||||
|
@ -85,28 +91,35 @@ bool ZehSymbolTable::isValidIndex(int r, int c)
|
||||||
void ZehSymbolTable::sortRows(int column, bool ascending)
|
void ZehSymbolTable::sortRows(int column, bool ascending)
|
||||||
{
|
{
|
||||||
QMutexLocker lock(&mMutex);
|
QMutexLocker lock(&mMutex);
|
||||||
//TODO: invalid compare when !ascending
|
|
||||||
std::stable_sort(mData.begin(), mData.end(), [column, ascending](const SYMBOLPTR & a, const SYMBOLPTR & b)
|
std::stable_sort(mData.begin(), mData.end(), [column, ascending](const SYMBOLPTR & a, const SYMBOLPTR & b)
|
||||||
{
|
{
|
||||||
SymbolInfoWrapper ainfo, binfo;
|
SymbolInfoWrapper ainfo, binfo;
|
||||||
DbgGetSymbolInfo(&a, &ainfo);
|
DbgGetSymbolInfo(&a, &ainfo);
|
||||||
DbgGetSymbolInfo(&b, &binfo);
|
DbgGetSymbolInfo(&b, &binfo);
|
||||||
bool less;
|
|
||||||
switch(column)
|
switch(column)
|
||||||
{
|
{
|
||||||
case ColAddr:
|
case ColAddr:
|
||||||
less = ainfo->addr < binfo->addr;
|
return ascending ? ainfo->addr < binfo->addr : ainfo->addr > binfo->addr;
|
||||||
break;
|
|
||||||
case ColType:
|
case ColType:
|
||||||
less = ainfo->type < binfo->type;
|
return ascending ? ainfo->type < binfo->type : ainfo->type > binfo->type;
|
||||||
break;
|
case ColOrdinal:
|
||||||
|
// If we are sorting by ordinal make the exports the first entries
|
||||||
|
if(ainfo->type == sym_export && binfo->type != sym_export)
|
||||||
|
return ascending;
|
||||||
|
else if(ainfo->type != sym_export && binfo->type == sym_export)
|
||||||
|
return !ascending;
|
||||||
|
else
|
||||||
|
return ascending ? ainfo->ordinal < binfo->ordinal : ainfo->ordinal > binfo->ordinal;
|
||||||
case ColDecorated:
|
case ColDecorated:
|
||||||
less = strcmp(ainfo->decoratedSymbol, binfo->decoratedSymbol) < 0;
|
{
|
||||||
break;
|
int result = strcmp(ainfo->decoratedSymbol, binfo->decoratedSymbol);
|
||||||
case ColUndecorated:
|
return ascending ? result < 0 : result > 0;
|
||||||
less = strcmp(ainfo->undecoratedSymbol, binfo->undecoratedSymbol) < 0;
|
}
|
||||||
break;
|
case ColUndecorated:
|
||||||
|
{
|
||||||
|
int result = strcmp(ainfo->undecoratedSymbol, binfo->undecoratedSymbol);
|
||||||
|
return ascending ? result < 0 : result > 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ascending ? less : !less;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ private:
|
||||||
{
|
{
|
||||||
ColAddr,
|
ColAddr,
|
||||||
ColType,
|
ColType,
|
||||||
|
ColOrdinal,
|
||||||
ColDecorated,
|
ColDecorated,
|
||||||
ColUndecorated
|
ColUndecorated
|
||||||
};
|
};
|
||||||
|
|
|
@ -313,7 +313,7 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false)
|
||||||
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Privilege", 2);
|
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Privilege", 2);
|
||||||
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "LocalVarsView", 3);
|
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "LocalVarsView", 3);
|
||||||
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Module", 4);
|
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Module", 4);
|
||||||
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Symbol", 4);
|
AbstractTableView::setupColumnConfigDefaultValue(guiUint, "Symbol", 5);
|
||||||
guiUint.insert("SIMDRegistersDisplayMode", 0);
|
guiUint.insert("SIMDRegistersDisplayMode", 0);
|
||||||
addWindowPosConfig(guiUint, "AssembleDialog");
|
addWindowPosConfig(guiUint, "AssembleDialog");
|
||||||
addWindowPosConfig(guiUint, "AttachDialog");
|
addWindowPosConfig(guiUint, "AttachDialog");
|
||||||
|
|
Loading…
Reference in New Issue