summaryrefslogtreecommitdiff
path: root/examples/triage/resources.h
diff options
context:
space:
mode:
authorXusheng <xusheng@vector35.com>2026-03-04 17:04:53 +0800
committerXusheng <xusheng@vector35.com>2026-03-05 12:59:40 +0800
commit432e144beeccf1d9a2d9ed9e7d016384eed0bb32 (patch)
treef963730f2b0b18cbc0620a755e6aad415228c2dc /examples/triage/resources.h
parent3520262824637979418554656607433424896809 (diff)
Parse and display PE resource information in triage view. Fix https://github.com/Vector35/binaryninja-api/issues/4052, fix https://github.com/Vector35/binaryninja-api/issues/5607
Diffstat (limited to 'examples/triage/resources.h')
-rw-r--r--examples/triage/resources.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/examples/triage/resources.h b/examples/triage/resources.h
new file mode 100644
index 00000000..79869aea
--- /dev/null
+++ b/examples/triage/resources.h
@@ -0,0 +1,102 @@
+#pragma once
+
+#include <QtCore/QAbstractItemModel>
+#include <QtWidgets/QTreeView>
+#include "filter.h"
+
+
+struct ResourceEntry
+{
+ std::string type;
+ uint64_t typeId;
+ std::string name;
+ uint64_t nameId;
+ std::string language;
+ uint64_t languageId;
+ uint64_t dataRva;
+ uint64_t dataSize;
+ uint64_t dataAddress;
+ uint64_t codepage;
+ std::string preview;
+};
+
+
+class ResourcesModel : public QAbstractItemModel
+{
+ BinaryViewRef m_data;
+ std::vector<ResourceEntry> m_allEntries, m_entries;
+ int m_sortCol;
+ Qt::SortOrder m_sortOrder;
+
+ void performSort(int col, Qt::SortOrder order);
+
+ public:
+ enum Column
+ {
+ TypeCol = 0,
+ NameCol = 1,
+ LanguageCol = 2,
+ SizeCol = 3,
+ AddressCol = 4,
+ PreviewCol = 5,
+ ColumnCount = 6
+ };
+
+ ResourcesModel(QWidget* parent, BinaryViewRef data);
+
+ virtual int columnCount(const QModelIndex& parent) const override;
+ virtual int rowCount(const QModelIndex& parent) const override;
+ virtual QVariant data(const QModelIndex& index, int role) const override;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
+ virtual QModelIndex index(int row, int col, const QModelIndex& parent) const override;
+ virtual QModelIndex parent(const QModelIndex& index) const override;
+ virtual void sort(int col, Qt::SortOrder order) override;
+ void setFilter(const std::string& filterText, FilterOptions options);
+
+ const ResourceEntry* getEntry(const QModelIndex& index) const;
+ const std::vector<ResourceEntry>& getAllEntries() const { return m_allEntries; }
+};
+
+
+class TriageView;
+class ResourcesWidget;
+
+class ResourcesTreeView : public QTreeView, public FilterTarget
+{
+ BinaryViewRef m_data;
+ ResourcesWidget* m_parent;
+ TriageView* m_view;
+ UIActionHandler m_actionHandler;
+ ResourcesModel* m_model;
+
+ public:
+ ResourcesTreeView(ResourcesWidget* parent, TriageView* view, BinaryViewRef data);
+ void copySelection();
+ bool canCopySelection() const;
+ void saveSelectedResource();
+ void saveAllResources();
+
+ virtual void setFilter(const std::string& filterText, FilterOptions options) override;
+ virtual void scrollToFirstItem() override;
+ virtual void scrollToCurrentItem() override;
+ virtual void ensureSelection() override;
+ virtual void activateSelection() override;
+ virtual void closeFilter() override;
+
+ protected:
+ virtual void keyPressEvent(QKeyEvent* event) override;
+
+ private Q_SLOTS:
+ void resourceSelected(const QModelIndex& cur, const QModelIndex& prev);
+ void resourceDoubleClicked(const QModelIndex& cur);
+};
+
+
+class ResourcesWidget : public QWidget
+{
+ FilteredView* m_filter;
+
+ public:
+ ResourcesWidget(QWidget* parent, TriageView* view, BinaryViewRef data);
+ void showFilter(const QString& filter);
+};