Skip to content

Commit f94dfb5

Browse files
committed
[Core] Add callback when the BinaryDataNotification is unregistered
Useful when you want to destroy the notification handler object once the owned view is destroyed. Because this is used to destroy the object, it might be more useful to call it that, although the lifetime of the notification handler object when passed to the core is quite obscure.
1 parent 22a29f0 commit f94dfb5

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

binaryninjaapi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4086,6 +4086,7 @@ namespace BinaryNinja {
40864086
private:
40874087
BNBinaryDataNotification m_callbacks;
40884088

4089+
static void UnregisteredCallback(void* ctxt);
40894090
static uint64_t NotificationBarrierCallback(void* ctxt, BNBinaryView* object);
40904091
static void DataWrittenCallback(void* ctxt, BNBinaryView* data, uint64_t offset, size_t len);
40914092
static void DataInsertedCallback(void* ctxt, BNBinaryView* data, uint64_t offset, size_t len);
@@ -4244,6 +4245,7 @@ namespace BinaryNinja {
42444245

42454246
BNBinaryDataNotification* GetCallbacks() { return &m_callbacks; }
42464247

4248+
virtual void OnUnregistered() {}
42474249
virtual uint64_t OnNotificationBarrier(BinaryView* view)
42484250
{
42494251
(void)view;

binaryninjacore.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@
3737
// Current ABI version for linking to the core. This is incremented any time
3838
// there are changes to the API that affect linking, including new functions,
3939
// new types, or modifications to existing functions or types.
40-
#define BN_CURRENT_CORE_ABI_VERSION 162
40+
#define BN_CURRENT_CORE_ABI_VERSION 163
4141

4242
// Minimum ABI version that is supported for loading of plugins. Plugins that
4343
// are linked to an ABI version less than this will not be able to load and
4444
// will require rebuilding. The minimum version is increased when there are
4545
// incompatible changes that break binary compatibility, such as changes to
4646
// existing types or functions.
47-
#define BN_MINIMUM_CORE_ABI_VERSION 161
47+
#define BN_MINIMUM_CORE_ABI_VERSION 163
4848

4949
#ifdef __GNUC__
5050
#ifdef BINARYNINJACORE_LIBRARY
@@ -1732,7 +1732,8 @@ extern "C"
17321732
typedef struct BNBinaryDataNotification
17331733
{
17341734
void* context;
1735-
uint64_t (*notificationBarrier)(void*ctxt, BNBinaryView* view);
1735+
void (*unregistered)(void* ctxt);
1736+
uint64_t (*notificationBarrier)(void* ctxt, BNBinaryView* view);
17361737
void (*dataWritten)(void* ctxt, BNBinaryView* view, uint64_t offset, size_t len);
17371738
void (*dataInserted)(void* ctxt, BNBinaryView* view, uint64_t offset, size_t len);
17381739
void (*dataRemoved)(void* ctxt, BNBinaryView* view, uint64_t offset, uint64_t len);

binaryview.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ struct SymbolQueueAddContext
3838
};
3939

4040

41+
void BinaryDataNotification::UnregisteredCallback(void* ctxt)
42+
{
43+
BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
44+
return notify->OnUnregistered();
45+
}
46+
47+
4148
uint64_t BinaryDataNotification::NotificationBarrierCallback(void* ctxt, BNBinaryView* object)
4249
{
4350
BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
@@ -551,6 +558,7 @@ void BinaryDataNotification::RebasedCallback(void *ctxt, BNBinaryView *oldView,
551558
BinaryDataNotification::BinaryDataNotification()
552559
{
553560
m_callbacks.context = this;
561+
m_callbacks.unregistered = UnregisteredCallback;
554562
m_callbacks.notificationBarrier = nullptr;
555563
m_callbacks.dataWritten = DataWrittenCallback;
556564
m_callbacks.dataInserted = DataInsertedCallback;
@@ -612,6 +620,7 @@ BinaryDataNotification::BinaryDataNotification()
612620
BinaryDataNotification::BinaryDataNotification(NotificationTypes notifications)
613621
{
614622
m_callbacks.context = this;
623+
m_callbacks.unregistered = UnregisteredCallback;
615624
m_callbacks.notificationBarrier = (notifications & NotificationType::NotificationBarrier) ? NotificationBarrierCallback : nullptr;
616625
m_callbacks.dataWritten = (notifications & NotificationType::DataWritten) ? DataWrittenCallback : nullptr;
617626
m_callbacks.dataInserted = (notifications & NotificationType::DataInserted) ? DataInsertedCallback : nullptr;

0 commit comments

Comments
 (0)