2018-05-01 18:53:14 +00:00
|
|
|
#include "VersionInfoDialog.h"
|
|
|
|
#include "ui_VersionInfoDialog.h"
|
|
|
|
|
2018-10-17 07:55:53 +00:00
|
|
|
#include "common/Helpers.h"
|
2018-05-01 18:53:14 +00:00
|
|
|
|
|
|
|
#include <QJsonArray>
|
|
|
|
#include <QStringList>
|
|
|
|
#include <QJsonObject>
|
|
|
|
#include <QJsonDocument>
|
|
|
|
#include <QTreeWidget>
|
|
|
|
|
|
|
|
VersionInfoDialog::VersionInfoDialog(QWidget *parent) :
|
|
|
|
QDialog(parent),
|
|
|
|
ui(new Ui::VersionInfoDialog),
|
|
|
|
core(Core())
|
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
|
|
|
setWindowFlags(windowFlags() & (~Qt::WindowContextHelpButtonHint));
|
|
|
|
|
|
|
|
// Get version information
|
|
|
|
fillVersionInfo();
|
|
|
|
}
|
|
|
|
|
|
|
|
VersionInfoDialog::~VersionInfoDialog() {}
|
|
|
|
|
2018-09-30 20:00:53 +00:00
|
|
|
void VersionInfoDialog::fillVersionInfo()
|
|
|
|
{
|
2018-05-01 18:53:14 +00:00
|
|
|
|
|
|
|
QJsonDocument doc = Core()->getFileVersionInfo();
|
|
|
|
|
|
|
|
// Case ELF
|
|
|
|
if (doc.object().contains("verneed")) {
|
|
|
|
QJsonObject verneed = doc.object()["verneed"].toArray().first().toObject();
|
|
|
|
QJsonObject versym = doc.object()["versym"].toArray().first().toObject();
|
|
|
|
|
|
|
|
// Set labels
|
|
|
|
ui->leftLabel->setText("Version symbols");
|
|
|
|
ui->rightLabel->setText("Version need");
|
|
|
|
|
|
|
|
//Left tree
|
|
|
|
QTreeWidgetItem *secNameItemL = new QTreeWidgetItem();
|
|
|
|
secNameItemL->setText(0, "Section name:");
|
|
|
|
secNameItemL->setText(1, versym["section_name"].toString());
|
|
|
|
ui->leftTreeWidget->addTopLevelItem(secNameItemL);
|
|
|
|
|
|
|
|
QTreeWidgetItem *addrItemL = new QTreeWidgetItem();
|
|
|
|
addrItemL->setText(0, "Address:");
|
|
|
|
addrItemL->setText(1, RAddressString(versym["address"].toDouble()));
|
|
|
|
ui->leftTreeWidget->addTopLevelItem(addrItemL);
|
|
|
|
|
|
|
|
QTreeWidgetItem *offItemL = new QTreeWidgetItem();
|
|
|
|
offItemL->setText(0, "Offset:");
|
|
|
|
offItemL->setText(1, RAddressString(versym["offset"].toDouble()));
|
|
|
|
ui->leftTreeWidget->addTopLevelItem(offItemL);
|
|
|
|
|
|
|
|
QTreeWidgetItem *linkItemL = new QTreeWidgetItem();
|
|
|
|
linkItemL->setText(0, "Link:");
|
|
|
|
linkItemL->setText(1, QString::number(versym["link"].toDouble()));
|
|
|
|
ui->leftTreeWidget->addTopLevelItem(linkItemL);
|
|
|
|
|
|
|
|
QTreeWidgetItem *linkNameItemL = new QTreeWidgetItem();
|
|
|
|
linkNameItemL->setText(0, "Link section name:");
|
|
|
|
linkNameItemL->setText(1, versym["link_section_name"].toString());
|
|
|
|
ui->leftTreeWidget->addTopLevelItem(linkNameItemL);
|
|
|
|
|
|
|
|
QTreeWidgetItem *entriesItemL = new QTreeWidgetItem();
|
|
|
|
entriesItemL->setText(0, "Entries:");
|
2018-05-04 07:58:32 +00:00
|
|
|
for (QJsonValue val : versym["entries"].toArray()) {
|
2018-05-01 18:53:14 +00:00
|
|
|
QJsonObject obj = val.toObject();
|
|
|
|
QTreeWidgetItem *tempItem = new QTreeWidgetItem();
|
|
|
|
tempItem->setText(0, RAddressString(obj["idx"].toDouble()));
|
|
|
|
tempItem->setText(1, obj["value"].toString());
|
|
|
|
entriesItemL->addChild(tempItem);
|
|
|
|
}
|
|
|
|
ui->leftTreeWidget->addTopLevelItem(entriesItemL);
|
|
|
|
|
|
|
|
// Adjust columns to content
|
|
|
|
qhelpers::adjustColumns(ui->leftTreeWidget, 0);
|
|
|
|
|
|
|
|
// Right tree
|
|
|
|
QTreeWidgetItem *secNameItemR = new QTreeWidgetItem();
|
|
|
|
secNameItemR->setText(0, "Section name:");
|
|
|
|
secNameItemR->setText(1, verneed["section_name"].toString());
|
|
|
|
ui->rightTreeWidget->addTopLevelItem(secNameItemR);
|
|
|
|
|
|
|
|
QTreeWidgetItem *addrItemR = new QTreeWidgetItem();
|
|
|
|
addrItemR->setText(0, "Address:");
|
|
|
|
addrItemR->setText(1, RAddressString(verneed["address"].toDouble()));
|
|
|
|
ui->rightTreeWidget->addTopLevelItem(addrItemR);
|
|
|
|
|
|
|
|
QTreeWidgetItem *offItemR = new QTreeWidgetItem();
|
|
|
|
offItemR->setText(0, "Offset:");
|
|
|
|
offItemR->setText(1, RAddressString(verneed["offset"].toDouble()));
|
|
|
|
ui->rightTreeWidget->addTopLevelItem(offItemR);
|
|
|
|
|
|
|
|
QTreeWidgetItem *linkItemR = new QTreeWidgetItem();
|
|
|
|
linkItemR->setText(0, "Link:");
|
|
|
|
linkItemR->setText(1, QString::number(verneed["link"].toDouble()));
|
|
|
|
ui->rightTreeWidget->addTopLevelItem(linkItemR);
|
|
|
|
|
|
|
|
QTreeWidgetItem *linkNameItemR = new QTreeWidgetItem();
|
|
|
|
linkNameItemR->setText(0, "Link section name:");
|
|
|
|
linkNameItemR->setText(1, verneed["link_section_name"].toString());
|
|
|
|
ui->rightTreeWidget->addTopLevelItem(linkNameItemR);
|
|
|
|
|
|
|
|
QTreeWidgetItem *entriesItemR = new QTreeWidgetItem();
|
|
|
|
entriesItemR->setText(0, "Entries:");
|
2018-05-04 07:58:32 +00:00
|
|
|
for (QJsonValue parentVal : verneed["entries"].toArray()) {
|
2018-05-01 18:53:14 +00:00
|
|
|
QJsonObject parentObj = parentVal.toObject();
|
|
|
|
QTreeWidgetItem *parentItem = new QTreeWidgetItem();
|
|
|
|
QString parentString;
|
|
|
|
parentItem->setText(0, RAddressString(parentObj["idx"].toDouble()));
|
|
|
|
parentString.append("Version: " + QString::number(parentObj["vn_version"].toDouble()) + "\t");
|
|
|
|
parentString.append("File: " + parentObj["file_name"].toString());
|
|
|
|
parentItem->setText(1, parentString);
|
|
|
|
|
2018-05-04 07:58:32 +00:00
|
|
|
for (QJsonValue childVal : parentObj["vernaux"].toArray()) {
|
2018-05-01 18:53:14 +00:00
|
|
|
QJsonObject childObj = childVal.toObject();
|
|
|
|
QTreeWidgetItem *childItem = new QTreeWidgetItem();
|
|
|
|
QString childString;
|
|
|
|
childItem->setText(0, RAddressString(childObj["idx"].toDouble()));
|
|
|
|
childString.append("Name: " + childObj["name"].toString() + "\t");
|
|
|
|
childString.append("Flags: " + childObj["flags"].toString() + "\t");
|
|
|
|
childString.append("Version: " + QString::number(childObj["version"].toDouble()));
|
|
|
|
childItem->setText(1, childString);
|
|
|
|
parentItem->addChild(childItem);
|
|
|
|
}
|
|
|
|
entriesItemR->addChild(parentItem);
|
|
|
|
}
|
|
|
|
ui->rightTreeWidget->addTopLevelItem(entriesItemR);
|
|
|
|
|
|
|
|
// Adjust columns to content
|
|
|
|
qhelpers::adjustColumns(ui->rightTreeWidget, 0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Case PE
|
|
|
|
else if (doc.object().contains("VS_FIXEDFILEINFO")) {
|
|
|
|
QJsonObject vs = doc.object()["VS_FIXEDFILEINFO"].toObject();
|
|
|
|
QJsonObject strings = doc.object()["StringTable"].toObject();
|
|
|
|
|
|
|
|
// Set labels
|
|
|
|
ui->leftLabel->setText("VS Fixed file info");
|
|
|
|
ui->rightLabel->setText("String table");
|
|
|
|
|
|
|
|
// Left tree
|
2018-09-30 20:00:53 +00:00
|
|
|
for (QString key : vs.keys()) {
|
2018-05-01 18:53:14 +00:00
|
|
|
QTreeWidgetItem *tempItem = new QTreeWidgetItem();
|
|
|
|
tempItem->setText(0, key);
|
|
|
|
if (vs[key].isDouble())
|
|
|
|
tempItem->setText(1, RHexString(vs[key].toDouble()));
|
|
|
|
else
|
|
|
|
tempItem->setText(1, vs[key].toString());
|
|
|
|
ui->leftTreeWidget->addTopLevelItem(tempItem);
|
|
|
|
|
|
|
|
// Adjust columns to content
|
|
|
|
qhelpers::adjustColumns(ui->leftTreeWidget, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Right tree
|
2018-09-30 20:00:53 +00:00
|
|
|
for (QString key : strings.keys()) {
|
2018-05-01 18:53:14 +00:00
|
|
|
QTreeWidgetItem *tempItem = new QTreeWidgetItem();
|
|
|
|
tempItem->setText(0, key);
|
|
|
|
tempItem->setText(1, strings[key].toString());
|
|
|
|
ui->rightTreeWidget->addTopLevelItem(tempItem);
|
|
|
|
|
|
|
|
// Adjust columns to content
|
|
|
|
qhelpers::adjustColumns(ui->rightTreeWidget, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|