diff options
| author | kat <kat@vector35.com> | 2025-07-06 15:05:01 -0400 |
|---|---|---|
| committer | kat <kat@vector35.com> | 2025-07-07 07:37:23 -0400 |
| commit | 768f7c78465fb93936e5ca50a0ca712664fe54e7 (patch) | |
| tree | 78c73e0022d6006882e365a257595a5b55a37432 /view/kernelcache/ui/kctriage.h | |
| parent | 8f3e251c42169fb4fe8db9403d900571434d88ff (diff) | |
KernelCache rewrite
Diffstat (limited to 'view/kernelcache/ui/kctriage.h')
| -rw-r--r-- | view/kernelcache/ui/kctriage.h | 198 |
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 |
