diff options
| author | Xusheng <xusheng@vector35.com> | 2026-03-04 17:04:53 +0800 |
|---|---|---|
| committer | Xusheng <xusheng@vector35.com> | 2026-03-05 12:59:40 +0800 |
| commit | 432e144beeccf1d9a2d9ed9e7d016384eed0bb32 (patch) | |
| tree | f963730f2b0b18cbc0620a755e6aad415228c2dc /examples/triage/resources.h | |
| parent | 3520262824637979418554656607433424896809 (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.h | 102 |
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); +}; |
