IDA SDK
|
Contains definition of the interface to IDP modules.
The interface consists of 2 structures:
These structures contain information about processor features, function pointers, etc.
Classes | |
struct | bytes_t |
Structure used to describe byte streams (for "ret" instruction and empirics) More... | |
struct | instruc_t |
Internal representation of processor instructions. More... | |
struct | asm_t |
Describes the target assembler. More... | |
struct | processor_t |
Describes a processor module (IDP). More... | |
struct | reg_info_t |
Get register number and size from register name. More... | |
Functions | |
idaman bool ida_export | has_insn_feature (int icode, int bit) |
Does the specified instruction have the specified feature? | |
idaman bool ida_export | is_call_insn (const insn_t &insn) |
Is the instruction a "call"? | |
idaman bool ida_export | is_ret_insn (const insn_t &insn, bool strict=true) |
Is the instruction a "return"? | |
idaman bool ida_export | is_indirect_jump_insn (const insn_t &insn) |
Is the instruction an indirect jump? | |
idaman bool ida_export | is_basic_block_end (const insn_t &insn, bool call_insn_stops_block) |
Is the instruction the end of a basic block? | |
idaman bool ida_export | hook_to_notification_point (hook_type_t hook_type, hook_cb_t *cb, void *user_data=NULL) |
Register a callback for a class of events in IDA. | |
idaman int ida_export | unhook_from_notification_point (hook_type_t hook_type, hook_cb_t *cb, void *user_data=NULL) |
Unregister a callback (also see hook_to_notification_point()). More... | |
idaman ssize_t ida_export | invoke_callbacks (hook_type_t hook_type, int code, va_list va) |
Generate event notification. More... | |
CASSERT (sizeof(processor_t)==104) | |
idaman int ida_export | str2reg (const char *p) |
Get any reg number (-1 on error) | |
idaman int ida_export | is_align_insn (ea_t ea) |
If the instruction at 'ea' looks like an alignment instruction, return its length in bytes. More... | |
idaman ssize_t ida_export | get_reg_name (qstring *buf, int reg, size_t width, int reghi=-1) |
Get text representation of a register. More... | |
const char * | get_reg_info (const char *regname, bitrange_t *bitrange) |
Get register information - useful for registers like al, ah, dil, etc. More... | |
idaman bool ida_export | parse_reg_name (reg_info_t *ri, const char *regname) |
Get register info by name. More... | |
size_t | sizeof_ldbl (void) |
Get size of long double. | |
idaman bool ida_export | set_processor_type (const char *procname, setproc_level_t level) |
Set target processor type. More... | |
idaman char *ida_export | get_idp_name (char *buf, size_t bufsize) |
Get name of the current processor module. More... | |
idaman bool ida_export | set_target_assembler (int asmnum) |
Set target assembler. More... | |
bool | delay_slot_insn (ea_t *ea, bool *bexec, bool *fexec) |
Helper function to get the delay slot instruction. | |
Namespaces | |
idb_event | |
IDB event group. | |
Macros | |
#define | IDP_INTERFACE_VERSION 700 |
The interface version number. More... | |
#define | CF_STOP 0x00001 |
Instruction doesn't pass execution to the. More... | |
#define | CF_CALL 0x00002 |
CALL instruction (should make a procedure here) | |
#define | CF_CHG1 0x00004 |
The instruction modifies the first operand. | |
#define | CF_CHG2 0x00008 |
The instruction modifies the second operand. | |
#define | CF_CHG3 0x00010 |
The instruction modifies the third operand. | |
#define | CF_CHG4 0x00020 |
The instruction modifies 4 operand. | |
#define | CF_CHG5 0x00040 |
The instruction modifies 5 operand. | |
#define | CF_CHG6 0x00080 |
The instruction modifies 6 operand. | |
#define | CF_USE1 0x00100 |
The instruction uses value of the first operand. | |
#define | CF_USE2 0x00200 |
The instruction uses value of the second operand. | |
#define | CF_USE3 0x00400 |
The instruction uses value of the third operand. | |
#define | CF_USE4 0x00800 |
The instruction uses value of the 4 operand. | |
#define | CF_USE5 0x01000 |
The instruction uses value of the 5 operand. | |
#define | CF_USE6 0x02000 |
The instruction uses value of the 6 operand. | |
#define | CF_JUMP 0x04000 |
The instruction passes execution using indirect. More... | |
#define | CF_SHFT 0x08000 |
Bit-shift instruction (shl,shr...) | |
#define | CF_HLL 0x10000 |
Instruction may be present in a high level. More... | |
#define | AS_OFFST 0x00000001L |
offsets are 'offset xxx' ? | |
#define | AS_COLON 0x00000002L |
create colons after data names ? | |
#define | AS_UDATA 0x00000004L |
can use '?' in data directives | |
#define | AS_2CHRE 0x00000008L |
double char constants are: "xy | |
#define | AS_NCHRE 0x00000010L |
char constants are: 'x | |
#define | AS_N2CHR 0x00000020L |
can't have 2 byte char consts | |
#define | AS_1TEXT 0x00000040L |
1 text per line, no bytes | |
#define | AS_NHIAS 0x00000080L |
no characters with high bit | |
#define | AS_NCMAS 0x00000100L |
no commas in ascii directives | |
#define | AS_HEXFM 0x00000E00L |
mask - hex number format | |
#define | ASH_HEXF0 0x00000000L |
34h | |
#define | ASH_HEXF1 0x00000200L |
h'34 | |
#define | ASH_HEXF2 0x00000400L |
34 | |
#define | ASH_HEXF3 0x00000600L |
0x34 | |
#define | ASH_HEXF4 0x00000800L |
$34 | |
#define | ASH_HEXF5 0x00000A00L |
<^R > (radix) | |
#define | AS_DECFM 0x00003000L |
mask - decimal number format | |
#define | ASD_DECF0 0x00000000L |
34 | |
#define | ASD_DECF1 0x00001000L |
#34 | |
#define | ASD_DECF2 0x00002000L |
34. | |
#define | ASD_DECF3 0x00003000L |
.34 | |
#define | AS_OCTFM 0x0001C000L |
mask - octal number format | |
#define | ASO_OCTF0 0x00000000L |
123o | |
#define | ASO_OCTF1 0x00004000L |
0123 | |
#define | ASO_OCTF2 0x00008000L |
123 | |
#define | ASO_OCTF3 0x0000C000L |
@123 | |
#define | ASO_OCTF4 0x00010000L |
o'123 | |
#define | ASO_OCTF5 0x00014000L |
123q | |
#define | ASO_OCTF6 0x00018000L |
~123 | |
#define | ASO_OCTF7 0x0001C000L |
q'123 | |
#define | AS_BINFM 0x000E0000L |
mask - binary number format | |
#define | ASB_BINF0 0x00000000L |
010101b | |
#define | ASB_BINF1 0x00020000L |
^B010101 | |
#define | ASB_BINF2 0x00040000L |
%010101 | |
#define | ASB_BINF3 0x00060000L |
0b1010101 | |
#define | ASB_BINF4 0x00080000L |
b'1010101 | |
#define | ASB_BINF5 0x000A0000L |
b'1010101' | |
#define | AS_UNEQU 0x00100000L |
replace undefined data items with EQU (for ANTA's A80) | |
#define | AS_ONEDUP 0x00200000L |
One array definition per line. | |
#define | AS_NOXRF 0x00400000L |
Disable xrefs during the output file generation. | |
#define | AS_XTRNTYPE 0x00800000L |
Assembler understands type of extern symbols as ":type" suffix. | |
#define | AS_RELSUP 0x01000000L |
Checkarg: 'and','or','xor' operations with addresses are possible. | |
#define | AS_LALIGN 0x02000000L |
Labels at "align" keyword are supported. | |
#define | AS_NOCODECLN 0x04000000L |
don't create colons after code names | |
#define | AS_NOSPACE 0x10000000L |
No spaces in expressions. | |
#define | AS_ALIGN2 0x20000000L |
.align directive expects an exponent rather than a power of 2 More... | |
#define | AS_ASCIIC 0x40000000L |
ascii directive accepts C-like escape sequences More... | |
#define | AS_ASCIIZ 0x80000000L |
ascii directive inserts implicit zero byte at the end | |
#define | AS2_BRACE 0x00000001 |
Use braces for all expressions. | |
#define | AS2_STRINV 0x00000002 |
Invert meaning of idainfo::wide_high_byte_first for text strings. More... | |
#define | AS2_BYTE1CHAR 0x00000004 |
One symbol per processor byte. More... | |
#define | AS2_IDEALDSCR 0x00000008 |
Description of struc/union is in. More... | |
#define | AS2_TERSESTR 0x00000010 |
'terse' structure initialization form More... | |
#define | AS2_COLONSUF 0x00000020 |
addresses may have ":xx" suffix More... | |
#define | AS2_YWORD 0x00000040 |
a_yword field is present and valid | |
#define | PLFM_386 0 |
Intel 80x86. | |
#define | PLFM_Z80 1 |
8085, Z80 | |
#define | PLFM_I860 2 |
Intel 860. | |
#define | PLFM_8051 3 |
8051 | |
#define | PLFM_TMS 4 |
Texas Instruments TMS320C5x. | |
#define | PLFM_6502 5 |
6502 | |
#define | PLFM_PDP 6 |
PDP11. | |
#define | PLFM_68K 7 |
Motorola 680x0. | |
#define | PLFM_JAVA 8 |
Java. | |
#define | PLFM_6800 9 |
Motorola 68xx. | |
#define | PLFM_ST7 10 |
SGS-Thomson ST7. | |
#define | PLFM_MC6812 11 |
Motorola 68HC12. | |
#define | PLFM_MIPS 12 |
MIPS. | |
#define | PLFM_ARM 13 |
Advanced RISC Machines. | |
#define | PLFM_TMSC6 14 |
Texas Instruments TMS320C6x. | |
#define | PLFM_PPC 15 |
PowerPC. | |
#define | PLFM_80196 16 |
Intel 80196. | |
#define | PLFM_Z8 17 |
Z8. | |
#define | PLFM_SH 18 |
Renesas (formerly Hitachi) SuperH. | |
#define | PLFM_NET 19 |
Microsoft Visual Studio.Net. | |
#define | PLFM_AVR 20 |
Atmel 8-bit RISC processor(s) | |
#define | PLFM_H8 21 |
Hitachi H8/300, H8/2000. | |
#define | PLFM_PIC 22 |
Microchip's PIC. | |
#define | PLFM_SPARC 23 |
SPARC. | |
#define | PLFM_ALPHA 24 |
DEC Alpha. | |
#define | PLFM_HPPA 25 |
Hewlett-Packard PA-RISC. | |
#define | PLFM_H8500 26 |
Hitachi H8/500. | |
#define | PLFM_TRICORE 27 |
Tasking Tricore. | |
#define | PLFM_DSP56K 28 |
Motorola DSP5600x. | |
#define | PLFM_C166 29 |
Siemens C166 family. | |
#define | PLFM_ST20 30 |
SGS-Thomson ST20. | |
#define | PLFM_IA64 31 |
Intel Itanium IA64. | |
#define | PLFM_I960 32 |
Intel 960. | |
#define | PLFM_F2MC 33 |
Fujistu F2MC-16. | |
#define | PLFM_TMS320C54 34 |
Texas Instruments TMS320C54xx. | |
#define | PLFM_TMS320C55 35 |
Texas Instruments TMS320C55xx. | |
#define | PLFM_TRIMEDIA 36 |
Trimedia. | |
#define | PLFM_M32R 37 |
Mitsubishi 32bit RISC. | |
#define | PLFM_NEC_78K0 38 |
NEC 78K0. | |
#define | PLFM_NEC_78K0S 39 |
NEC 78K0S. | |
#define | PLFM_M740 40 |
Mitsubishi 8bit. | |
#define | PLFM_M7700 41 |
Mitsubishi 16bit. | |
#define | PLFM_ST9 42 |
ST9+. | |
#define | PLFM_FR 43 |
Fujitsu FR Family. | |
#define | PLFM_MC6816 44 |
Motorola 68HC16. | |
#define | PLFM_M7900 45 |
Mitsubishi 7900. | |
#define | PLFM_TMS320C3 46 |
Texas Instruments TMS320C3. | |
#define | PLFM_KR1878 47 |
Angstrem KR1878. | |
#define | PLFM_AD218X 48 |
Analog Devices ADSP 218X. | |
#define | PLFM_OAKDSP 49 |
Atmel OAK DSP. | |
#define | PLFM_TLCS900 50 |
Toshiba TLCS-900. | |
#define | PLFM_C39 51 |
Rockwell C39. | |
#define | PLFM_CR16 52 |
NSC CR16. | |
#define | PLFM_MN102L00 53 |
Panasonic MN10200. | |
#define | PLFM_TMS320C1X 54 |
Texas Instruments TMS320C1x. | |
#define | PLFM_NEC_V850X 55 |
NEC V850 and V850ES/E1/E2. | |
#define | PLFM_SCR_ADPT 56 |
Processor module adapter for processor modules written in scripting languages. | |
#define | PLFM_EBC 57 |
EFI Bytecode. | |
#define | PLFM_MSP430 58 |
Texas Instruments MSP430. | |
#define | PLFM_SPU 59 |
Cell Broadband Engine Synergistic Processor Unit. | |
#define | PLFM_DALVIK 60 |
Android Dalvik Virtual Machine. | |
#define | PLFM_65C816 61 |
65802/65816 | |
#define | PLFM_M16C 62 |
Renesas M16C. | |
#define | PLFM_ARC 63 |
Argonaut RISC Core. | |
#define | PLFM_UNSP 64 |
SunPlus unSP. | |
#define | PLFM_TMS320C28 65 |
Texas Instruments TMS320C28x. | |
#define | PLFM_DSP96K 66 |
Motorola DSP96000. | |
#define | PLFM_SPC700 67 |
Sony SPC700. | |
#define | PR_SEGS 0x000001 |
has segment registers? | |
#define | PR_USE32 0x000002 |
supports 32-bit addressing? | |
#define | PR_DEFSEG32 0x000004 |
segments are 32-bit by default | |
#define | PR_RNAMESOK 0x000008 |
allow user register names for location names | |
#define | PR_ADJSEGS 0x000020 |
IDA may adjust segments' starting/ending addresses. | |
#define | PR_DEFNUM 0x0000C0 |
mask - default number representation | |
#define | PRN_HEX 0x000000 |
hex | |
#define | PRN_OCT 0x000040 |
octal | |
#define | PRN_DEC 0x000080 |
decimal | |
#define | PRN_BIN 0x0000C0 |
binary | |
#define | PR_WORD_INS 0x000100 |
instruction codes are grouped 2bytes in binary line prefix | |
#define | PR_NOCHANGE 0x000200 |
The user can't change segments and code/data attributes. More... | |
#define | PR_ASSEMBLE 0x000400 |
Module has a built-in assembler and will react to ev_assemble. | |
#define | PR_ALIGN 0x000800 |
All data items should be aligned properly. | |
#define | PR_TYPEINFO 0x001000 |
the processor module supports type information callbacks More... | |
#define | PR_USE64 0x002000 |
supports 64-bit addressing? | |
#define | PR_SGROTHER 0x004000 |
the segment registers don't contain the segment selectors. | |
#define | PR_STACK_UP 0x008000 |
the stack grows up | |
#define | PR_BINMEM 0x010000 |
the processor module provides correct segmentation for binary files More... | |
#define | PR_SEGTRANS 0x020000 |
the processor module supports the segment translation feature More... | |
#define | PR_CHK_XREF 0x040000 |
don't allow near xrefs between segments with different bases | |
#define | PR_NO_SEGMOVE 0x080000 |
the processor module doesn't support move_segm() More... | |
#define | PR_USE_ARG_TYPES 0x200000 |
use processor_t::use_arg_types callback | |
#define | PR_SCALE_STKVARS 0x400000 |
use processor_t::get_stkvar_scale callback | |
#define | PR_DELAYED 0x800000 |
has delayed jumps and calls More... | |
#define | PR_ALIGN_INSN 0x1000000 |
allow ida to create alignment instructions arbitrarily. More... | |
#define | PR_PURGING 0x2000000 |
there are calling conventions which may purge bytes from the stack | |
#define | PR_CNDINSNS 0x4000000 |
has conditional instructions | |
#define | PR_USE_TBYTE 0x8000000 |
BTMT_SPECFLT means _TBYTE type | |
#define | PR_DEFSEG64 0x10000000 |
segments are 64-bit by default | |
#define | PR_OUTER 0x20000000 |
has outer operands (currently only mc68k) | |
#define | PR2_MAPPINGS 0x000001 |
the processor module uses memory mapping | |
#define | PR2_IDP_OPTS 0x000002 |
the module has processor-specific configuration options | |
#define | PR2_REALCVT 0x000004 |
the module has 'realcvt' event implementation | |
#define | CUSTOM_INSN_ITYPE 0x8000 |
Custom instruction codes defined by processor extension plugins must be greater than or equal to this. | |
#define | REG_SPOIL 0x80000000L |
processor_t::use_regarg_type uses this bit in the return value to indicate that the register value has been spoiled | |
#define | OP_FP_BASED 0x00000000 |
operand is FP based | |
#define | OP_SP_BASED 0x00000001 |
operand is SP based | |
#define | OP_SP_ADD 0x00000000 |
operand value is added to the pointer | |
#define | OP_SP_SUB 0x00000002 |
operand value is subtracted from the pointer | |
Typedefs | |
typedef int | help_t |
help screen number | |
typedef ssize_t idaapi | hook_cb_t(void *user_data, int notification_code, va_list va) |
Callback provided to hook_to_notification_point(). More... | |
typedef qvector< reg_info_t > | reginfovec_t |
vector of register info objects | |
Variables | |
idaman processor_t ida_export_data | ph |
current processor | |
idaman asm_t ida_export_data | ash |
current assembler | |
#define IDP_INTERFACE_VERSION 700 |
The interface version number.
Callback provided to hook_to_notification_point().
A plugin can hook to a notification point and receive notifications of all major events in IDA. The callback function will be called for each event.
user_data | data supplied in call to hook_to_notification_point() |
notification_code | processor_t::event_t or ui_notification_t, depending on the hook type |
va | additional parameters supplied with the notification. see the event descriptions for information |
0 | ok, the event should be processed further |
!=0 | the event is blocked and should be discarded. in the case of processor modules, the returned value is used as the return value of processor_t::notify() |
enum hook_type_t |
Types of events that be hooked to with hook_to_notification_point()
Enumerator | |
---|---|
HT_IDP |
Hook to the processor module. The callback will receive all processor_t::event_t events. |
HT_UI |
Hook to the user interface. The callback will receive all ui_notification_t events. |
HT_DBG |
Hook to the debugger. The callback will receive all dbg_notification_t events. |
HT_IDB |
Hook to the database events. These events are separated from the HT_IDP group to speed things up (there are too many plugins and modules hooking to the HT_IDP). Some essential events are still generated in th HT_IDP group: make_code, make_data This list is not exhaustive. A common trait of all events in this group: the kernel does not expect any reaction to the event and does not check the return code. For event names, see idb_event. |
HT_DEV |
Internal debugger events. Not stable and undocumented for the moment |
HT_VIEW |
Custom/IDA views notifications. Refer to view_notification_t for notification codes |
HT_OUTPUT |
Output window notifications. Refer to msg_notification_t (view_notification_t) |
HT_GRAPH |
Handling graph operations (graph_notification_t) |
enum setproc_level_t |
Flags passed as 'level' parameter to set_processor_type()
Enumerator | |
---|---|
SETPROC_IDB |
set processor type for old idb |
SETPROC_LOADER |
set processor type for new idb; if the user has specified a compatible processor, return success without changing it. if failure, call loader_failure() |
SETPROC_LOADER_NON_FATAL |
the same as SETPROC_LOADER but non-fatal failures. |
SETPROC_USER |
set user-specified processor used for -p and manual processor change at later time |
idaman int ida_export unhook_from_notification_point | ( | hook_type_t | hook_type, |
hook_cb_t * | cb, | ||
void * | user_data = NULL |
||
) |
Unregister a callback (also see hook_to_notification_point()).
A plugin should unhook before being unloaded (preferably in its termination function). If different callbacks have the same callback function pointer and user_data is not NULL, only the callback whose associated user defined data matches will be removed.
idaman ssize_t ida_export invoke_callbacks | ( | hook_type_t | hook_type, |
int | code, | ||
va_list | va | ||
) |
Generate event notification.
hook_type | hook type |
code | event code |
va | additional arguments |
idaman int ida_export is_align_insn | ( | ea_t | ea | ) |
If the instruction at 'ea' looks like an alignment instruction, return its length in bytes.
Otherwise return 0.
idaman ssize_t ida_export get_reg_name | ( | qstring * | buf, |
int | reg, | ||
size_t | width, | ||
int | reghi = -1 |
||
) |
Get text representation of a register.
For most processors this function will just return processor_t::reg_names[reg]. If the processor module has implemented processor_t::get_reg_name, it will be used instead
buf | output buffer |
reg | internal register number as defined in the processor module |
width | register width in bytes |
reghi | if specified, then this function will return the register pair |
|
inline |
Get register information - useful for registers like al, ah, dil, etc.
idaman bool ida_export parse_reg_name | ( | reg_info_t * | ri, |
const char * | regname | ||
) |
Get register info by name.
[out] | ri | result |
regname | name of register |
idaman bool ida_export set_processor_type | ( | const char * | procname, |
setproc_level_t | level | ||
) |
Set target processor type.
Once a processor module is loaded, it can not be replaced until we close the idb.
procname | name of processor type (one of names present in processor_t::psnames) |
level | SETPROC_ |
idaman char* ida_export get_idp_name | ( | char * | buf, |
size_t | bufsize | ||
) |
Get name of the current processor module.
The name is derived from the file name. For example, for IBM PC the module is named "pc.w32" (windows version), then the module name is "PC" (uppercase). If no processor module is loaded, this function will return NULL
buf | the output buffer, should be at least QMAXFILE length |
bufsize | size of output buffer |
idaman bool ida_export set_target_assembler | ( | int | asmnum | ) |
Set target assembler.
asmnum | number of assembler in the current processor module |