summaryrefslogtreecommitdiff
path: root/view/kernelcache/ui/kctriage.h
diff options
context:
space:
mode:
authorkat <kat@vector35.com>2025-07-06 15:05:01 -0400
committerkat <kat@vector35.com>2025-07-07 07:37:23 -0400
commit768f7c78465fb93936e5ca50a0ca712664fe54e7 (patch)
tree78c73e0022d6006882e365a257595a5b55a37432 /view/kernelcache/ui/kctriage.h
parent8f3e251c42169fb4fe8db9403d900571434d88ff (diff)
KernelCache rewrite
Diffstat (limited to 'view/kernelcache/ui/kctriage.h')
-rw-r--r--view/kernelcache/ui/kctriage.h198
1 files changed, 17 insertions, 181 deletions
diff --git a/view/kernelcache/ui/kctriage.h b/view/kernelcache/ui/kctriage.h
index 2bd106b6..d918cad6 100644
--- a/view/kernelcache/ui/kctriage.h
+++ b/view/kernelcache/ui/kctriage.h
@@ -6,18 +6,19 @@
#include <QStyledItemDelegate>
#include <QTableView>
#include <binaryninjaapi.h>
-#include <kernelcacheapi.h>
#include <progresstask.h>
+#include <kernelcacheapi.h>
#include "filter.h"
+#include "symboltable.h"
#include "ui/fontsettings.h"
#include "uicontext.h"
#include "uitypes.h"
#include "viewframe.h"
#ifndef BINARYNINJA_KCTRIAGE_H
-#define BINARYNINJA_KCTRIAGE_H
-
+ #define BINARYNINJA_KCTRIAGE_H
+using namespace BinaryNinja;
using namespace KernelCacheAPI;
@@ -40,30 +41,15 @@ public:
};
-class MonospaceFontDelegate : public QStyledItemDelegate {
-public:
- explicit MonospaceFontDelegate(QObject* parent = nullptr) : QStyledItemDelegate(parent) {}
-
- void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
- QStyleOptionViewItem opt = option;
- initStyleOption(&opt, index);
-
- opt.font = getMonospaceFont(qobject_cast<QWidget*>(parent()));
-
- QStyledItemDelegate::paint(painter, opt, index);
- }
-};
-
-
class LoadedDelegate : public QItemDelegate
{
-Q_OBJECT
+ Q_OBJECT
public:
explicit LoadedDelegate(QObject* parent = nullptr) : QItemDelegate(parent) {}
void paint(QPainter *painter, const QStyleOptionViewItem &option,
- const QModelIndex &index) const override
+ const QModelIndex &index) const override
{
if (!index.isValid())
return;
@@ -98,7 +84,7 @@ public:
}
QSize sizeHint(const QStyleOptionViewItem &option,
- const QModelIndex &index) const override
+ const QModelIndex &index) const override
{
Q_UNUSED(option);
Q_UNUSED(index);
@@ -113,7 +99,6 @@ public:
};
-
class FilterableTableView : public QTableView, public FilterTarget {
Q_OBJECT
@@ -190,165 +175,11 @@ signals:
};
-class SymbolTableProxyModel : public QSortFilterProxyModel
-{
-Q_OBJECT
-
-public:
- explicit SymbolTableProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent), m_timer(new QTimer(this))
- {
- m_timer->setSingleShot(true);
- connect(m_timer, &QTimer::timeout, this, &SymbolTableProxyModel::delayedFilterChanged);
- }
-
- void setFilterString(const QString& filter)
- {
- QRegularExpression newRegEx(QRegularExpression::escape(filter), QRegularExpression::CaseInsensitiveOption);
- if (m_filter != newRegEx) {
- m_filter = std::move(newRegEx);
- m_timer->start(200);
- }
- }
-
-protected:
- bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override
- {
- if (m_filter.pattern().isEmpty())
- return true;
-
- for (int column = 0; column < sourceModel()->columnCount(source_parent); ++column)
- {
- QModelIndex index = sourceModel()->index(source_row, column, source_parent);
- QString data = sourceModel()->data(index).toString();
- if (m_filter.match(data).hasMatch())
- return true;
- }
- return false;
- }
-
-private slots:
- void delayedFilterChanged()
- {
- invalidateFilter();
- }
-
-private:
- QRegularExpression m_filter;
- QTimer* m_timer;
-};
-
-
-class SymbolTableView : public QTableView, public FilterTarget
-{
-Q_OBJECT
- friend class SymbolTableModel;
-
- std::vector<KernelCacheAPI::KCSymbol> m_symbols;
- QStandardItemModel* m_model;
- SymbolTableProxyModel* m_proxyModel;
-
-public:
- SymbolTableView(QWidget* parent, Ref<KernelCache>& cache)
- : QTableView(parent), m_model(new QStandardItemModel(this)), m_proxyModel(new SymbolTableProxyModel(this))
- {
- m_proxyModel->setSourceModel(m_model);
- setModel(m_proxyModel);
-
- // Set up the headers
- m_model->setColumnCount(3);
- m_model->setHorizontalHeaderLabels({"Address", "Name", "Image"});
- setFont(getMonospaceFont(parent));
- setItemDelegateForColumn(0, new AddressColorDelegate(this));
- setItemDelegateForColumn(1, new MonospaceFontDelegate(this));
- setItemDelegateForColumn(2, new MonospaceFontDelegate(this));
-
- // Configure view settings
- horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
- horizontalHeader()->setSectionResizeMode(1, QHeaderView::Interactive);
- horizontalHeader()->resizeSection(1, 400);
- horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
- setEditTriggers(QAbstractItemView::NoEditTriggers);
- setSelectionBehavior(QAbstractItemView::SelectRows);
- setSelectionMode(QAbstractItemView::SingleSelection);
- verticalHeader()->setVisible(false);
-
- setSortingEnabled(true);
-
- BackgroundThread::create(this)->thenBackground([this, cache](){
- m_symbols = cache->LoadAllSymbolsAndWait();
- })->thenMainThread([this](){
- updateSymbols();
- })->start();
- }
-
- ~SymbolTableView() override = default;
-
- void updateSymbols()
- {
- m_model->removeRows(0, m_model->rowCount());
- for (const auto& symbol : m_symbols)
- {
- QList<QStandardItem*> row;
- row << new QStandardItem(QString("0x%1").arg(symbol.address, 0, 16))
- << new QStandardItem(QString::fromStdString(symbol.name))
- << new QStandardItem(QString::fromStdString(symbol.image));
- m_model->appendRow(row);
- }
- }
-
- KernelCacheAPI::KCSymbol getSymbolAtRow(int row) const
- {
- QModelIndex proxyIndex = m_proxyModel->index(row, 0);
- QModelIndex sourceIndex = m_proxyModel->mapToSource(proxyIndex);
- return m_symbols[sourceIndex.row()];
- }
-
- void scrollToFirstItem() override
- {
- scrollToTop();
- }
-
- void scrollToCurrentItem() override
- {
- scrollTo(selectionModel()->currentIndex());
- }
-
- void selectFirstItem() override
- {
- if (m_proxyModel->rowCount() > 0) {
- QModelIndex idx = m_proxyModel->index(0, 0);
- if (idx.isValid()) {
- selectionModel()->select(idx, QItemSelectionModel::ClearAndSelect);
- setCurrentIndex(idx);
- }
- }
- }
-
- void activateFirstItem() override
- {
- if (m_proxyModel->rowCount() > 0) {
- QModelIndex idx = m_proxyModel->index(0, 0);
- if (idx.isValid()) {
- setCurrentIndex(idx);
- emit activated(idx);
- }
- }
- }
-
- void setFilter(const std::string& text) override
- {
- m_proxyModel->setFilterString(QString::fromStdString(text));
- }
-};
-
-
class KCTriageView : public QWidget, public View, public UIContextNotification
{
BinaryViewRef m_data;
QVBoxLayout* m_layout;
- Ref<KernelCacheAPI::KernelCache> m_cache;
-
SplitTabWidget* m_triageTabs;
DockableTabCollection* m_triageCollection;
@@ -357,8 +188,10 @@ class KCTriageView : public QWidget, public View, public UIContextNotification
SymbolTableView* m_symbolTable;
- std::mutex m_headersMutex;
- std::shared_ptr<std::vector<KernelCacheAPI::KernelCacheMachOHeader>> m_headers;
+ FilterableTableView* m_mappingTable;
+ QStandardItemModel* m_mappingModel;
+
+ QStandardItemModel* m_regionModel;
public:
KCTriageView(QWidget* parent, BinaryViewRef data);
@@ -368,10 +201,14 @@ public:
QFont getFont() override;
bool navigate(uint64_t offset) override;
uint64_t getCurrentOffset() override;
+ SelectionInfoForXref getSelectionForXref() override;
+
+ void OnAfterOpenFile(UIContext* context, FileContext* file, ViewFrame* frame) override;
+ void RefreshData();
private:
- void loadImagesWithAddr(const std::vector<uint64_t>& addresses);
- void setImageLoaded(const uint64_t imageHeaderAddr);
+ void loadImagesWithAddr(const std::vector<uint64_t>& addresses, bool includeDependencies = false);
+ void setImageLoaded(uint64_t imageHeaderAddr);
QWidget* initImageTable();
void initSymbolTable();
};
@@ -386,5 +223,4 @@ public:
static void Register();
};
-
#endif // BINARYNINJA_KCTRIAGE_H