summaryrefslogtreecommitdiff
path: root/binaryninjacore.h
diff options
context:
space:
mode:
Diffstat (limited to 'binaryninjacore.h')
-rw-r--r--binaryninjacore.h1385
1 files changed, 1385 insertions, 0 deletions
diff --git a/binaryninjacore.h b/binaryninjacore.h
new file mode 100644
index 00000000..51b4d642
--- /dev/null
+++ b/binaryninjacore.h
@@ -0,0 +1,1385 @@
+#ifndef __BINARYNINJACORE_H__
+#define __BINARYNINJACORE_H__
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#ifdef __GNUC__
+# ifdef BINARYNINJACORE_LIBRARY
+# define BINARYNINJACOREAPI __attribute__((visibility("default")))
+# else
+# define BINARYNINJACOREAPI
+# endif
+# define BINARYNINJAPLUGIN __attribute__((visibility("default")))
+#else
+#ifdef _MSC_VER
+# ifdef BINARYNINJACORE_LIBRARY
+# define BINARYNINJACOREAPI __declspec(dllexport)
+# else
+# define BINARYNINJACOREAPI
+# endif
+# define BINARYNINJAPLUGIN __declspec(dllexport)
+#else
+#define BINARYNINJACOREAPI
+#endif
+#endif
+
+#define BN_MAX_INSTRUCTION_LENGTH 16
+#define BN_MAX_INSTRUCTION_BRANCHES 3
+
+#define BN_MAX_STORED_DATA_LENGTH 0x3fffffff
+#define BN_NULL_ID -1
+
+#define LLIL_TEMP(n) (0x80000000 | (uint32_t)(n))
+#define LLIL_REG_IS_TEMP(n) (((n) & 0x80000000) != 0)
+#define LLIL_GET_TEMP_REG_INDEX(n) ((n) & 0x7fffffff)
+#define BN_INVALID_REGISTER 0xffffffff
+
+#define BN_INVALID_OPERAND 0xffffffff
+
+#define BN_DEFAULT_MIN_STRING_LENGTH 4
+#define BN_MAX_STRING_LENGTH 128
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+ enum BNPluginLoadOrder
+ {
+ EarlyPluginLoadOrder,
+ NormalPluginLoadOrder,
+ LatePluginLoadOrder
+ };
+
+ typedef bool (*BNCorePluginInitFunction)(void);
+ typedef void (*BNCorePluginDependencyFunction)(void);
+
+ struct BNDataBuffer;
+ struct BNBinaryView;
+ struct BNBinaryViewType;
+ struct BNBinaryReader;
+ struct BNBinaryWriter;
+ struct BNFileMetadata;
+ struct BNTransform;
+ struct BNArchitecture;
+ struct BNFunction;
+ struct BNBasicBlock;
+ struct BNFunctionGraph;
+ struct BNFunctionGraphBlock;
+ struct BNSymbol;
+ struct BNTemporaryFile;
+ struct BNLowLevelILFunction;
+ struct BNType;
+ struct BNStructure;
+ struct BNEnumeration;
+ struct BNCallingConvention;
+ struct BNPlatform;
+
+ enum BNLogLevel
+ {
+ DebugLog = 0,
+ InfoLog = 1,
+ WarningLog = 2,
+ ErrorLog = 3,
+ AlertLog = 4
+ };
+
+ enum BNEndianness
+ {
+ LittleEndian = 0,
+ BigEndian = 1
+ };
+
+ enum BNModificationStatus
+ {
+ Original = 0,
+ Changed = 1,
+ Inserted = 2
+ };
+
+ enum BNTransformType
+ {
+ BinaryCodecTransform = 0, // Two-way transform of data, binary input/output
+ TextCodecTransform = 1, // Two-way transform of data, encoder output is text
+ UnicodeCodecTransform = 2, // Two-way transform of data, encoder output is Unicode string (as UTF8)
+ DecodeTransform = 3, // One-way decode only
+ BinaryEncodeTransform = 4, // One-way encode only, output is binary
+ TextEncodeTransform = 5, // One-way encode only, output is text
+ EncryptTransform = 6, // Two-way encryption
+ InvertingTransform = 7, // Transform that can be undone by performing twice
+ HashTransform = 8 // Hash function
+ };
+
+ enum BNBranchType
+ {
+ UnconditionalBranch = 0,
+ FalseBranch = 1,
+ TrueBranch = 2,
+ CallDestination = 3,
+ FunctionReturn = 4,
+ SystemCall = 5,
+ UnresolvedBranch = 127
+ };
+
+ enum BNInstructionTextTokenType
+ {
+ TextToken = 0,
+ InstructionToken = 1,
+ OperandSeparatorToken = 2,
+ RegisterToken = 3,
+ IntegerToken = 4,
+ PossibleAddressToken = 5,
+ BeginMemoryOperandToken = 6,
+ EndMemoryOperandToken = 7,
+ FloatingPointToken = 8,
+ AnnotationToken = 9,
+
+ // The following are output by the analysis system automatically, these should
+ // not be used directly by the architecture plugins
+ CodeSymbolToken = 64,
+ DataSymbolToken = 65,
+ StackVariableToken = 66,
+ ImportToken = 67,
+ AddressDisplayToken = 68
+ };
+
+ enum BNSymbolType
+ {
+ FunctionSymbol = 0,
+ ImportAddressSymbol = 1,
+ ImportedFunctionSymbol = 2,
+ DataSymbol = 3,
+ ImportedDataSymbol = 4
+ };
+
+ enum BNActionType
+ {
+ TemporaryAction = 0,
+ DataModificationAction = 1,
+ AnalysisAction = 2,
+ DataModificationAndAnalysisAction = 3
+ };
+
+ enum BNLowLevelILOperation
+ {
+ LLIL_NOP,
+ LLIL_SET_REG,
+ LLIL_SET_REG_SPLIT,
+ LLIL_SET_FLAG,
+ LLIL_LOAD,
+ LLIL_STORE,
+ LLIL_PUSH,
+ LLIL_POP,
+ LLIL_REG,
+ LLIL_CONST,
+ LLIL_FLAG,
+ LLIL_FLAG_BIT,
+ LLIL_ADD,
+ LLIL_ADC,
+ LLIL_SUB,
+ LLIL_SBB,
+ LLIL_AND,
+ LLIL_OR,
+ LLIL_XOR,
+ LLIL_LSL,
+ LLIL_LSR,
+ LLIL_ASR,
+ LLIL_ROL,
+ LLIL_RLC,
+ LLIL_ROR,
+ LLIL_RRC,
+ LLIL_MUL,
+ LLIL_MULU_DP,
+ LLIL_MULS_DP,
+ LLIL_DIVU,
+ LLIL_DIVU_DP,
+ LLIL_DIVS,
+ LLIL_DIVS_DP,
+ LLIL_MODU,
+ LLIL_MODU_DP,
+ LLIL_MODS,
+ LLIL_MODS_DP,
+ LLIL_NEG,
+ LLIL_NOT,
+ LLIL_SX,
+ LLIL_ZX,
+ LLIL_JUMP,
+ LLIL_CALL,
+ LLIL_RET,
+ LLIL_NORET,
+ LLIL_IF,
+ LLIL_GOTO,
+ LLIL_FLAG_COND,
+ LLIL_CMP_E,
+ LLIL_CMP_NE,
+ LLIL_CMP_SLT,
+ LLIL_CMP_ULT,
+ LLIL_CMP_SLE,
+ LLIL_CMP_ULE,
+ LLIL_CMP_SGE,
+ LLIL_CMP_UGE,
+ LLIL_CMP_SGT,
+ LLIL_CMP_UGT,
+ LLIL_TEST_BIT,
+ LLIL_SYSCALL,
+ LLIL_BP,
+ LLIL_TRAP,
+ LLIL_UNDEF,
+ LLIL_UNIMPL,
+ LLIL_UNIMPL_MEM
+ };
+
+ enum BNLowLevelILFlagCondition
+ {
+ LLFC_E,
+ LLFC_NE,
+ LLFC_SLT,
+ LLFC_ULT,
+ LLFC_SLE,
+ LLFC_ULE,
+ LLFC_SGE,
+ LLFC_UGE,
+ LLFC_SGT,
+ LLFC_UGT,
+ LLFC_NEG,
+ LLFC_POS,
+ LLFC_O,
+ LLFC_NO
+ };
+
+ enum BNFunctionGraphType
+ {
+ NormalFunctionGraph = 0,
+ LowLevelILFunctionGraph = 1
+ };
+
+ enum BNFunctionGraphOption
+ {
+ ShowAddress = 0,
+
+ // Debugging options
+ ShowBasicBlockRegisterState = 128
+ };
+
+ enum BNTypeClass
+ {
+ VoidTypeClass = 0,
+ BoolTypeClass = 1,
+ IntegerTypeClass = 2,
+ FloatTypeClass = 3,
+ StructureTypeClass = 4,
+ EnumerationTypeClass = 5,
+ PointerTypeClass = 6,
+ ArrayTypeClass = 7,
+ FunctionTypeClass = 8
+ };
+
+ enum BNStringType
+ {
+ AsciiString = 0,
+ Utf16String = 1,
+ Utf32String = 2
+ };
+
+ struct BNLowLevelILInstruction
+ {
+ BNLowLevelILOperation operation;
+ size_t size;
+ uint32_t flags;
+ uint32_t sourceOperand;
+ uint64_t operands[4];
+ uint64_t address;
+ };
+
+ struct BNLowLevelILLabel
+ {
+ bool resolved;
+ size_t ref;
+ size_t operand;
+ };
+
+ enum BNImplicitRegisterExtend
+ {
+ NoExtend,
+ ZeroExtendToFullWidth,
+ SignExtendToFullWidth
+ };
+
+ struct BNRegisterInfo
+ {
+ uint32_t fullWidthRegister;
+ size_t offset;
+ size_t size;
+ BNImplicitRegisterExtend extend;
+ };
+
+ enum BNRegisterValueType
+ {
+ EntryValue,
+ OffsetFromEntryValue,
+ ConstantValue,
+ StackFrameOffset,
+ UndeterminedValue
+ };
+
+ struct BNRegisterValue
+ {
+ BNRegisterValueType state;
+ uint32_t reg; // For EntryValue and OffsetFromEntryValue, the original input register
+ int64_t value; // Offset for OffsetFromEntryValue or StackFrameOffset, value of register for ConstantValue
+ };
+
+ // Callbacks
+ struct BNLogListener
+ {
+ void* context;
+ void (*log)(void* ctxt, BNLogLevel level, const char* msg);
+ void (*close)(void* ctxt);
+ BNLogLevel (*getLogLevel)(void* ctxt);
+ };
+
+ struct BNNavigationHandler
+ {
+ void* context;
+ char* (*getCurrentView)(void* ctxt);
+ uint64_t (*getCurrentOffset)(void* ctxt);
+ bool (*navigate)(void* ctxt, const char* view, uint64_t offset);
+ };
+
+ struct BNBinaryDataNotification
+ {
+ void* context;
+ void (*dataWritten)(void* ctxt, BNBinaryView* view, uint64_t offset, size_t len);
+ void (*dataInserted)(void* ctxt, BNBinaryView* view, uint64_t offset, size_t len);
+ void (*dataRemoved)(void* ctxt, BNBinaryView* view, uint64_t offset, uint64_t len);
+ void (*functionAdded)(void* ctxt, BNBinaryView* view, BNFunction* func);
+ void (*functionRemoved)(void* ctxt, BNBinaryView* view, BNFunction* func);
+ void (*functionUpdated)(void* ctxt, BNBinaryView* view, BNFunction* func);
+ void (*stringFound)(void* ctxt, BNBinaryView* view, BNStringType type, uint64_t offset, size_t len);
+ void (*stringRemoved)(void* ctxt, BNBinaryView* view, BNStringType type, uint64_t offset, size_t len);
+ };
+
+ struct BNFileAccessor
+ {
+ void* context;
+ uint64_t (*getLength)(void* ctxt);
+ size_t (*read)(void* ctxt, void* dest, uint64_t offset, size_t len);
+ size_t (*write)(void* ctxt, uint64_t offset, const void* src, size_t len);
+ };
+
+ struct BNCustomBinaryView
+ {
+ void* context;
+ bool (*init)(void* ctxt);
+ void (*freeObject)(void* ctxt);
+ size_t (*read)(void* ctxt, void* dest, uint64_t offset, size_t len);
+ size_t (*write)(void* ctxt, uint64_t offset, const void* src, size_t len);
+ size_t (*insert)(void* ctxt, uint64_t offset, const void* src, size_t len);
+ size_t (*remove)(void* ctxt, uint64_t offset, uint64_t len);
+ BNModificationStatus (*getModification)(void* ctxt, uint64_t offset);
+ bool (*isValidOffset)(void* ctxt, uint64_t offset);
+ bool (*isOffsetReadable)(void* ctxt, uint64_t offset);
+ bool (*isOffsetWritable)(void* ctxt, uint64_t offset);
+ bool (*isOffsetExecutable)(void* ctxt, uint64_t offset);
+ uint64_t (*getNextValidOffset)(void* ctxt, uint64_t offset);
+ uint64_t (*getStart)(void* ctxt);
+ uint64_t (*getLength)(void* ctxt);
+ uint64_t (*getEntryPoint)(void* ctxt);
+ bool (*isExecutable)(void* ctxt);
+ BNEndianness (*getDefaultEndianness)(void* ctxt);
+ size_t (*getAddressSize)(void* ctxt);
+ bool (*save)(void* ctxt, BNFileAccessor* accessor);
+ };
+
+ struct BNCustomBinaryViewType
+ {
+ void* context;
+ BNBinaryView* (*create)(void* ctxt, BNBinaryView* data);
+ bool (*isValidForData)(void* ctxt, BNBinaryView* data);
+ };
+
+ struct BNTransformParameterInfo
+ {
+ char* name;
+ char* longName;
+ size_t fixedLength; // Variable length if zero
+ };
+
+ struct BNTransformParameter
+ {
+ const char* name;
+ BNDataBuffer* value;
+ };
+
+ struct BNCustomTransform
+ {
+ void* context;
+ BNTransformParameterInfo* (*getParameters)(void* ctxt, size_t* count);
+ void (*freeParameters)(BNTransformParameterInfo* params, size_t count);
+ bool (*decode)(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount);
+ bool (*encode)(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount);
+ };
+
+ struct BNInstructionInfo
+ {
+ size_t length;
+ size_t branchCount;
+ bool branchDelay;
+ BNBranchType branchType[BN_MAX_INSTRUCTION_BRANCHES];
+ uint64_t branchTarget[BN_MAX_INSTRUCTION_BRANCHES];
+ BNArchitecture* branchArch[BN_MAX_INSTRUCTION_BRANCHES]; // If null, same architecture as instruction
+ };
+
+ struct BNInstructionTextToken
+ {
+ BNInstructionTextTokenType type;
+ char* text;
+ uint64_t value;
+ };
+
+ struct BNCustomArchitecture
+ {
+ void* context;
+ void (*init)(void* context, BNArchitecture* obj);
+ BNEndianness (*getEndianness)(void* ctxt);
+ size_t (*getAddressSize)(void* ctxt);
+ size_t (*getDefaultIntegerSize)(void* ctxt);
+ bool (*getInstructionInfo)(void* ctxt, const uint8_t* data, uint64_t addr, size_t maxLen, BNInstructionInfo* result);
+ bool (*getInstructionText)(void* ctxt, const uint8_t* data, uint64_t addr, size_t* len,
+ BNInstructionTextToken** result, size_t* count);
+ void (*freeInstructionText)(BNInstructionTextToken* tokens, size_t count);
+ bool (*getInstructionLowLevelIL)(void* ctxt, const uint8_t* data, uint64_t addr, size_t* len, BNLowLevelILFunction* il);
+ char* (*getRegisterName)(void* ctxt, uint32_t reg);
+ char* (*getFlagName)(void* ctxt, uint32_t flag);
+ char* (*getFlagWriteTypeName)(void* ctxt, uint32_t flags);
+ uint32_t* (*getFullWidthRegisters)(void* ctxt, size_t* count);
+ uint32_t* (*getAllRegisters)(void* ctxt, size_t* count);
+ uint32_t* (*getAllFlags)(void* ctxt, size_t* count);
+ uint32_t* (*getAllFlagWriteTypes)(void* ctxt, size_t* count);
+ void (*freeRegisterList)(void* ctxt, uint32_t* regs);
+ void (*getRegisterInfo)(void* ctxt, uint32_t reg, BNRegisterInfo* result);
+ uint32_t (*getStackPointerRegister)(void* ctxt);
+ uint32_t (*getLinkRegister)(void* ctxt);
+
+ bool (*assemble)(void* ctxt, const char* code, uint64_t addr, BNDataBuffer* result, char** errors);
+
+ bool (*isNeverBranchPatchAvailable)(void* ctxt, const uint8_t* data, uint64_t addr, size_t len);
+ bool (*isAlwaysBranchPatchAvailable)(void* ctxt, const uint8_t* data, uint64_t addr, size_t len);
+ bool (*isInvertBranchPatchAvailable)(void* ctxt, const uint8_t* data, uint64_t addr, size_t len);
+ bool (*isSkipAndReturnZeroPatchAvailable)(void* ctxt, const uint8_t* data, uint64_t addr, size_t len);
+ bool (*isSkipAndReturnValuePatchAvailable)(void* ctxt, const uint8_t* data, uint64_t addr, size_t len);
+
+ bool (*convertToNop)(void* ctxt, uint8_t* data, uint64_t addr, size_t len);
+ bool (*alwaysBranch)(void* ctxt, uint8_t* data, uint64_t addr, size_t len);
+ bool (*invertBranch)(void* ctxt, uint8_t* data, uint64_t addr, size_t len);
+ bool (*skipAndReturnValue)(void* ctxt, uint8_t* data, uint64_t addr, size_t len, uint64_t value);
+ };
+
+ struct BNBasicBlockEdge
+ {
+ BNBranchType type;
+ uint64_t target;
+ BNArchitecture* arch;
+ };
+
+ struct BNPoint
+ {
+ float x;
+ float y;
+ };
+
+ struct BNFunctionGraphEdge
+ {
+ BNBranchType type;
+ uint64_t target;
+ BNArchitecture* arch;
+ BNPoint* points;
+ size_t pointCount;
+ };
+
+ struct BNFunctionGraphTextLine
+ {
+ uint64_t addr;
+ BNInstructionTextToken* tokens;
+ size_t count;
+ };
+
+ struct BNReferenceSource
+ {
+ BNFunction* func;
+ BNArchitecture* arch;
+ uint64_t addr;
+ };
+
+ struct BNUndoAction
+ {
+ BNActionType type;
+ void* context;
+ void (*freeObject)(void* ctxt);
+ void (*undo)(void* ctxt, BNBinaryView* data);
+ void (*redo)(void* ctxt, BNBinaryView* data);
+ char* (*serialize)(void* ctxt);
+ };
+
+ struct BNNameAndType
+ {
+ char* name;
+ BNType* type;
+ };
+
+ struct BNStructureMember
+ {
+ BNType* type;
+ char* name;
+ uint64_t offset;
+ };
+
+ struct BNEnumerationMember
+ {
+ char* name;
+ uint64_t value;
+ bool isDefault;
+ };
+
+ struct BNFunctionRecognizer
+ {
+ void* context;
+ bool (*recognizeLowLevelIL)(void* ctxt, BNBinaryView* data, BNFunction* func, BNLowLevelILFunction* il);
+ };
+
+ struct BNTypeParserResult
+ {
+ BNNameAndType* types;
+ BNNameAndType* variables;
+ BNNameAndType* functions;
+ size_t typeCount, variableCount, functionCount;
+ };
+
+ enum BNUpdateResult
+ {
+ UpdateFailed = 0,
+ UpdateSuccess = 1,
+ AlreadyUpToDate = 2
+ };
+
+ struct BNUpdateChannel
+ {
+ char* name;
+ char* description;
+ char* latestVersion;
+ };
+
+ struct BNUpdateVersion
+ {
+ char* version;
+ char* notes;
+ uint64_t time;
+ };
+
+ struct BNStringReference
+ {
+ BNStringType type;
+ uint64_t start;
+ size_t length;
+ };
+
+ enum BNPluginCommandType
+ {
+ DefaultPluginCommand,
+ AddressPluginCommand,
+ RangePluginCommand,
+ FunctionPluginCommand
+ };
+
+ struct BNPluginCommand
+ {
+ char* name;
+ char* description;
+ BNPluginCommandType type;
+ void* context;
+
+ void (*defaultCommand)(void* ctxt, BNBinaryView* view);
+ void (*addressCommand)(void* ctxt, BNBinaryView* view, uint64_t addr);
+ void (*rangeCommand)(void* ctxt, BNBinaryView* view, uint64_t addr, uint64_t len);
+ void (*functionCommand)(void* ctxt, BNBinaryView* view, BNFunction* func);
+
+ bool (*defaultIsValid)(void* ctxt, BNBinaryView* view);
+ bool (*addressIsValid)(void* ctxt, BNBinaryView* view, uint64_t addr);
+ bool (*rangeIsValid)(void* ctxt, BNBinaryView* view, uint64_t addr, uint64_t len);
+ bool (*functionIsValid)(void* ctxt, BNBinaryView* view, BNFunction* func);
+ };
+
+ struct BNCustomCallingConvention
+ {
+ void* context;
+
+ void (*freeObject)(void* ctxt);
+
+ uint32_t* (*getCallerSavedRegisters)(void* ctxt, size_t* count);
+ uint32_t* (*getIntegerArgumentRegisters)(void* ctxt, size_t* count);
+ uint32_t* (*getFloatArgumentRegisters)(void* ctxt, size_t* count);
+ void (*freeRegisterList)(void* ctxt, uint32_t* regs);
+
+ bool (*areArgumentRegistersSharedIndex)(void* ctxt);
+ bool (*isStackReservedForArgumentRegisters)(void* ctxt);
+
+ uint32_t (*getIntegerReturnValueRegister)(void* ctxt);
+ uint32_t (*getHighIntegerReturnValueRegister)(void* ctxt);
+ uint32_t (*getFloatReturnValueRegister)(void* ctxt);
+ };
+
+ struct BNStackVariable
+ {
+ BNType* type;
+ char* name;
+ int64_t offset;
+ bool autoDefined;
+ };
+
+ struct BNStackVariableReference
+ {
+ uint32_t sourceOperand;
+ BNType* type;
+ char* name;
+ int64_t startingOffset;
+ int64_t referencedOffset;
+ };
+
+ BINARYNINJACOREAPI char* BNAllocString(const char* contents);
+ BINARYNINJACOREAPI void BNFreeString(char* str);
+
+ BINARYNINJACOREAPI void BNShutdown(void);
+
+ BINARYNINJACOREAPI char* BNGetVersionString(void);
+ BINARYNINJACOREAPI uint32_t BNGetBuildId(void);
+
+ BINARYNINJACOREAPI bool BNIsLicenseValidated(void);
+
+ // Plugin initialization
+ BINARYNINJACOREAPI void BNInitCorePlugins(void);
+ BINARYNINJACOREAPI void BNInitUserPlugins(void);
+ BINARYNINJACOREAPI char* BNGetBundledPluginDirectory(void);
+ BINARYNINJACOREAPI void BNSetBundledPluginDirectory(const char* path);
+ BINARYNINJACOREAPI char* BNGetUserPluginDirectory(void);
+
+ BINARYNINJACOREAPI char* BNGetPathRelativeToBundledPluginDirectory(const char* path);
+ BINARYNINJACOREAPI char* BNGetPathRelativeToUserPluginDirectory(const char* path);
+
+ BINARYNINJACOREAPI bool BNExecuteWorkerProcess(const char* path, const char* args[],
+ BNDataBuffer* input, char** output, char** error);
+
+ BINARYNINJACOREAPI void BNSetCurrentPluginLoadOrder(BNPluginLoadOrder order);
+ BINARYNINJACOREAPI void BNAddRequiredPluginDependency(const char* name);
+ BINARYNINJACOREAPI void BNAddOptionalPluginDependency(const char* name);
+
+ // Logging
+ BINARYNINJACOREAPI void BNLog(BNLogLevel level, const char* fmt, ...);
+ BINARYNINJACOREAPI void BNLogDebug(const char* fmt, ...);
+ BINARYNINJACOREAPI void BNLogInfo(const char* fmt, ...);
+ BINARYNINJACOREAPI void BNLogWarn(const char* fmt, ...);
+ BINARYNINJACOREAPI void BNLogError(const char* fmt, ...);
+ BINARYNINJACOREAPI void BNLogAlert(const char* fmt, ...);
+
+ BINARYNINJACOREAPI void BNRegisterLogListener(BNLogListener* listener);
+ BINARYNINJACOREAPI void BNUnregisterLogListener(BNLogListener* listener);
+ BINARYNINJACOREAPI void BNUpdateLogListeners(void);
+
+ BINARYNINJACOREAPI void BNLogToStdout(BNLogLevel minimumLevel);
+ BINARYNINJACOREAPI void BNLogToStderr(BNLogLevel minimumLevel);
+ BINARYNINJACOREAPI bool BNLogToFile(BNLogLevel minimumLevel, const char* path, bool append);
+ BINARYNINJACOREAPI void BNCloseLogs(void);
+
+ // Temporary files
+ BINARYNINJACOREAPI BNTemporaryFile* BNCreateTemporaryFile(void);
+ BINARYNINJACOREAPI BNTemporaryFile* BNCreateTemporaryFileWithContents(BNDataBuffer* data);
+ BINARYNINJACOREAPI BNTemporaryFile* BNNewTemporaryFileReference(BNTemporaryFile* file);
+ BINARYNINJACOREAPI void BNFreeTemporaryFile(BNTemporaryFile* file);
+ BINARYNINJACOREAPI char* BNGetTemporaryFilePath(BNTemporaryFile* file);
+ BINARYNINJACOREAPI BNDataBuffer* BNGetTemporaryFileContents(BNTemporaryFile* file);
+
+ // Data buffer management
+ BINARYNINJACOREAPI BNDataBuffer* BNCreateDataBuffer(const void* data, size_t len);
+ BINARYNINJACOREAPI BNDataBuffer* BNDuplicateDataBuffer(BNDataBuffer* buf);
+ BINARYNINJACOREAPI void BNFreeDataBuffer(BNDataBuffer* buf);
+ BINARYNINJACOREAPI void* BNGetDataBufferContents(BNDataBuffer* buf);
+ BINARYNINJACOREAPI void* BNGetDataBufferContentsAt(BNDataBuffer* buf, size_t offset);
+ BINARYNINJACOREAPI size_t BNGetDataBufferLength(BNDataBuffer* buf);
+ BINARYNINJACOREAPI BNDataBuffer* BNGetDataBufferSlice(BNDataBuffer* buf, size_t start, size_t len);
+
+ BINARYNINJACOREAPI void BNSetDataBufferLength(BNDataBuffer* buf, size_t len);
+ BINARYNINJACOREAPI void BNClearDataBuffer(BNDataBuffer* buf);
+ BINARYNINJACOREAPI void BNSetDataBufferContents(BNDataBuffer* buf, void* data, size_t len);
+ BINARYNINJACOREAPI void BNAssignDataBuffer(BNDataBuffer* dest, BNDataBuffer* src);
+ BINARYNINJACOREAPI void BNAppendDataBuffer(BNDataBuffer* dest, BNDataBuffer* src);
+ BINARYNINJACOREAPI void BNAppendDataBufferContents(BNDataBuffer* dest, const void* src, size_t len);
+
+ BINARYNINJACOREAPI uint8_t BNGetDataBufferByte(BNDataBuffer* buf, size_t offset);
+ BINARYNINJACOREAPI void BNSetDataBufferByte(BNDataBuffer* buf, size_t offset, uint8_t val);
+
+ BINARYNINJACOREAPI char* BNDataBufferToEscapedString(BNDataBuffer* buf);
+ BINARYNINJACOREAPI BNDataBuffer* BNDecodeEscapedString(const char* str);
+ BINARYNINJACOREAPI char* BNDataBufferToBase64(BNDataBuffer* buf);
+ BINARYNINJACOREAPI BNDataBuffer* BNDecodeBase64(const char* str);
+
+ BINARYNINJACOREAPI BNDataBuffer* BNZlibCompress(BNDataBuffer* buf);
+ BINARYNINJACOREAPI BNDataBuffer* BNZlibDecompress(BNDataBuffer* buf);
+
+ // File metadata object
+ BINARYNINJACOREAPI BNFileMetadata* BNCreateFileMetadata(void);
+ BINARYNINJACOREAPI BNFileMetadata* BNNewFileReference(BNFileMetadata* file);
+ BINARYNINJACOREAPI void BNFreeFileMetadata(BNFileMetadata* file);
+ BINARYNINJACOREAPI void BNCloseFile(BNFileMetadata* file);
+ BINARYNINJACOREAPI void BNSetFileMetadataNavigationHandler(BNFileMetadata* file, BNNavigationHandler* handler);
+ BINARYNINJACOREAPI bool BNIsFileModified(BNFileMetadata* file);
+ BINARYNINJACOREAPI bool BNIsAnalysisChanged(BNFileMetadata* file);
+ BINARYNINJACOREAPI void BNMarkFileModified(BNFileMetadata* file);
+ BINARYNINJACOREAPI void BNMarkFileSaved(BNFileMetadata* file);
+
+ BINARYNINJACOREAPI bool BNIsBackedByDatabase(BNFileMetadata* file);
+ BINARYNINJACOREAPI bool BNCreateDatabase(BNBinaryView* data, const char* path);
+ BINARYNINJACOREAPI BNBinaryView* BNOpenExistingDatabase(BNFileMetadata* file, const char* path);
+ BINARYNINJACOREAPI bool BNSaveAutoSnapshot(BNBinaryView* data);
+
+ BINARYNINJACOREAPI char* BNGetFilename(BNFileMetadata* file);
+ BINARYNINJACOREAPI void BNSetFilename(BNFileMetadata* file, const char* name);
+
+ BINARYNINJACOREAPI void BNRegisterUndoActionType(const char* name, void* typeContext,
+ bool (*deserialize)(void* ctxt, const char* data, BNUndoAction* result));
+ BINARYNINJACOREAPI void BNBeginUndoActions(BNFileMetadata* file);
+ BINARYNINJACOREAPI void BNAddUndoAction(BNBinaryView* view, const char* type, BNUndoAction* action);
+ BINARYNINJACOREAPI void BNCommitUndoActions(BNFileMetadata* file);
+
+ BINARYNINJACOREAPI bool BNUndo(BNFileMetadata* file);
+ BINARYNINJACOREAPI bool BNRedo(BNFileMetadata* file);
+
+ BINARYNINJACOREAPI char* BNGetCurrentView(BNFileMetadata* file);
+ BINARYNINJACOREAPI uint64_t BNGetCurrentOffset(BNFileMetadata* file);
+ BINARYNINJACOREAPI bool BNNavigate(BNFileMetadata* file, const char* view, uint64_t offset);
+
+ BINARYNINJACOREAPI BNBinaryView* BNGetFileViewOfType(BNFileMetadata* file, const char* name);
+
+ // Binary view access
+ BINARYNINJACOREAPI BNBinaryView* BNNewViewReference(BNBinaryView* view);
+ BINARYNINJACOREAPI void BNFreeBinaryView(BNBinaryView* view);
+ BINARYNINJACOREAPI BNFileMetadata* BNGetFileForView(BNBinaryView* view);
+ BINARYNINJACOREAPI char* BNGetViewType(BNBinaryView* view);
+
+ BINARYNINJACOREAPI size_t BNReadViewData(BNBinaryView* view, void* dest, uint64_t offset, size_t len);
+ BINARYNINJACOREAPI BNDataBuffer* BNReadViewBuffer(BNBinaryView* view, uint64_t offset, size_t len);
+
+ BINARYNINJACOREAPI size_t BNWriteViewData(BNBinaryView* view, uint64_t offset, const void* data, size_t len);
+ BINARYNINJACOREAPI size_t BNWriteViewBuffer(BNBinaryView* view, uint64_t offset, BNDataBuffer* data);
+ BINARYNINJACOREAPI size_t BNInsertViewData(BNBinaryView* view, uint64_t offset, const void* data, size_t len);
+ BINARYNINJACOREAPI size_t BNInsertViewBuffer(BNBinaryView* view, uint64_t offset, BNDataBuffer* data);
+ BINARYNINJACOREAPI size_t BNRemoveViewData(BNBinaryView* view, uint64_t offset, uint64_t len);
+
+ BINARYNINJACOREAPI void BNNotifyDataWritten(BNBinaryView* view, uint64_t offset, size_t len);
+ BINARYNINJACOREAPI void BNNotifyDataInserted(BNBinaryView* view, uint64_t offset, size_t len);
+ BINARYNINJACOREAPI void BNNotifyDataRemoved(BNBinaryView* view, uint64_t offset, uint64_t len);
+
+ BINARYNINJACOREAPI BNModificationStatus BNGetModification(BNBinaryView* view, uint64_t offset);
+ BINARYNINJACOREAPI size_t BNGetModificationArray(BNBinaryView* view, uint64_t offset, BNModificationStatus* result, size_t len);
+
+ BINARYNINJACOREAPI bool BNIsValidOffset(BNBinaryView* view, uint64_t offset);
+ BINARYNINJACOREAPI bool BNIsOffsetReadable(BNBinaryView* view, uint64_t offset);
+ BINARYNINJACOREAPI bool BNIsOffsetWritable(BNBinaryView* view, uint64_t offset);
+ BINARYNINJACOREAPI bool BNIsOffsetExecutable(BNBinaryView* view, uint64_t offset);
+ BINARYNINJACOREAPI uint64_t BNGetNextValidOffset(BNBinaryView* view, uint64_t offset);
+ BINARYNINJACOREAPI uint64_t BNGetStartOffset(BNBinaryView* view);
+ BINARYNINJACOREAPI uint64_t BNGetEndOffset(BNBinaryView* view);
+ BINARYNINJACOREAPI uint64_t BNGetViewLength(BNBinaryView* view);
+ BINARYNINJACOREAPI uint64_t BNGetEntryPoint(BNBinaryView* view);
+
+ BINARYNINJACOREAPI BNArchitecture* BNGetDefaultArchitecture(BNBinaryView* view);
+ BINARYNINJACOREAPI void BNSetDefaultArchitecture(BNBinaryView* view, BNArchitecture* arch);
+ BINARYNINJACOREAPI BNPlatform* BNGetDefaultPlatform(BNBinaryView* view);
+ BINARYNINJACOREAPI void BNSetDefaultPlatform(BNBinaryView* view, BNPlatform* platform);
+ BINARYNINJACOREAPI BNEndianness BNGetDefaultEndianness(BNBinaryView* view);
+ BINARYNINJACOREAPI size_t BNGetViewAddressSize(BNBinaryView* view);
+
+ BINARYNINJACOREAPI bool BNIsViewModified(BNBinaryView* view);
+ BINARYNINJACOREAPI bool BNIsExecutableView(BNBinaryView* view);
+
+ BINARYNINJACOREAPI bool BNSaveToFile(BNBinaryView* view, BNFileAccessor* file);
+ BINARYNINJACOREAPI bool BNSaveToFilename(BNBinaryView* view, const char* filename);
+
+ BINARYNINJACOREAPI void BNRegisterDataNotification(BNBinaryView* view, BNBinaryDataNotification* notify);
+ BINARYNINJACOREAPI void BNUnregisterDataNotification(BNBinaryView* view, BNBinaryDataNotification* notify);
+
+ BINARYNINJACOREAPI bool BNIsNeverBranchPatchAvailable(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI bool BNIsAlwaysBranchPatchAvailable(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI bool BNIsInvertBranchPatchAvailable(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI bool BNIsSkipAndReturnZeroPatchAvailable(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI bool BNIsSkipAndReturnValuePatchAvailable(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+
+ BINARYNINJACOREAPI bool BNConvertToNop(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI bool BNAlwaysBranch(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI bool BNInvertBranch(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI bool BNSkipAndReturnValue(BNBinaryView* view, BNArchitecture* arch, uint64_t addr, uint64_t value);
+
+ BINARYNINJACOREAPI size_t BNGetInstructionLength(BNBinaryView* view, BNArchitecture* arch, uint64_t addr);
+
+ // Raw binary data view
+ BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataView(BNFileMetadata* file);
+ BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromBuffer(BNFileMetadata* file, BNDataBuffer* buf);
+ BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromData(BNFileMetadata* file, const void* data, size_t len);
+ BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromFilename(BNFileMetadata* file, const char* filename);
+ BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromFile(BNFileMetadata* file, BNFileAccessor* accessor);
+
+ // Creation of new types of binary views
+ BINARYNINJACOREAPI BNBinaryView* BNCreateCustomBinaryView(const char* name, BNFileMetadata* file, BNCustomBinaryView* view);
+
+ // Binary view type management
+ BINARYNINJACOREAPI BNBinaryViewType* BNGetBinaryViewTypeByName(const char* name);
+ BINARYNINJACOREAPI BNBinaryViewType** BNGetBinaryViewTypes(size_t* count);
+ BINARYNINJACOREAPI BNBinaryViewType** BNGetBinaryViewTypesForData(BNBinaryView* data, size_t* count);
+ BINARYNINJACOREAPI void BNFreeBinaryViewTypeList(BNBinaryViewType** types);
+ BINARYNINJACOREAPI char* BNGetBinaryViewTypeName(BNBinaryViewType* type);
+ BINARYNINJACOREAPI char* BNGetBinaryViewTypeLongName(BNBinaryViewType* type);
+ BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryViewOfType(BNBinaryViewType* type, BNBinaryView* data);
+ BINARYNINJACOREAPI bool BNIsBinaryViewTypeValidForData(BNBinaryViewType* type, BNBinaryView* data);
+
+ BINARYNINJACOREAPI BNBinaryViewType* BNRegisterBinaryViewType(const char* name, const char* longName,
+ BNCustomBinaryViewType* type);
+
+ BINARYNINJACOREAPI void BNRegisterArchitectureForViewType(BNBinaryViewType* type, uint32_t id, BNArchitecture* arch);
+ BINARYNINJACOREAPI BNArchitecture* BNGetArchitectureForViewType(BNBinaryViewType* type, uint32_t id);
+
+ BINARYNINJACOREAPI void BNRegisterPlatformForViewType(BNBinaryViewType* type, uint32_t id, BNArchitecture* arch,
+ BNPlatform* platform);
+ BINARYNINJACOREAPI void BNRegisterDefaultPlatformForViewType(BNBinaryViewType* type, BNArchitecture* arch,
+ BNPlatform* platform);
+ BINARYNINJACOREAPI BNPlatform* BNGetPlatformForViewType(BNBinaryViewType* type, uint32_t id, BNArchitecture* arch);
+
+ // Stream reader object
+ BINARYNINJACOREAPI BNBinaryReader* BNCreateBinaryReader(BNBinaryView* view);
+ BINARYNINJACOREAPI void BNFreeBinaryReader(BNBinaryReader* stream);
+ BINARYNINJACOREAPI BNEndianness BNGetBinaryReaderEndianness(BNBinaryReader* stream);
+ BINARYNINJACOREAPI void BNSetBinaryReaderEndianness(BNBinaryReader* stream, BNEndianness endian);
+
+ BINARYNINJACOREAPI bool BNReadData(BNBinaryReader* stream, void* dest, size_t len);
+ BINARYNINJACOREAPI bool BNRead8(BNBinaryReader* stream, uint8_t* result);
+ BINARYNINJACOREAPI bool BNRead16(BNBinaryReader* stream, uint16_t* result);
+ BINARYNINJACOREAPI bool BNRead32(BNBinaryReader* stream, uint32_t* result);
+ BINARYNINJACOREAPI bool BNRead64(BNBinaryReader* stream, uint64_t* result);
+ BINARYNINJACOREAPI bool BNReadLE16(BNBinaryReader* stream, uint16_t* result);
+ BINARYNINJACOREAPI bool BNReadLE32(BNBinaryReader* stream, uint32_t* result);
+ BINARYNINJACOREAPI bool BNReadLE64(BNBinaryReader* stream, uint64_t* result);
+ BINARYNINJACOREAPI bool BNReadBE16(BNBinaryReader* stream, uint16_t* result);
+ BINARYNINJACOREAPI bool BNReadBE32(BNBinaryReader* stream, uint32_t* result);
+ BINARYNINJACOREAPI bool BNReadBE64(BNBinaryReader* stream, uint64_t* result);
+
+ BINARYNINJACOREAPI uint64_t BNGetReaderPosition(BNBinaryReader* stream);
+ BINARYNINJACOREAPI void BNSeekBinaryReader(BNBinaryReader* stream, uint64_t offset);
+ BINARYNINJACOREAPI void BNSeekBinaryReaderRelative(BNBinaryReader* stream, int64_t offset);
+ BINARYNINJACOREAPI bool BNIsEndOfFile(BNBinaryReader* stream);
+
+ // Stream writer object
+ BINARYNINJACOREAPI BNBinaryWriter* BNCreateBinaryWriter(BNBinaryView* view);
+ BINARYNINJACOREAPI void BNFreeBinaryWriter(BNBinaryWriter* stream);
+ BINARYNINJACOREAPI BNEndianness BNGetBinaryWriterEndianness(BNBinaryWriter* stream);
+ BINARYNINJACOREAPI void BNSetBinaryWriterEndianness(BNBinaryWriter* stream, BNEndianness endian);
+
+ BINARYNINJACOREAPI bool BNWriteData(BNBinaryWriter* stream, const void* src, size_t len);
+ BINARYNINJACOREAPI bool BNWrite8(BNBinaryWriter* stream, uint8_t val);
+ BINARYNINJACOREAPI bool BNWrite16(BNBinaryWriter* stream, uint16_t val);
+ BINARYNINJACOREAPI bool BNWrite32(BNBinaryWriter* stream, uint32_t val);
+ BINARYNINJACOREAPI bool BNWrite64(BNBinaryWriter* stream, uint64_t val);
+ BINARYNINJACOREAPI bool BNWriteLE16(BNBinaryWriter* stream, uint16_t val);
+ BINARYNINJACOREAPI bool BNWriteLE32(BNBinaryWriter* stream, uint32_t val);
+ BINARYNINJACOREAPI bool BNWriteLE64(BNBinaryWriter* stream, uint64_t val);
+ BINARYNINJACOREAPI bool BNWriteBE16(BNBinaryWriter* stream, uint16_t val);
+ BINARYNINJACOREAPI bool BNWriteBE32(BNBinaryWriter* stream, uint32_t val);
+ BINARYNINJACOREAPI bool BNWriteBE64(BNBinaryWriter* stream, uint64_t val);
+
+ BINARYNINJACOREAPI uint64_t BNGetWriterPosition(BNBinaryWriter* stream);
+ BINARYNINJACOREAPI void BNSeekBinaryWriter(BNBinaryWriter* stream, uint64_t offset);
+ BINARYNINJACOREAPI void BNSeekBinaryWriterRelative(BNBinaryWriter* stream, int64_t offset);
+
+ // Transforms
+ BINARYNINJACOREAPI BNTransform* BNGetTransformByName(const char* name);
+ BINARYNINJACOREAPI BNTransform** BNGetTransformTypeList(size_t* count);
+ BINARYNINJACOREAPI void BNFreeTransformTypeList(BNTransform** xforms);
+ BINARYNINJACOREAPI BNTransform* BNRegisterTransformType(BNTransformType type, const char* name, const char* longName,
+ const char* group, BNCustomTransform* xform);
+
+ BINARYNINJACOREAPI BNTransformType BNGetTransformType(BNTransform* xform);
+ BINARYNINJACOREAPI char* BNGetTransformName(BNTransform* xform);
+ BINARYNINJACOREAPI char* BNGetTransformLongName(BNTransform* xform);
+ BINARYNINJACOREAPI char* BNGetTransformGroup(BNTransform* xform);
+ BINARYNINJACOREAPI BNTransformParameterInfo* BNGetTransformParameterList(BNTransform* xform, size_t* count);
+ BINARYNINJACOREAPI void BNFreeTransformParameterList(BNTransformParameterInfo* params, size_t count);
+ BINARYNINJACOREAPI bool BNDecode(BNTransform* xform, BNDataBuffer* input, BNDataBuffer* output,
+ BNTransformParameter* params, size_t paramCount);
+ BINARYNINJACOREAPI bool BNEncode(BNTransform* xform, BNDataBuffer* input, BNDataBuffer* output,
+ BNTransformParameter* params, size_t paramCount);
+
+ // Architectures
+ BINARYNINJACOREAPI BNArchitecture* BNGetArchitectureByName(const char* name);
+ BINARYNINJACOREAPI BNArchitecture** BNGetArchitectureList(size_t* count);
+ BINARYNINJACOREAPI void BNFreeArchitectureList(BNArchitecture** archs);
+ BINARYNINJACOREAPI BNArchitecture* BNRegisterArchitecture(const char* name, BNCustomArchitecture* arch);
+
+ BINARYNINJACOREAPI char* BNGetArchitectureName(BNArchitecture* arch);
+ BINARYNINJACOREAPI BNEndianness BNGetArchitectureEndianness(BNArchitecture* arch);
+ BINARYNINJACOREAPI size_t BNGetArchitectureAddressSize(BNArchitecture* arch);
+ BINARYNINJACOREAPI size_t BNGetArchitectureDefaultIntegerSize(BNArchitecture* arch);
+ BINARYNINJACOREAPI bool BNGetInstructionInfo(BNArchitecture* arch, const uint8_t* data, uint64_t addr,
+ size_t maxLen, BNInstructionInfo* result);
+ BINARYNINJACOREAPI bool BNGetInstructionText(BNArchitecture* arch, const uint8_t* data, uint64_t addr,
+ size_t* len, BNInstructionTextToken** result, size_t* count);
+ BINARYNINJACOREAPI bool BNGetInstructionLowLevelIL(BNArchitecture* arch, const uint8_t* data, uint64_t addr,
+ size_t* len, BNLowLevelILFunction* il);
+ BINARYNINJACOREAPI void BNFreeInstructionText(BNInstructionTextToken* tokens, size_t count);
+ BINARYNINJACOREAPI char* BNGetArchitectureRegisterName(BNArchitecture* arch, uint32_t reg);
+ BINARYNINJACOREAPI char* BNGetArchitectureFlagName(BNArchitecture* arch, uint32_t flag);
+ BINARYNINJACOREAPI char* BNGetArchitectureFlagWriteTypeName(BNArchitecture* arch, uint32_t flags);
+ BINARYNINJACOREAPI uint32_t* BNGetFullWidthArchitectureRegisters(BNArchitecture* arch, size_t* count);
+ BINARYNINJACOREAPI uint32_t* BNGetAllArchitectureRegisters(BNArchitecture* arch, size_t* count);
+ BINARYNINJACOREAPI uint32_t* BNGetAllArchitectureFlags(BNArchitecture* arch, size_t* count);
+ BINARYNINJACOREAPI uint32_t* BNGetAllArchitectureFlagWriteTypes(BNArchitecture* arch, size_t* count);
+ BINARYNINJACOREAPI uint32_t* BNGetModifiedArchitectureRegistersOnWrite(BNArchitecture* arch, uint32_t reg, size_t* count);
+ BINARYNINJACOREAPI void BNFreeRegisterList(uint32_t* regs);
+ BINARYNINJACOREAPI BNRegisterInfo BNGetArchitectureRegisterInfo(BNArchitecture* arch, uint32_t reg);
+ BINARYNINJACOREAPI uint32_t BNGetArchitectureStackPointerRegister(BNArchitecture* arch);
+ BINARYNINJACOREAPI uint32_t BNGetArchitectureLinkRegister(BNArchitecture* arch);
+ BINARYNINJACOREAPI uint32_t BNGetArchitectureRegisterByName(BNArchitecture* arch, const char* name);
+
+ BINARYNINJACOREAPI bool BNAssemble(BNArchitecture* arch, const char* code, uint64_t addr, BNDataBuffer* result, char** errors);
+
+ BINARYNINJACOREAPI bool BNIsArchitectureNeverBranchPatchAvailable(BNArchitecture* arch, const uint8_t* data,
+ uint64_t addr, size_t len);
+ BINARYNINJACOREAPI bool BNIsArchitectureAlwaysBranchPatchAvailable(BNArchitecture* arch, const uint8_t* data,
+ uint64_t addr, size_t len);
+ BINARYNINJACOREAPI bool BNIsArchitectureInvertBranchPatchAvailable(BNArchitecture* arch, const uint8_t* data,
+ uint64_t addr, size_t len);
+ BINARYNINJACOREAPI bool BNIsArchitectureSkipAndReturnZeroPatchAvailable(BNArchitecture* arch, const uint8_t* data,
+ uint64_t addr, size_t len);
+ BINARYNINJACOREAPI bool BNIsArchitectureSkipAndReturnValuePatchAvailable(BNArchitecture* arch, const uint8_t* data,
+ uint64_t addr, size_t len);
+
+ BINARYNINJACOREAPI bool BNArchitectureConvertToNop(BNArchitecture* arch, uint8_t* data, uint64_t addr, size_t len);
+ BINARYNINJACOREAPI bool BNArchitectureAlwaysBranch(BNArchitecture* arch, uint8_t* data, uint64_t addr, size_t len);
+ BINARYNINJACOREAPI bool BNArchitectureInvertBranch(BNArchitecture* arch, uint8_t* data, uint64_t addr, size_t len);
+ BINARYNINJACOREAPI bool BNArchitectureSkipAndReturnValue(BNArchitecture* arch, uint8_t* data, uint64_t addr,
+ size_t len, uint64_t value);
+
+ BINARYNINJACOREAPI void BNRegisterArchitectureFunctionRecognizer(BNArchitecture* arch, BNFunctionRecognizer* rec);
+
+ BINARYNINJACOREAPI bool BNIsBinaryViewTypeArchitectureConstantDefined(BNArchitecture* arch, const char* type,
+ const char* name);
+ BINARYNINJACOREAPI uint64_t BNGetBinaryViewTypeArchitectureConstant(BNArchitecture* arch, const char* type,
+ const char* name, uint64_t defaultValue);
+ BINARYNINJACOREAPI void BNSetBinaryViewTypeArchitectureConstant(BNArchitecture* arch, const char* type,
+ const char* name, uint64_t value);
+
+ // Analysis
+ BINARYNINJACOREAPI void BNAddFunctionForAnalysis(BNBinaryView* view, BNPlatform* platform, uint64_t addr);
+ BINARYNINJACOREAPI void BNAddEntryPointForAnalysis(BNBinaryView* view, BNPlatform* platform, uint64_t addr);
+ BINARYNINJACOREAPI void BNRemoveAnalysisFunction(BNBinaryView* view, BNFunction* func);
+ BINARYNINJACOREAPI void BNCreateUserFunction(BNBinaryView* view, BNPlatform* platform, uint64_t addr);
+ BINARYNINJACOREAPI void BNUpdateAnalysis(BNBinaryView* view);
+ BINARYNINJACOREAPI void BNAbortAnalysis(BNBinaryView* view);
+
+ BINARYNINJACOREAPI BNFunction* BNNewFunctionReference(BNFunction* func);
+ BINARYNINJACOREAPI void BNFreeFunction(BNFunction* func);
+ BINARYNINJACOREAPI BNFunction** BNGetAnalysisFunctionList(BNBinaryView* view, size_t* count);
+ BINARYNINJACOREAPI void BNFreeFunctionList(BNFunction** funcs, size_t count);
+ BINARYNINJACOREAPI bool BNHasFunctions(BNBinaryView* view);
+ BINARYNINJACOREAPI BNFunction* BNGetAnalysisFunction(BNBinaryView* view, BNPlatform* platform, uint64_t addr);
+ BINARYNINJACOREAPI BNFunction* BNGetRecentAnalysisFunctionForAddress(BNBinaryView* view, uint64_t addr);
+ BINARYNINJACOREAPI BNFunction** BNGetAnalysisFunctionsForAddress(BNBinaryView* view, uint64_t addr, size_t* count);
+ BINARYNINJACOREAPI BNFunction* BNGetAnalysisEntryPoint(BNBinaryView* view);
+
+ BINARYNINJACOREAPI BNBinaryView* BNGetFunctionData(BNFunction* func);
+ BINARYNINJACOREAPI BNArchitecture* BNGetFunctionArchitecture(BNFunction* func);
+ BINARYNINJACOREAPI BNPlatform* BNGetFunctionPlatform(BNFunction* func);
+ BINARYNINJACOREAPI uint64_t BNGetFunctionStart(BNFunction* func);
+ BINARYNINJACOREAPI BNSymbol* BNGetFunctionSymbol(BNFunction* func);
+ BINARYNINJACOREAPI bool BNWasFunctionAutomaticallyDiscovered(BNFunction* func);
+ BINARYNINJACOREAPI bool BNCanFunctionReturn(BNFunction* func);
+
+ BINARYNINJACOREAPI char* BNGetCommentForAddress(BNFunction* func, uint64_t addr);
+ BINARYNINJACOREAPI uint64_t* BNGetCommentedAddresses(BNFunction* func, size_t* count);
+ BINARYNINJACOREAPI void BNFreeAddressList(uint64_t* addrs);
+ BINARYNINJACOREAPI void BNSetCommentForAddress(BNFunction* func, uint64_t addr, const char* comment);
+
+ BINARYNINJACOREAPI BNBasicBlock* BNNewBasicBlockReference(BNBasicBlock* block);
+ BINARYNINJACOREAPI void BNFreeBasicBlock(BNBasicBlock* block);
+ BINARYNINJACOREAPI BNBasicBlock** BNGetFunctionBasicBlockList(BNFunction* func, size_t* count);
+ BINARYNINJACOREAPI void BNFreeBasicBlockList(BNBasicBlock** blocks, size_t count);
+ BINARYNINJACOREAPI BNBasicBlock* BNGetRecentBasicBlockForAddress(BNBinaryView* view, uint64_t addr);
+ BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlocksForAddress(BNBinaryView* view, uint64_t addr, size_t* count);
+
+ BINARYNINJACOREAPI BNLowLevelILFunction* BNGetFunctionLowLevelIL(BNFunction* func);
+ BINARYNINJACOREAPI BNBasicBlock** BNGetFunctionLowLevelILBasicBlockList(BNFunction* func, size_t* count);
+ BINARYNINJACOREAPI size_t BNGetLowLevelILForInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI size_t* BNGetLowLevelILExitsForInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr,
+ size_t* count);
+ BINARYNINJACOREAPI void BNFreeLowLevelILInstructionList(size_t* list);
+ BINARYNINJACOREAPI BNRegisterValue BNGetRegisterValueAtInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr,
+ uint32_t reg);
+ BINARYNINJACOREAPI BNRegisterValue BNGetRegisterValueAfterInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr,
+ uint32_t reg);
+ BINARYNINJACOREAPI BNRegisterValue BNGetRegisterValueAtLowLevelILInstruction(BNFunction* func, size_t i, uint32_t reg);
+ BINARYNINJACOREAPI BNRegisterValue BNGetRegisterValueAfterLowLevelILInstruction(BNFunction* func, size_t i, uint32_t reg);
+ BINARYNINJACOREAPI uint32_t* BNGetRegistersReadByInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr,
+ size_t* count);
+ BINARYNINJACOREAPI uint32_t* BNGetRegistersWrittenByInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr,
+ size_t* count);
+ BINARYNINJACOREAPI BNStackVariableReference* BNGetStackVariablesReferencedByInstruction(BNFunction* func, BNArchitecture* arch,
+ uint64_t addr, size_t* count);
+ BINARYNINJACOREAPI void BNFreeStackVariableReferenceList(BNStackVariableReference* refs, size_t count);
+
+ BINARYNINJACOREAPI BNType* BNGetFunctionType(BNFunction* func);
+ BINARYNINJACOREAPI void BNApplyImportedTypes(BNFunction* func, BNSymbol* sym);
+ BINARYNINJACOREAPI void BNApplyAutoDiscoveredFunctionType(BNFunction* func, BNType* type);
+ BINARYNINJACOREAPI bool BNFunctionHasExplicitlyDefinedType(BNFunction* func);
+
+ BINARYNINJACOREAPI BNFunction* BNGetBasicBlockFunction(BNBasicBlock* block);
+ BINARYNINJACOREAPI BNArchitecture* BNGetBasicBlockArchitecture(BNBasicBlock* block);
+ BINARYNINJACOREAPI uint64_t BNGetBasicBlockStart(BNBasicBlock* block);
+ BINARYNINJACOREAPI uint64_t BNGetBasicBlockEnd(BNBasicBlock* block);
+ BINARYNINJACOREAPI uint64_t BNGetBasicBlockLength(BNBasicBlock* block);
+ BINARYNINJACOREAPI BNBasicBlockEdge* BNGetBasicBlockOutgoingEdges(BNBasicBlock* block, size_t* count);
+ BINARYNINJACOREAPI void BNFreeBasicBlockOutgoingEdgeList(BNBasicBlockEdge* edges);
+ BINARYNINJACOREAPI bool BNBasicBlockHasUndeterminedOutgoingEdges(BNBasicBlock* block);
+
+ BINARYNINJACOREAPI void BNMarkFunctionAsRecentlyUsed(BNFunction* func);
+ BINARYNINJACOREAPI void BNMarkBasicBlockAsRecentlyUsed(BNBasicBlock* block);
+
+ BINARYNINJACOREAPI BNReferenceSource* BNGetCodeReferences(BNBinaryView* view, uint64_t addr, size_t* count);
+ BINARYNINJACOREAPI BNReferenceSource* BNGetCodeReferencesInRange(BNBinaryView* view, uint64_t addr,
+ uint64_t len, size_t* count);
+ BINARYNINJACOREAPI void BNFreeCodeReferences(BNReferenceSource* refs, size_t count);
+
+ BINARYNINJACOREAPI void BNRegisterGlobalFunctionRecognizer(BNFunctionRecognizer* rec);
+
+ BINARYNINJACOREAPI BNStringReference* BNGetStrings(BNBinaryView* view, size_t* count);
+ BINARYNINJACOREAPI BNStringReference* BNGetStringsInRange(BNBinaryView* view, uint64_t start,
+ uint64_t len, size_t* count);
+ BINARYNINJACOREAPI void BNFreeStringList(BNStringReference* strings);
+
+ BINARYNINJACOREAPI BNStackVariable* BNGetStackLayout(BNFunction* func, size_t* count);
+ BINARYNINJACOREAPI void BNFreeStackLayout(BNStackVariable* vars, size_t count);
+ BINARYNINJACOREAPI void BNCreateAutoStackVariable(BNFunction* func, int64_t offset, BNType* type, const char* name);
+ BINARYNINJACOREAPI void BNCreateUserStackVariable(BNFunction* func, int64_t offset, BNType* type, const char* name);
+ BINARYNINJACOREAPI void BNDeleteAutoStackVariable(BNFunction* func, int64_t offset);
+ BINARYNINJACOREAPI void BNDeleteUserStackVariable(BNFunction* func, int64_t offset);
+ BINARYNINJACOREAPI bool BNGetStackVariableAtFrameOffset(BNFunction* func, int64_t offset, BNStackVariable* var);
+ BINARYNINJACOREAPI void BNFreeStackVariable(BNStackVariable* var);
+
+ // Function graph
+ BINARYNINJACOREAPI BNFunctionGraph* BNCreateFunctionGraph(BNFunction* func);
+ BINARYNINJACOREAPI BNFunctionGraph* BNNewFunctionGraphReference(BNFunctionGraph* graph);
+ BINARYNINJACOREAPI void BNFreeFunctionGraph(BNFunctionGraph* graph);
+ BINARYNINJACOREAPI BNFunction* BNGetFunctionForFunctionGraph(BNFunctionGraph* graph);
+
+ BINARYNINJACOREAPI int BNGetHorizontalFunctionGraphBlockMargin(BNFunctionGraph* graph);
+ BINARYNINJACOREAPI int BNGetVerticalFunctionGraphBlockMargin(BNFunctionGraph* graph);
+ BINARYNINJACOREAPI void BNSetFunctionGraphBlockMargins(BNFunctionGraph* graph, int horiz, int vert);
+
+ BINARYNINJACOREAPI size_t BNGetFunctionGraphMaximumSymbolWidth(BNFunctionGraph* graph);
+ BINARYNINJACOREAPI void BNSetFunctionGraphMaximumSymbolWidth(BNFunctionGraph* graph, size_t width);
+
+ BINARYNINJACOREAPI void BNStartFunctionGraphLayout(BNFunctionGraph* graph, BNFunctionGraphType type);
+ BINARYNINJACOREAPI bool BNIsFunctionGraphLayoutComplete(BNFunctionGraph* graph);
+ BINARYNINJACOREAPI void BNSetFunctionGraphCompleteCallback(BNFunctionGraph* graph, void* ctxt, void (*func)(void* ctxt));
+ BINARYNINJACOREAPI void BNAbortFunctionGraph(BNFunctionGraph* graph);
+ BINARYNINJACOREAPI BNFunctionGraphType BNGetFunctionGraphType(BNFunctionGraph* graph);
+
+ BINARYNINJACOREAPI BNFunctionGraphBlock** BNGetFunctionGraphBlocks(BNFunctionGraph* graph, size_t* count);
+ BINARYNINJACOREAPI BNFunctionGraphBlock** BNGetFunctionGraphBlocksInRegion(
+ BNFunctionGraph* graph, int left, int top, int right, int bottom, size_t* count);
+ BINARYNINJACOREAPI void BNFreeFunctionGraphBlockList(BNFunctionGraphBlock** blocks, size_t count);
+
+ BINARYNINJACOREAPI int BNGetFunctionGraphWidth(BNFunctionGraph* graph);
+ BINARYNINJACOREAPI int BNGetFunctionGraphHeight(BNFunctionGraph* graph);
+
+ BINARYNINJACOREAPI bool BNIsFunctionGraphOptionSet(BNFunctionGraph* graph, BNFunctionGraphOption option);
+ BINARYNINJACOREAPI void BNSetFunctionGraphOption(BNFunctionGraph* graph, BNFunctionGraphOption option, bool state);
+
+ BINARYNINJACOREAPI BNFunctionGraphBlock* BNNewFunctionGraphBlockReference(BNFunctionGraphBlock* block);
+ BINARYNINJACOREAPI void BNFreeFunctionGraphBlock(BNFunctionGraphBlock* block);
+
+ BINARYNINJACOREAPI BNArchitecture* BNGetFunctionGraphBlockArchitecture(BNFunctionGraphBlock* block);
+ BINARYNINJACOREAPI uint64_t BNGetFunctionGraphBlockStart(BNFunctionGraphBlock* block);
+ BINARYNINJACOREAPI uint64_t BNGetFunctionGraphBlockEnd(BNFunctionGraphBlock* block);
+ BINARYNINJACOREAPI int BNGetFunctionGraphBlockX(BNFunctionGraphBlock* block);
+ BINARYNINJACOREAPI int BNGetFunctionGraphBlockY(BNFunctionGraphBlock* block);
+ BINARYNINJACOREAPI int BNGetFunctionGraphBlockWidth(BNFunctionGraphBlock* block);
+ BINARYNINJACOREAPI int BNGetFunctionGraphBlockHeight(BNFunctionGraphBlock* block);
+
+ BINARYNINJACOREAPI BNFunctionGraphTextLine* BNGetFunctionGraphBlockLines(BNFunctionGraphBlock* block, size_t* count);
+ BINARYNINJACOREAPI void BNFreeFunctionGraphBlockLines(BNFunctionGraphTextLine* lines, size_t count);
+ BINARYNINJACOREAPI BNFunctionGraphEdge* BNGetFunctionGraphBlockOutgoingEdges(BNFunctionGraphBlock* block, size_t* count);
+ BINARYNINJACOREAPI void BNFreeFunctionGraphBlockOutgoingEdgeList(BNFunctionGraphEdge* edges, size_t count);
+
+ // Symbols
+ BINARYNINJACOREAPI BNSymbol* BNCreateSymbol(BNSymbolType type, const char* shortName, const char* fullName,
+ const char* rawName, uint64_t addr);
+ BINARYNINJACOREAPI BNSymbol* BNNewSymbolReference(BNSymbol* sym);
+ BINARYNINJACOREAPI void BNFreeSymbol(BNSymbol* sym);
+ BINARYNINJACOREAPI BNSymbolType BNGetSymbolType(BNSymbol* sym);
+ BINARYNINJACOREAPI char* BNGetSymbolShortName(BNSymbol* sym);
+ BINARYNINJACOREAPI char* BNGetSymbolFullName(BNSymbol* sym);
+ BINARYNINJACOREAPI char* BNGetSymbolRawName(BNSymbol* sym);
+ BINARYNINJACOREAPI uint64_t BNGetSymbolAddress(BNSymbol* sym);
+ BINARYNINJACOREAPI bool BNIsSymbolAutoDefined(BNSymbol* sym);
+ BINARYNINJACOREAPI void BNSetSymbolAutoDefined(BNSymbol* sym, bool val);
+
+ BINARYNINJACOREAPI BNSymbol* BNGetSymbolByAddress(BNBinaryView* view, uint64_t addr);
+ BINARYNINJACOREAPI BNSymbol* BNGetSymbolByRawName(BNBinaryView* view, const char* name);
+ BINARYNINJACOREAPI BNSymbol** BNGetSymbolsByName(BNBinaryView* view, const char* name, size_t* count);
+ BINARYNINJACOREAPI BNSymbol** BNGetSymbols(BNBinaryView* view, size_t* count);
+ BINARYNINJACOREAPI BNSymbol** BNGetSymbolsInRange(BNBinaryView* view, uint64_t start, uint64_t len, size_t* count);
+ BINARYNINJACOREAPI BNSymbol** BNGetSymbolsOfType(BNBinaryView* view, BNSymbolType type, size_t* count);
+ BINARYNINJACOREAPI BNSymbol** BNGetSymbolsOfTypeInRange(BNBinaryView* view, BNSymbolType type,
+ uint64_t start, uint64_t len, size_t* count);
+ BINARYNINJACOREAPI void BNFreeSymbolList(BNSymbol** syms, size_t count);
+
+ BINARYNINJACOREAPI void BNDefineAutoSymbol(BNBinaryView* view, BNSymbol* sym);
+ BINARYNINJACOREAPI void BNUndefineAutoSymbol(BNBinaryView* view, BNSymbol* sym);
+ BINARYNINJACOREAPI void BNDefineUserSymbol(BNBinaryView* view, BNSymbol* sym);
+ BINARYNINJACOREAPI void BNUndefineUserSymbol(BNBinaryView* view, BNSymbol* sym);
+ BINARYNINJACOREAPI void BNDefineImportedFunction(BNBinaryView* view, BNSymbol* importAddressSym, BNFunction* func);
+
+ BINARYNINJACOREAPI BNSymbol* BNImportedFunctionFromImportAddressSymbol(BNSymbol* sym, uint64_t addr);
+
+ // Low-level IL
+ BINARYNINJACOREAPI BNLowLevelILFunction* BNCreateLowLevelILFunction(void);
+ BINARYNINJACOREAPI BNLowLevelILFunction* BNNewLowLevelILFunctionReference(BNLowLevelILFunction* func);
+ BINARYNINJACOREAPI void BNFreeLowLevelILFunction(BNLowLevelILFunction* func);
+ BINARYNINJACOREAPI uint64_t BNLowLevelILGetCurrentAddress(BNLowLevelILFunction* func);
+ BINARYNINJACOREAPI void BNLowLevelILSetCurrentAddress(BNLowLevelILFunction* func, uint64_t addr);
+ BINARYNINJACOREAPI size_t BNLowLevelILAddExpr(BNLowLevelILFunction* func, BNLowLevelILOperation operation, size_t size,
+ uint32_t flags, uint64_t a, uint64_t b, uint64_t c, uint64_t d);
+ BINARYNINJACOREAPI void BNLowLevelILSetExprSourceOperand(BNLowLevelILFunction* func, size_t expr, uint32_t operand);
+ BINARYNINJACOREAPI size_t BNLowLevelILAddInstruction(BNLowLevelILFunction* func, size_t expr);
+ BINARYNINJACOREAPI size_t BNLowLevelILGoto(BNLowLevelILFunction* func, BNLowLevelILLabel* label);
+ BINARYNINJACOREAPI size_t BNLowLevelILIf(BNLowLevelILFunction* func, uint64_t op, BNLowLevelILLabel* t, BNLowLevelILLabel* f);
+ BINARYNINJACOREAPI void BNLowLevelILInitLabel(BNLowLevelILLabel* label);
+ BINARYNINJACOREAPI void BNLowLevelILMarkLabel(BNLowLevelILFunction* func, BNLowLevelILLabel* label);
+ BINARYNINJACOREAPI void BNFinalizeLowLevelILFunction(BNLowLevelILFunction* func);
+
+ BINARYNINJACOREAPI BNLowLevelILInstruction BNGetLowLevelILByIndex(BNLowLevelILFunction* func, size_t i);
+ BINARYNINJACOREAPI size_t BNGetLowLevelILIndexForInstruction(BNLowLevelILFunction* func, size_t i);
+ BINARYNINJACOREAPI size_t BNGetLowLevelILInstructionCount(BNLowLevelILFunction* func);
+
+ BINARYNINJACOREAPI void BNAddLowLevelILLabelForAddress(BNLowLevelILFunction* func, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI BNLowLevelILLabel* BNGetLowLevelILLabelForAddress(BNLowLevelILFunction* func,
+ BNArchitecture* arch, uint64_t addr);
+
+ BINARYNINJACOREAPI bool BNGetLowLevelILExprText(BNLowLevelILFunction* func, BNArchitecture* arch, size_t i,
+ BNInstructionTextToken** tokens, size_t* count);
+ BINARYNINJACOREAPI bool BNGetLowLevelILInstructionText(BNLowLevelILFunction* func, BNArchitecture* arch, size_t i,
+ BNInstructionTextToken** tokens, size_t* count);
+
+ // Types
+ BINARYNINJACOREAPI BNType* BNCreateVoidType(void);
+ BINARYNINJACOREAPI BNType* BNCreateBoolType(void);
+ BINARYNINJACOREAPI BNType* BNCreateIntegerType(size_t width, bool sign);
+ BINARYNINJACOREAPI BNType* BNCreateFloatType(size_t width);
+ BINARYNINJACOREAPI BNType* BNCreateStructureType(BNStructure* s);
+ BINARYNINJACOREAPI BNType* BNCreateEnumerationType(BNArchitecture* arch, BNEnumeration* e, size_t width);
+ BINARYNINJACOREAPI BNType* BNCreatePointerType(BNArchitecture* arch, BNType* type, bool cnst);
+ BINARYNINJACOREAPI BNType* BNCreateArrayType(BNType* type, uint64_t elem);
+ BINARYNINJACOREAPI BNType* BNCreateFunctionType(BNType* returnValue, BNCallingConvention* callingConvention,
+ BNNameAndType* params, size_t paramCount, bool varArg);
+ BINARYNINJACOREAPI BNType* BNNewTypeReference(BNType* type);
+ BINARYNINJACOREAPI BNType* BNDuplicateType(BNType* type);
+ BINARYNINJACOREAPI void BNFreeType(BNType* type);
+
+ BINARYNINJACOREAPI BNTypeClass BNGetTypeClass(BNType* type);
+ BINARYNINJACOREAPI uint64_t BNGetTypeWidth(BNType* type);
+ BINARYNINJACOREAPI size_t BNGetTypeAlignment(BNType* type);
+ BINARYNINJACOREAPI bool BNIsTypeSigned(BNType* type);
+ BINARYNINJACOREAPI bool BNIsTypeConst(BNType* type);
+ BINARYNINJACOREAPI bool BNIsTypeFloatingPoint(BNType* type);
+ BINARYNINJACOREAPI BNType* BNGetChildType(BNType* type);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetTypeCallingConvention(BNType* type);
+ BINARYNINJACOREAPI BNNameAndType* BNGetTypeParameters(BNType* type, size_t* count);
+ BINARYNINJACOREAPI void BNFreeTypeParameterList(BNNameAndType* types, size_t count);
+ BINARYNINJACOREAPI bool BNTypeHasVariableArguments(BNType* type);
+ BINARYNINJACOREAPI bool BNFunctionTypeCanReturn(BNType* type);
+ BINARYNINJACOREAPI BNStructure* BNGetTypeStructure(BNType* type);
+ BINARYNINJACOREAPI BNEnumeration* BNGetTypeEnumeration(BNType* type);
+ BINARYNINJACOREAPI uint64_t BNGetTypeElementCount(BNType* type);
+
+ BINARYNINJACOREAPI char* BNGetTypeString(BNType* type);
+ BINARYNINJACOREAPI char* BNGetTypeStringBeforeName(BNType* type);
+ BINARYNINJACOREAPI char* BNGetTypeStringAfterName(BNType* type);
+
+ BINARYNINJACOREAPI BNStructure* BNCreateStructure(void);
+ BINARYNINJACOREAPI BNStructure* BNNewStructureReference(BNStructure* s);
+ BINARYNINJACOREAPI void BNFreeStructure(BNStructure* s);
+
+ BINARYNINJACOREAPI char* BNGetStructureName(BNStructure* s);
+ BINARYNINJACOREAPI void BNSetStructureName(BNStructure* s, const char* name);
+ BINARYNINJACOREAPI BNStructureMember* BNGetStructureMembers(BNStructure* s, size_t* count);
+ BINARYNINJACOREAPI void BNFreeStructureMemberList(BNStructureMember* members, size_t count);
+ BINARYNINJACOREAPI uint64_t BNGetStructureWidth(BNStructure* s);
+ BINARYNINJACOREAPI size_t BNGetStructureAlignment(BNStructure* s);
+ BINARYNINJACOREAPI bool BNIsStructurePacked(BNStructure* s);
+ BINARYNINJACOREAPI void BNSetStructurePacked(BNStructure* s, bool packed);
+ BINARYNINJACOREAPI bool BNIsStructureUnion(BNStructure* s);
+ BINARYNINJACOREAPI void BNSetStructureUnion(BNStructure* s, bool u);
+
+ BINARYNINJACOREAPI void BNAddStructureMember(BNStructure* s, BNType* type, const char* name);
+ BINARYNINJACOREAPI void BNAddStructureMemberAtOffset(BNStructure* s, BNType* type, const char* name, uint64_t offset);
+ BINARYNINJACOREAPI void BNRemoveStructureMember(BNStructure* s, size_t idx);
+
+ BINARYNINJACOREAPI BNEnumeration* BNCreateEnumeration(void);
+ BINARYNINJACOREAPI BNEnumeration* BNNewEnumerationReference(BNEnumeration* e);
+ BINARYNINJACOREAPI void BNFreeEnumeration(BNEnumeration* e);
+
+ BINARYNINJACOREAPI char* BNGetEnumerationName(BNEnumeration* e);
+ BINARYNINJACOREAPI void BNSetEnumerationName(BNEnumeration* e, const char* name);
+ BINARYNINJACOREAPI BNEnumerationMember* BNGetEnumerationMembers(BNEnumeration* e, size_t* count);
+ BINARYNINJACOREAPI void BNFreeEnumerationMemberList(BNEnumerationMember* members, size_t count);
+
+ BINARYNINJACOREAPI void BNAddEnumerationMember(BNEnumeration* e, const char* name);
+ BINARYNINJACOREAPI void BNAddEnumerationMemberWithValue(BNEnumeration* e, const char* name, uint64_t value);
+
+ // Source code processing
+ BINARYNINJACOREAPI bool BNPreprocessSource(const char* source, const char* fileName, char** output, char** errors,
+ const char** includeDirs, size_t includeDirCount);
+ BINARYNINJACOREAPI bool BNParseTypesFromSource(BNArchitecture* arch, const char* source, const char* fileName,
+ BNTypeParserResult* result, char** errors,
+ const char** includeDirs, size_t includeDirCount);
+ BINARYNINJACOREAPI bool BNParseTypesFromSourceFile(BNArchitecture* arch, const char* fileName,
+ BNTypeParserResult* result, char** errors,
+ const char** includeDirs, size_t includeDirCount);
+ BINARYNINJACOREAPI void BNFreeTypeParserResult(BNTypeParserResult* result);
+
+ // Updates
+ BINARYNINJACOREAPI BNUpdateChannel* BNGetUpdateChannels(size_t* count, char** errors);
+ BINARYNINJACOREAPI void BNFreeUpdateChannelList(BNUpdateChannel* list, size_t count);
+ BINARYNINJACOREAPI BNUpdateVersion* BNGetUpdateChannelVersions(const char* channel, size_t* count, char** errors);
+ BINARYNINJACOREAPI void BNFreeUpdateChannelVersionList(BNUpdateVersion* list, size_t count);
+
+ BINARYNINJACOREAPI bool BNAreUpdatesAvailable(const char* channel, char** errors);
+
+ BINARYNINJACOREAPI BNUpdateResult BNUpdateToVersion(const char* channel, const char* version, char** errors,
+ bool (*progress)(void* ctxt, uint64_t progress, uint64_t total),
+ void* context);
+ BINARYNINJACOREAPI BNUpdateResult BNUpdateToLatestVersion(const char* channel, char** errors,
+ bool (*progress)(void* ctxt, uint64_t progress, uint64_t total),
+ void* context);
+
+ BINARYNINJACOREAPI bool BNAreAutoUpdatesEnabled(void);
+ BINARYNINJACOREAPI void BNSetAutoUpdatesEnabled(bool enabled);
+ BINARYNINJACOREAPI uint64_t BNGetTimeSinceLastUpdateCheck(void);
+ BINARYNINJACOREAPI void BNUpdatesChecked(void);
+
+ BINARYNINJACOREAPI char* BNGetActiveUpdateChannel(void);
+ BINARYNINJACOREAPI void BNSetActiveUpdateChannel(const char* channel);
+
+ BINARYNINJACOREAPI bool BNIsUpdateInstallationPending(void);
+ BINARYNINJACOREAPI void BNInstallPendingUpdate(char** errors);
+
+ // Plugin commands
+ BINARYNINJACOREAPI void BNRegisterPluginCommand(const char* name, const char* description,
+ void (*action)(void* ctxt, BNBinaryView* view),
+ bool (*isValid)(void* ctxt, BNBinaryView* view), void* context);
+ BINARYNINJACOREAPI void BNRegisterPluginCommandForAddress(const char* name, const char* description,
+ void (*action)(void* ctxt, BNBinaryView* view, uint64_t addr),
+ bool (*isValid)(void* ctxt, BNBinaryView* view, uint64_t addr),
+ void* context);
+ BINARYNINJACOREAPI void BNRegisterPluginCommandForRange(const char* name, const char* description,
+ void (*action)(void* ctxt, BNBinaryView* view, uint64_t addr, uint64_t len),
+ bool (*isValid)(void* ctxt, BNBinaryView* view, uint64_t addr, uint64_t len),
+ void* context);
+ BINARYNINJACOREAPI void BNRegisterPluginCommandForFunction(const char* name, const char* description,
+ void (*action)(void* ctxt, BNBinaryView* view, BNFunction* func),
+ bool (*isValid)(void* ctxt, BNBinaryView* view, BNFunction* func),
+ void* context);
+
+ BINARYNINJACOREAPI BNPluginCommand* BNGetAllPluginCommands(size_t* count);
+ BINARYNINJACOREAPI BNPluginCommand* BNGetValidPluginCommands(BNBinaryView* view, size_t* count);
+ BINARYNINJACOREAPI BNPluginCommand* BNGetValidPluginCommandsForAddress(BNBinaryView* view, uint64_t addr,
+ size_t* count);
+ BINARYNINJACOREAPI BNPluginCommand* BNGetValidPluginCommandsForRange(BNBinaryView* view, uint64_t addr,
+ uint64_t len, size_t* count);
+ BINARYNINJACOREAPI BNPluginCommand* BNGetValidPluginCommandsForFunction(BNBinaryView* view, BNFunction* func,
+ size_t* count);
+ BINARYNINJACOREAPI void BNFreePluginCommandList(BNPluginCommand* commands);
+
+ // Calling conventions
+ BINARYNINJACOREAPI BNCallingConvention* BNCreateCallingConvention(BNArchitecture* arch, const char* name,
+ BNCustomCallingConvention* cc);
+ BINARYNINJACOREAPI void BNRegisterCallingConvention(BNArchitecture* arch, BNCallingConvention* cc);
+ BINARYNINJACOREAPI BNCallingConvention* BNNewCallingConventionReference(BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNFreeCallingConvention(BNCallingConvention* cc);
+
+ BINARYNINJACOREAPI BNCallingConvention** BNGetArchitectureCallingConventions(BNArchitecture* arch, size_t* count);
+ BINARYNINJACOREAPI void BNFreeCallingConventionList(BNCallingConvention** list, size_t count);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetArchitectureCallingConventionByName(BNArchitecture* arch,
+ const char* name);
+
+ BINARYNINJACOREAPI BNArchitecture* BNGetCallingConventionArchitecture(BNCallingConvention* cc);
+ BINARYNINJACOREAPI char* BNGetCallingConventionName(BNCallingConvention* cc);
+ BINARYNINJACOREAPI uint32_t* BNGetCallerSavedRegisters(BNCallingConvention* cc, size_t* count);
+
+ BINARYNINJACOREAPI uint32_t* BNGetIntegerArgumentRegisters(BNCallingConvention* cc, size_t* count);
+ BINARYNINJACOREAPI uint32_t* BNGetFloatArgumentRegisters(BNCallingConvention* cc, size_t* count);
+ BINARYNINJACOREAPI bool BNAreArgumentRegistersSharedIndex(BNCallingConvention* cc);
+ BINARYNINJACOREAPI bool BNIsStackReservedForArgumentRegisters(BNCallingConvention* cc);
+
+ BINARYNINJACOREAPI uint32_t BNGetIntegerReturnValueRegister(BNCallingConvention* cc);
+ BINARYNINJACOREAPI uint32_t BNGetHighIntegerReturnValueRegister(BNCallingConvention* cc);
+ BINARYNINJACOREAPI uint32_t BNGetFloatReturnValueRegister(BNCallingConvention* cc);
+
+ BINARYNINJACOREAPI BNCallingConvention* BNGetArchitectureDefaultCallingConvention(BNArchitecture* arch);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetArchitectureCdeclCallingConvention(BNArchitecture* arch);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetArchitectureStdcallCallingConvention(BNArchitecture* arch);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetArchitectureFastcallCallingConvention(BNArchitecture* arch);
+ BINARYNINJACOREAPI void BNSetArchitectureDefaultCallingConvention(BNArchitecture* arch, BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNSetArchitectureCdeclCallingConvention(BNArchitecture* arch, BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNSetArchitectureStdcallCallingConvention(BNArchitecture* arch, BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNSetArchitectureFastcallCallingConvention(BNArchitecture* arch, BNCallingConvention* cc);
+
+ // Platforms
+ BINARYNINJACOREAPI BNPlatform* BNCreatePlatform(BNArchitecture* arch, const char* name);
+ BINARYNINJACOREAPI void BNRegisterPlatform(const char* os, BNPlatform* platform);
+ BINARYNINJACOREAPI BNPlatform* BNNewPlatformReference(BNPlatform* platform);
+ BINARYNINJACOREAPI void BNFreePlatform(BNPlatform* platform);
+
+ BINARYNINJACOREAPI char* BNGetPlatformName(BNPlatform* platform);
+ BINARYNINJACOREAPI BNArchitecture* BNGetPlatformArchitecture(BNPlatform* platform);
+
+ BINARYNINJACOREAPI BNPlatform* BNGetPlatformByName(const char* name);
+ BINARYNINJACOREAPI BNPlatform** BNGetPlatformList(size_t* count);
+ BINARYNINJACOREAPI BNPlatform** BNGetPlatformListByArchitecture(BNArchitecture* arch, size_t* count);
+ BINARYNINJACOREAPI BNPlatform** BNGetPlatformListByOS(const char* os, size_t* count);
+ BINARYNINJACOREAPI BNPlatform** BNGetPlatformListByOSAndArchitecture(const char* os, BNArchitecture* arch,
+ size_t* count);
+ BINARYNINJACOREAPI void BNFreePlatformList(BNPlatform** platform, size_t count);
+ BINARYNINJACOREAPI char** BNGetPlatformOSList(size_t* count);
+ BINARYNINJACOREAPI void BNFreePlatformOSList(char** list, size_t count);
+
+ BINARYNINJACOREAPI BNCallingConvention* BNGetPlatformDefaultCallingConvention(BNPlatform* platform);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetPlatformCdeclCallingConvention(BNPlatform* platform);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetPlatformStdcallCallingConvention(BNPlatform* platform);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetPlatformFastcallCallingConvention(BNPlatform* platform);
+ BINARYNINJACOREAPI BNCallingConvention** BNGetPlatformCallingConventions(BNPlatform* platform, size_t* count);
+ BINARYNINJACOREAPI BNCallingConvention* BNGetPlatformSystemCallConvention(BNPlatform* platform);
+
+ BINARYNINJACOREAPI void BNRegisterPlatformCallingConvention(BNPlatform* platform, BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNRegisterPlatformDefaultCallingConvention(BNPlatform* platform, BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNRegisterPlatformCdeclCallingConvention(BNPlatform* platform, BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNRegisterPlatformStdcallCallingConvention(BNPlatform* platform, BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNRegisterPlatformFastcallCallingConvention(BNPlatform* platform, BNCallingConvention* cc);
+ BINARYNINJACOREAPI void BNSetPlatformSystemCallConvention(BNPlatform* platform, BNCallingConvention* cc);
+
+ BINARYNINJACOREAPI BNPlatform* BNGetArchitectureStandalonePlatform(BNArchitecture* arch);
+
+ BINARYNINJACOREAPI BNPlatform* BNGetRelatedPlatform(BNPlatform* platform, BNArchitecture* arch);
+ BINARYNINJACOREAPI void BNAddRelatedPlatform(BNPlatform* platform, BNArchitecture* arch, BNPlatform* related);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif