Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .doxygen.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@
\defgroup flowgraph Flowgraph
\ingroup coreapi
*/
/*!
\defgroup formatstringresolutionprovider Format String Resolution Provider
\ingroup coreapi
*/
/*!
\defgroup function Function
\ingroup coreapi
Expand Down
1 change: 0 additions & 1 deletion binaryninjaapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
using namespace BinaryNinja;
using namespace std;


struct WorkerThreadActionContext
{
std::function<void()> action;
Expand Down
46 changes: 46 additions & 0 deletions binaryninjaapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -20941,6 +20941,52 @@ namespace BinaryNinja {
virtual bool DeleteData(const std::string& key) override;
};

/*! Resolves the argument types described by a format string.

\ingroup formatstringresolutionprovider
*/
class FormatStringResolutionProvider : public StaticCoreRefCountObject<BNFormatStringResolutionProvider>
{
std::string m_nameForRegister;

protected:
FormatStringResolutionProvider(const std::string& name);
FormatStringResolutionProvider(BNFormatStringResolutionProvider* provider);

static bool IsValidCallback(
void* ctxt, const char* format, BNPlatform* platform,
BNTypeWithConfidence** types, size_t* count);
static void FreeTypeListCallback(void* ctxt, BNTypeWithConfidence* types, size_t count);

public:
/*! Resolve the argument types described by a format string.

\param format Format string to validate and resolve
\param platform Platform whose ABI and C data model should be used to resolve types
\return A list of argument types when valid, including an empty list for a valid format with no
arguments, or an empty optional when invalid
*/
virtual std::optional<std::vector<Confidence<Ref<Type>>>> IsValid(
const std::string& format, Platform* platform) = 0;

std::string GetName() const;
static std::vector<Ref<FormatStringResolutionProvider>> GetList();
static Ref<FormatStringResolutionProvider> GetByName(const std::string& name);
static void Register(FormatStringResolutionProvider* provider);
};

/*!
\ingroup formatstringresolutionprovider
*/
class CoreFormatStringResolutionProvider : public FormatStringResolutionProvider
{
public:
CoreFormatStringResolutionProvider(BNFormatStringResolutionProvider* provider);

virtual std::optional<std::vector<Confidence<Ref<Type>>>> IsValid(
const std::string& format, Platform* platform) override;
};

/*! Components are objects that can contain Functions and other Components.

\note Components should not be instantiated directly. Instead use BinaryView::CreateComponent()
Expand Down
25 changes: 24 additions & 1 deletion binaryninjacore.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
// Current ABI version for linking to the core. This is incremented any time
// there are changes to the API that affect linking, including new functions,
// new types, or modifications to existing functions or types.
#define BN_CURRENT_CORE_ABI_VERSION 179
#define BN_CURRENT_CORE_ABI_VERSION 180

// Minimum ABI version that is supported for loading of plugins. Plugins that
// are linked to an ABI version less than this will not be able to load and
Expand Down Expand Up @@ -316,6 +316,7 @@ extern "C"
typedef struct BNDebugInfo BNDebugInfo;
typedef struct BNDebugInfoParser BNDebugInfoParser;
typedef struct BNSecretsProvider BNSecretsProvider;
typedef struct BNFormatStringResolutionProvider BNFormatStringResolutionProvider;
typedef struct BNLogger BNLogger;
typedef struct BNSymbolQueue BNSymbolQueue;
typedef struct BNTypeArchive BNTypeArchive;
Expand Down Expand Up @@ -3744,6 +3745,14 @@ extern "C"
bool (*deleteData)(void* ctxt, const char* key);
} BNSecretsProviderCallbacks;

typedef struct BNFormatStringResolutionProviderCallbacks
{
void* context;
bool (*isValid)(void* ctxt, const char* format, BNPlatform* platform,
BNTypeWithConfidence** types, size_t* count);
void (*freeTypeList)(void* ctxt, BNTypeWithConfidence* types, size_t count);
} BNFormatStringResolutionProviderCallbacks;

typedef struct BNMergedVariable
{
BNVariable target;
Expand Down Expand Up @@ -8727,6 +8736,20 @@ extern "C"
BINARYNINJACOREAPI bool BNStoreSecretsProviderData(BNSecretsProvider* provider, const char* key, const char* data);
BINARYNINJACOREAPI bool BNDeleteSecretsProviderData(BNSecretsProvider* provider, const char* key);

// Format string resolution providers
BINARYNINJACOREAPI BNFormatStringResolutionProvider* BNRegisterFormatStringResolutionProvider(
const char* name, BNFormatStringResolutionProviderCallbacks* callbacks);
BINARYNINJACOREAPI BNFormatStringResolutionProvider** BNGetFormatStringResolutionProviderList(size_t* count);
BINARYNINJACOREAPI void BNFreeFormatStringResolutionProviderList(
BNFormatStringResolutionProvider** providers);
BINARYNINJACOREAPI BNFormatStringResolutionProvider* BNGetFormatStringResolutionProviderByName(const char* name);
BINARYNINJACOREAPI char* BNGetFormatStringResolutionProviderName(
BNFormatStringResolutionProvider* provider);
BINARYNINJACOREAPI bool BNFormatStringResolutionProviderIsValid(
BNFormatStringResolutionProvider* provider, const char* format, BNPlatform* platform,
BNTypeWithConfidence** types, size_t* count);
BINARYNINJACOREAPI void BNFreeTypeWithConfidenceList(BNTypeWithConfidence* types, size_t count);

BINARYNINJACOREAPI BNSymbolQueue* BNCreateSymbolQueue(void);
BINARYNINJACOREAPI void BNDestroySymbolQueue(BNSymbolQueue* queue);
BINARYNINJACOREAPI void BNAppendSymbolQueue(BNSymbolQueue* queue,
Expand Down
Loading
Loading