Home | History | Annotate | Download | only in include
      1 #ifndef CAPSTONE_ENGINE_H
      2 #define CAPSTONE_ENGINE_H
      3 
      4 /* Capstone Disassembly Engine */
      5 /* By Nguyen Anh Quynh <aquynh (at) gmail.com>, 2013-2016 */
      6 
      7 #ifdef __cplusplus
      8 extern "C" {
      9 #endif
     10 
     11 #if !defined(_MSC_VER) || !defined(_KERNEL_MODE)
     12 #include <stdint.h>
     13 #endif
     14 
     15 #include <stdarg.h>
     16 
     17 #if defined(CAPSTONE_HAS_OSXKERNEL)
     18 #include <libkern/libkern.h>
     19 #else
     20 #include <stdlib.h>
     21 #include <stdio.h>
     22 #endif
     23 
     24 #include "platform.h"
     25 
     26 #ifdef _MSC_VER
     27 #pragma warning(disable:4201)
     28 #pragma warning(disable:4100)
     29 #define CAPSTONE_API __cdecl
     30 #ifdef CAPSTONE_SHARED
     31 #define CAPSTONE_EXPORT __declspec(dllexport)
     32 #else    // defined(CAPSTONE_STATIC)
     33 #define CAPSTONE_EXPORT
     34 #endif
     35 #else
     36 #define CAPSTONE_API
     37 #if defined(__GNUC__) && !defined(CAPSTONE_STATIC)
     38 #define CAPSTONE_EXPORT __attribute__((visibility("default")))
     39 #else    // defined(CAPSTONE_STATIC)
     40 #define CAPSTONE_EXPORT
     41 #endif
     42 #endif
     43 
     44 #ifdef __GNUC__
     45 #define CAPSTONE_DEPRECATED __attribute__((deprecated))
     46 #elif defined(_MSC_VER)
     47 #define CAPSTONE_DEPRECATED __declspec(deprecated)
     48 #else
     49 #pragma message("WARNING: You need to implement CAPSTONE_DEPRECATED for this compiler")
     50 #define CAPSTONE_DEPRECATED
     51 #endif
     52 
     53 // Capstone API version
     54 #define CS_API_MAJOR 3
     55 #define CS_API_MINOR 0
     56 
     57 // Capstone package version
     58 #define CS_VERSION_MAJOR CS_API_MAJOR
     59 #define CS_VERSION_MINOR CS_API_MINOR
     60 #define CS_VERSION_EXTRA 5
     61 
     62 // Macro to create combined version which can be compared to
     63 // result of cs_version() API.
     64 #define CS_MAKE_VERSION(major, minor) ((major << 8) + minor)
     65 
     66 // Handle using with all API
     67 typedef size_t csh;
     68 
     69 // Architecture type
     70 typedef enum cs_arch {
     71 	CS_ARCH_ARM = 0,	// ARM architecture (including Thumb, Thumb-2)
     72 	CS_ARCH_ARM64,		// ARM-64, also called AArch64
     73 	CS_ARCH_MIPS,		// Mips architecture
     74 	CS_ARCH_X86,		// X86 architecture (including x86 & x86-64)
     75 	CS_ARCH_PPC,		// PowerPC architecture
     76 	CS_ARCH_SPARC,		// Sparc architecture
     77 	CS_ARCH_SYSZ,		// SystemZ architecture
     78 	CS_ARCH_XCORE,		// XCore architecture
     79 	CS_ARCH_MAX,
     80 	CS_ARCH_ALL = 0xFFFF, // All architectures - for cs_support()
     81 } cs_arch;
     82 
     83 // Support value to verify diet mode of the engine.
     84 // If cs_support(CS_SUPPORT_DIET) return True, the engine was compiled
     85 // in diet mode.
     86 #define CS_SUPPORT_DIET (CS_ARCH_ALL + 1)
     87 
     88 // Support value to verify X86 reduce mode of the engine.
     89 // If cs_support(CS_SUPPORT_X86_REDUCE) return True, the engine was compiled
     90 // in X86 reduce mode.
     91 #define CS_SUPPORT_X86_REDUCE (CS_ARCH_ALL + 2)
     92 
     93 // Mode type
     94 typedef enum cs_mode {
     95 	CS_MODE_LITTLE_ENDIAN = 0,	// little-endian mode (default mode)
     96 	CS_MODE_ARM = 0,	// 32-bit ARM
     97 	CS_MODE_16 = 1 << 1,	// 16-bit mode (X86)
     98 	CS_MODE_32 = 1 << 2,	// 32-bit mode (X86)
     99 	CS_MODE_64 = 1 << 3,	// 64-bit mode (X86, PPC)
    100 	CS_MODE_THUMB = 1 << 4,	// ARM's Thumb mode, including Thumb-2
    101 	CS_MODE_MCLASS = 1 << 5,	// ARM's Cortex-M series
    102 	CS_MODE_V8 = 1 << 6,	// ARMv8 A32 encodings for ARM
    103 	CS_MODE_MICRO = 1 << 4, // MicroMips mode (MIPS)
    104 	CS_MODE_MIPS3 = 1 << 5, // Mips III ISA
    105 	CS_MODE_MIPS32R6 = 1 << 6, // Mips32r6 ISA
    106 	CS_MODE_MIPSGP64 = 1 << 7, // General Purpose Registers are 64-bit wide (MIPS)
    107 	CS_MODE_V9 = 1 << 4, // SparcV9 mode (Sparc)
    108 	CS_MODE_BIG_ENDIAN = 1 << 31,	// big-endian mode
    109 	CS_MODE_MIPS32 = CS_MODE_32,	// Mips32 ISA (Mips)
    110 	CS_MODE_MIPS64 = CS_MODE_64,	// Mips64 ISA (Mips)
    111 } cs_mode;
    112 
    113 typedef void* (CAPSTONE_API *cs_malloc_t)(size_t size);
    114 typedef void* (CAPSTONE_API *cs_calloc_t)(size_t nmemb, size_t size);
    115 typedef void* (CAPSTONE_API *cs_realloc_t)(void *ptr, size_t size);
    116 typedef void (CAPSTONE_API *cs_free_t)(void *ptr);
    117 typedef int (CAPSTONE_API *cs_vsnprintf_t)(char *str, size_t size, const char *format, va_list ap);
    118 
    119 
    120 // User-defined dynamic memory related functions: malloc/calloc/realloc/free/vsnprintf()
    121 // By default, Capstone uses system's malloc(), calloc(), realloc(), free() & vsnprintf().
    122 typedef struct cs_opt_mem {
    123 	cs_malloc_t malloc;
    124 	cs_calloc_t calloc;
    125 	cs_realloc_t realloc;
    126 	cs_free_t free;
    127 	cs_vsnprintf_t vsnprintf;
    128 } cs_opt_mem;
    129 
    130 // Runtime option for the disassembled engine
    131 typedef enum cs_opt_type {
    132 	CS_OPT_INVALID = 0,	// No option specified
    133 	CS_OPT_SYNTAX,	// Assembly output syntax
    134 	CS_OPT_DETAIL,	// Break down instruction structure into details
    135 	CS_OPT_MODE,	// Change engine's mode at run-time
    136 	CS_OPT_MEM,	// User-defined dynamic memory related functions
    137 	CS_OPT_SKIPDATA, // Skip data when disassembling. Then engine is in SKIPDATA mode.
    138 	CS_OPT_SKIPDATA_SETUP, // Setup user-defined function for SKIPDATA option
    139 } cs_opt_type;
    140 
    141 // Runtime option value (associated with option type above)
    142 typedef enum cs_opt_value {
    143 	CS_OPT_OFF = 0,  // Turn OFF an option - default option of CS_OPT_DETAIL, CS_OPT_SKIPDATA.
    144 	CS_OPT_ON = 3, // Turn ON an option (CS_OPT_DETAIL, CS_OPT_SKIPDATA).
    145 	CS_OPT_SYNTAX_DEFAULT = 0, // Default asm syntax (CS_OPT_SYNTAX).
    146 	CS_OPT_SYNTAX_INTEL, // X86 Intel asm syntax - default on X86 (CS_OPT_SYNTAX).
    147 	CS_OPT_SYNTAX_ATT,   // X86 ATT asm syntax (CS_OPT_SYNTAX).
    148 	CS_OPT_SYNTAX_NOREGNAME, // Prints register name with only number (CS_OPT_SYNTAX)
    149 } cs_opt_value;
    150 
    151 //> Common instruction operand types - to be consistent across all architectures.
    152 typedef enum cs_op_type {
    153 	CS_OP_INVALID = 0,  // uninitialized/invalid operand.
    154 	CS_OP_REG,          // Register operand.
    155 	CS_OP_IMM,          // Immediate operand.
    156 	CS_OP_MEM,          // Memory operand.
    157 	CS_OP_FP,           // Floating-Point operand.
    158 } cs_op_type;
    159 
    160 //> Common instruction groups - to be consistent across all architectures.
    161 typedef enum cs_group_type {
    162 	CS_GRP_INVALID = 0,  // uninitialized/invalid group.
    163 	CS_GRP_JUMP,    // all jump instructions (conditional+direct+indirect jumps)
    164 	CS_GRP_CALL,    // all call instructions
    165 	CS_GRP_RET,     // all return instructions
    166 	CS_GRP_INT,     // all interrupt instructions (int+syscall)
    167 	CS_GRP_IRET,    // all interrupt return instructions
    168 } cs_group_type;
    169 
    170 /*
    171  User-defined callback function for SKIPDATA option.
    172  See tests/test_skipdata.c for sample code demonstrating this API.
    173 
    174  @code: the input buffer containing code to be disassembled.
    175         This is the same buffer passed to cs_disasm().
    176  @code_size: size (in bytes) of the above @code buffer.
    177  @offset: the position of the currently-examining byte in the input
    178       buffer @code mentioned above.
    179  @user_data: user-data passed to cs_option() via @user_data field in
    180       cs_opt_skipdata struct below.
    181 
    182  @return: return number of bytes to skip, or 0 to immediately stop disassembling.
    183 */
    184 typedef size_t (CAPSTONE_API *cs_skipdata_cb_t)(const uint8_t *code, size_t code_size, size_t offset, void *user_data);
    185 
    186 // User-customized setup for SKIPDATA option
    187 typedef struct cs_opt_skipdata {
    188 	// Capstone considers data to skip as special "instructions".
    189 	// User can specify the string for this instruction's "mnemonic" here.
    190 	// By default (if @mnemonic is NULL), Capstone use ".byte".
    191 	const char *mnemonic;
    192 
    193 	// User-defined callback function to be called when Capstone hits data.
    194 	// If the returned value from this callback is positive (>0), Capstone
    195 	// will skip exactly that number of bytes & continue. Otherwise, if
    196 	// the callback returns 0, Capstone stops disassembling and returns
    197 	// immediately from cs_disasm()
    198 	// NOTE: if this callback pointer is NULL, Capstone would skip a number
    199 	// of bytes depending on architectures, as following:
    200 	// Arm:     2 bytes (Thumb mode) or 4 bytes.
    201 	// Arm64:   4 bytes.
    202 	// Mips:    4 bytes.
    203 	// PowerPC: 4 bytes.
    204 	// Sparc:   4 bytes.
    205 	// SystemZ: 2 bytes.
    206 	// X86:     1 bytes.
    207 	// XCore:   2 bytes.
    208 	cs_skipdata_cb_t callback; 	// default value is NULL
    209 
    210 	// User-defined data to be passed to @callback function pointer.
    211 	void *user_data;
    212 } cs_opt_skipdata;
    213 
    214 
    215 #include "arm.h"
    216 #include "arm64.h"
    217 #include "mips.h"
    218 #include "ppc.h"
    219 #include "sparc.h"
    220 #include "systemz.h"
    221 #include "x86.h"
    222 #include "xcore.h"
    223 
    224 // NOTE: All information in cs_detail is only available when CS_OPT_DETAIL = CS_OPT_ON
    225 typedef struct cs_detail {
    226 	uint8_t regs_read[12]; // list of implicit registers read by this insn
    227 	uint8_t regs_read_count; // number of implicit registers read by this insn
    228 
    229 	uint8_t regs_write[20]; // list of implicit registers modified by this insn
    230 	uint8_t regs_write_count; // number of implicit registers modified by this insn
    231 
    232 	uint8_t groups[8]; // list of group this instruction belong to
    233 	uint8_t groups_count; // number of groups this insn belongs to
    234 
    235 	// Architecture-specific instruction info
    236 	union {
    237 		cs_x86 x86;	// X86 architecture, including 16-bit, 32-bit & 64-bit mode
    238 		cs_arm64 arm64;	// ARM64 architecture (aka AArch64)
    239 		cs_arm arm;		// ARM architecture (including Thumb/Thumb2)
    240 		cs_mips mips;	// MIPS architecture
    241 		cs_ppc ppc;	// PowerPC architecture
    242 		cs_sparc sparc;	// Sparc architecture
    243 		cs_sysz sysz;	// SystemZ architecture
    244 		cs_xcore xcore;	// XCore architecture
    245 	};
    246 } cs_detail;
    247 
    248 // Detail information of disassembled instruction
    249 typedef struct cs_insn {
    250 	// Instruction ID (basically a numeric ID for the instruction mnemonic)
    251 	// Find the instruction id in the '[ARCH]_insn' enum in the header file
    252 	// of corresponding architecture, such as 'arm_insn' in arm.h for ARM,
    253 	// 'x86_insn' in x86.h for X86, etc...
    254 	// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF
    255 	// NOTE: in Skipdata mode, "data" instruction has 0 for this id field.
    256 	unsigned int id;
    257 
    258 	// Address (EIP) of this instruction
    259 	// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF
    260 	uint64_t address;
    261 
    262 	// Size of this instruction
    263 	// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF
    264 	uint16_t size;
    265 	// Machine bytes of this instruction, with number of bytes indicated by @size above
    266 	// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF
    267 	uint8_t bytes[16];
    268 
    269 	// Ascii text of instruction mnemonic
    270 	// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF
    271 	char mnemonic[32];
    272 
    273 	// Ascii text of instruction operands
    274 	// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF
    275 	char op_str[160];
    276 
    277 	// Pointer to cs_detail.
    278 	// NOTE: detail pointer is only valid when both requirements below are met:
    279 	// (1) CS_OP_DETAIL = CS_OPT_ON
    280 	// (2) Engine is not in Skipdata mode (CS_OP_SKIPDATA option set to CS_OPT_ON)
    281 	//
    282 	// NOTE 2: when in Skipdata mode, or when detail mode is OFF, even if this pointer
    283 	//     is not NULL, its content is still irrelevant.
    284 	cs_detail *detail;
    285 } cs_insn;
    286 
    287 
    288 // Calculate the offset of a disassembled instruction in its buffer, given its position
    289 // in its array of disassembled insn
    290 // NOTE: this macro works with position (>=1), not index
    291 #define CS_INSN_OFFSET(insns, post) (insns[post - 1].address - insns[0].address)
    292 
    293 
    294 // All type of errors encountered by Capstone API.
    295 // These are values returned by cs_errno()
    296 typedef enum cs_err {
    297 	CS_ERR_OK = 0,   // No error: everything was fine
    298 	CS_ERR_MEM,      // Out-Of-Memory error: cs_open(), cs_disasm(), cs_disasm_iter()
    299 	CS_ERR_ARCH,     // Unsupported architecture: cs_open()
    300 	CS_ERR_HANDLE,   // Invalid handle: cs_op_count(), cs_op_index()
    301 	CS_ERR_CSH,	     // Invalid csh argument: cs_close(), cs_errno(), cs_option()
    302 	CS_ERR_MODE,     // Invalid/unsupported mode: cs_open()
    303 	CS_ERR_OPTION,   // Invalid/unsupported option: cs_option()
    304 	CS_ERR_DETAIL,   // Information is unavailable because detail option is OFF
    305 	CS_ERR_MEMSETUP, // Dynamic memory management uninitialized (see CS_OPT_MEM)
    306 	CS_ERR_VERSION,  // Unsupported version (bindings)
    307 	CS_ERR_DIET,     // Access irrelevant data in "diet" engine
    308 	CS_ERR_SKIPDATA, // Access irrelevant data for "data" instruction in SKIPDATA mode
    309 	CS_ERR_X86_ATT,  // X86 AT&T syntax is unsupported (opt-out at compile time)
    310 	CS_ERR_X86_INTEL, // X86 Intel syntax is unsupported (opt-out at compile time)
    311 } cs_err;
    312 
    313 /*
    314  Return combined API version & major and minor version numbers.
    315 
    316  @major: major number of API version
    317  @minor: minor number of API version
    318 
    319  @return hexical number as (major << 8 | minor), which encodes both
    320 	 major & minor versions.
    321 	 NOTE: This returned value can be compared with version number made
    322 	 with macro CS_MAKE_VERSION
    323 
    324  For example, second API version would return 1 in @major, and 1 in @minor
    325  The return value would be 0x0101
    326 
    327  NOTE: if you only care about returned value, but not major and minor values,
    328  set both @major & @minor arguments to NULL.
    329 */
    330 CAPSTONE_EXPORT
    331 unsigned int CAPSTONE_API cs_version(int *major, int *minor);
    332 
    333 
    334 /*
    335  This API can be used to either ask for archs supported by this library,
    336  or check to see if the library was compile with 'diet' option (or called
    337  in 'diet' mode).
    338 
    339  To check if a particular arch is supported by this library, set @query to
    340  arch mode (CS_ARCH_* value).
    341  To verify if this library supports all the archs, use CS_ARCH_ALL.
    342 
    343  To check if this library is in 'diet' mode, set @query to CS_SUPPORT_DIET.
    344 
    345  @return True if this library supports the given arch, or in 'diet' mode.
    346 */
    347 CAPSTONE_EXPORT
    348 bool CAPSTONE_API cs_support(int query);
    349 
    350 /*
    351  Initialize CS handle: this must be done before any usage of CS.
    352 
    353  @arch: architecture type (CS_ARCH_*)
    354  @mode: hardware mode. This is combined of CS_MODE_*
    355  @handle: pointer to handle, which will be updated at return time
    356 
    357  @return CS_ERR_OK on success, or other value on failure (refer to cs_err enum
    358  for detailed error).
    359 */
    360 CAPSTONE_EXPORT
    361 cs_err CAPSTONE_API cs_open(cs_arch arch, cs_mode mode, csh *handle);
    362 
    363 /*
    364  Close CS handle: MUST do to release the handle when it is not used anymore.
    365  NOTE: this must be only called when there is no longer usage of Capstone,
    366  not even access to cs_insn array. The reason is the this API releases some
    367  cached memory, thus access to any Capstone API after cs_close() might crash
    368  your application.
    369 
    370  In fact,this API invalidate @handle by ZERO out its value (i.e *handle = 0).
    371 
    372  @handle: pointer to a handle returned by cs_open()
    373 
    374  @return CS_ERR_OK on success, or other value on failure (refer to cs_err enum
    375  for detailed error).
    376 */
    377 CAPSTONE_EXPORT
    378 cs_err CAPSTONE_API cs_close(csh *handle);
    379 
    380 /*
    381  Set option for disassembling engine at runtime
    382 
    383  @handle: handle returned by cs_open()
    384  @type: type of option to be set
    385  @value: option value corresponding with @type
    386 
    387  @return: CS_ERR_OK on success, or other value on failure.
    388  Refer to cs_err enum for detailed error.
    389 
    390  NOTE: in the case of CS_OPT_MEM, handle's value can be anything,
    391  so that cs_option(handle, CS_OPT_MEM, value) can (i.e must) be called
    392  even before cs_open()
    393 */
    394 CAPSTONE_EXPORT
    395 cs_err CAPSTONE_API cs_option(csh handle, cs_opt_type type, size_t value);
    396 
    397 /*
    398  Report the last error number when some API function fail.
    399  Like glibc's errno, cs_errno might not retain its old value once accessed.
    400 
    401  @handle: handle returned by cs_open()
    402 
    403  @return: error code of cs_err enum type (CS_ERR_*, see above)
    404 */
    405 CAPSTONE_EXPORT
    406 cs_err CAPSTONE_API cs_errno(csh handle);
    407 
    408 
    409 /*
    410  Return a string describing given error code.
    411 
    412  @code: error code (see CS_ERR_* above)
    413 
    414  @return: returns a pointer to a string that describes the error code
    415 	passed in the argument @code
    416 */
    417 CAPSTONE_EXPORT
    418 const char * CAPSTONE_API cs_strerror(cs_err code);
    419 
    420 /*
    421  Disassemble binary code, given the code buffer, size, address and number
    422  of instructions to be decoded.
    423  This API dynamically allocate memory to contain disassembled instruction.
    424  Resulted instructions will be put into @*insn
    425 
    426  NOTE 1: this API will automatically determine memory needed to contain
    427  output disassembled instructions in @insn.
    428 
    429  NOTE 2: caller must free the allocated memory itself to avoid memory leaking.
    430 
    431  NOTE 3: for system with scarce memory to be dynamically allocated such as
    432  OS kernel or firmware, the API cs_disasm_iter() might be a better choice than
    433  cs_disasm(). The reason is that with cs_disasm(), based on limited available
    434  memory, we have to calculate in advance how many instructions to be disassembled,
    435  which complicates things. This is especially troublesome for the case @count=0,
    436  when cs_disasm() runs uncontrollably (until either end of input buffer, or
    437  when it encounters an invalid instruction).
    438 
    439  @handle: handle returned by cs_open()
    440  @code: buffer containing raw binary code to be disassembled.
    441  @code_size: size of the above code buffer.
    442  @address: address of the first instruction in given raw code buffer.
    443  @insn: array of instructions filled in by this API.
    444 	   NOTE: @insn will be allocated by this function, and should be freed
    445 	   with cs_free() API.
    446  @count: number of instructions to be disassembled, or 0 to get all of them
    447 
    448  @return: the number of successfully disassembled instructions,
    449  or 0 if this function failed to disassemble the given code
    450 
    451  On failure, call cs_errno() for error code.
    452 */
    453 CAPSTONE_EXPORT
    454 size_t CAPSTONE_API cs_disasm(csh handle,
    455 		const uint8_t *code, size_t code_size,
    456 		uint64_t address,
    457 		size_t count,
    458 		cs_insn **insn);
    459 
    460 /*
    461   Deprecated function - to be retired in the next version!
    462   Use cs_disasm() instead of cs_disasm_ex()
    463 */
    464 CAPSTONE_EXPORT
    465 CAPSTONE_DEPRECATED
    466 size_t CAPSTONE_API cs_disasm_ex(csh handle,
    467 		const uint8_t *code, size_t code_size,
    468 		uint64_t address,
    469 		size_t count,
    470 		cs_insn **insn);
    471 
    472 /*
    473  Free memory allocated by cs_malloc() or cs_disasm() (argument @insn)
    474 
    475  @insn: pointer returned by @insn argument in cs_disasm() or cs_malloc()
    476  @count: number of cs_insn structures returned by cs_disasm(), or 1
    477      to free memory allocated by cs_malloc().
    478 */
    479 CAPSTONE_EXPORT
    480 void CAPSTONE_API cs_free(cs_insn *insn, size_t count);
    481 
    482 
    483 /*
    484  Allocate memory for 1 instruction to be used by cs_disasm_iter().
    485 
    486  @handle: handle returned by cs_open()
    487 
    488  NOTE: when no longer in use, you can reclaim the memory allocated for
    489  this instruction with cs_free(insn, 1)
    490 */
    491 CAPSTONE_EXPORT
    492 cs_insn * CAPSTONE_API cs_malloc(csh handle);
    493 
    494 /*
    495  Fast API to disassemble binary code, given the code buffer, size, address
    496  and number of instructions to be decoded.
    497  This API put the resulted instruction into a given cache in @insn.
    498  See tests/test_iter.c for sample code demonstrating this API.
    499 
    500  NOTE 1: this API will update @code, @size & @address to point to the next
    501  instruction in the input buffer. Therefore, it is convenient to use
    502  cs_disasm_iter() inside a loop to quickly iterate all the instructions.
    503  While decoding one instruction at a time can also be achieved with
    504  cs_disasm(count=1), some benchmarks shown that cs_disasm_iter() can be 30%
    505  faster on random input.
    506 
    507  NOTE 2: the cache in @insn can be created with cs_malloc() API.
    508 
    509  NOTE 3: for system with scarce memory to be dynamically allocated such as
    510  OS kernel or firmware, this API is recommended over cs_disasm(), which
    511  allocates memory based on the number of instructions to be disassembled.
    512  The reason is that with cs_disasm(), based on limited available memory,
    513  we have to calculate in advance how many instructions to be disassembled,
    514  which complicates things. This is especially troublesome for the case
    515  @count=0, when cs_disasm() runs uncontrollably (until either end of input
    516  buffer, or when it encounters an invalid instruction).
    517 
    518  @handle: handle returned by cs_open()
    519  @code: buffer containing raw binary code to be disassembled
    520  @size: size of above code
    521  @address: address of the first insn in given raw code buffer
    522  @insn: pointer to instruction to be filled in by this API.
    523 
    524  @return: true if this API successfully decode 1 instruction,
    525  or false otherwise.
    526 
    527  On failure, call cs_errno() for error code.
    528 */
    529 CAPSTONE_EXPORT
    530 bool CAPSTONE_API cs_disasm_iter(csh handle,
    531 	const uint8_t **code, size_t *size,
    532 	uint64_t *address, cs_insn *insn);
    533 
    534 /*
    535  Return friendly name of register in a string.
    536  Find the instruction id from header file of corresponding architecture (arm.h for ARM,
    537  x86.h for X86, ...)
    538 
    539  WARN: when in 'diet' mode, this API is irrelevant because engine does not
    540  store register name.
    541 
    542  @handle: handle returned by cs_open()
    543  @reg_id: register id
    544 
    545  @return: string name of the register, or NULL if @reg_id is invalid.
    546 */
    547 CAPSTONE_EXPORT
    548 const char * CAPSTONE_API cs_reg_name(csh handle, unsigned int reg_id);
    549 
    550 /*
    551  Return friendly name of an instruction in a string.
    552  Find the instruction id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...)
    553 
    554  WARN: when in 'diet' mode, this API is irrelevant because the engine does not
    555  store instruction name.
    556 
    557  @handle: handle returned by cs_open()
    558  @insn_id: instruction id
    559 
    560  @return: string name of the instruction, or NULL if @insn_id is invalid.
    561 */
    562 CAPSTONE_EXPORT
    563 const char * CAPSTONE_API cs_insn_name(csh handle, unsigned int insn_id);
    564 
    565 /*
    566  Return friendly name of a group id (that an instruction can belong to)
    567  Find the group id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...)
    568 
    569  WARN: when in 'diet' mode, this API is irrelevant because the engine does not
    570  store group name.
    571 
    572  @handle: handle returned by cs_open()
    573  @group_id: group id
    574 
    575  @return: string name of the group, or NULL if @group_id is invalid.
    576 */
    577 CAPSTONE_EXPORT
    578 const char * CAPSTONE_API cs_group_name(csh handle, unsigned int group_id);
    579 
    580 /*
    581  Check if a disassembled instruction belong to a particular group.
    582  Find the group id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...)
    583  Internally, this simply verifies if @group_id matches any member of insn->groups array.
    584 
    585  NOTE: this API is only valid when detail option is ON (which is OFF by default).
    586 
    587  WARN: when in 'diet' mode, this API is irrelevant because the engine does not
    588  update @groups array.
    589 
    590  @handle: handle returned by cs_open()
    591  @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter()
    592  @group_id: group that you want to check if this instruction belong to.
    593 
    594  @return: true if this instruction indeed belongs to aboved group, or false otherwise.
    595 */
    596 CAPSTONE_EXPORT
    597 bool CAPSTONE_API cs_insn_group(csh handle, const cs_insn *insn, unsigned int group_id);
    598 
    599 /*
    600  Check if a disassembled instruction IMPLICITLY used a particular register.
    601  Find the register id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...)
    602  Internally, this simply verifies if @reg_id matches any member of insn->regs_read array.
    603 
    604  NOTE: this API is only valid when detail option is ON (which is OFF by default)
    605 
    606  WARN: when in 'diet' mode, this API is irrelevant because the engine does not
    607  update @regs_read array.
    608 
    609  @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter()
    610  @reg_id: register that you want to check if this instruction used it.
    611 
    612  @return: true if this instruction indeed implicitly used aboved register, or false otherwise.
    613 */
    614 CAPSTONE_EXPORT
    615 bool CAPSTONE_API cs_reg_read(csh handle, const cs_insn *insn, unsigned int reg_id);
    616 
    617 /*
    618  Check if a disassembled instruction IMPLICITLY modified a particular register.
    619  Find the register id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...)
    620  Internally, this simply verifies if @reg_id matches any member of insn->regs_write array.
    621 
    622  NOTE: this API is only valid when detail option is ON (which is OFF by default)
    623 
    624  WARN: when in 'diet' mode, this API is irrelevant because the engine does not
    625  update @regs_write array.
    626 
    627  @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter()
    628  @reg_id: register that you want to check if this instruction modified it.
    629 
    630  @return: true if this instruction indeed implicitly modified aboved register, or false otherwise.
    631 */
    632 CAPSTONE_EXPORT
    633 bool CAPSTONE_API cs_reg_write(csh handle, const cs_insn *insn, unsigned int reg_id);
    634 
    635 /*
    636  Count the number of operands of a given type.
    637  Find the operand type in header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...)
    638 
    639  NOTE: this API is only valid when detail option is ON (which is OFF by default)
    640 
    641  @handle: handle returned by cs_open()
    642  @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter()
    643  @op_type: Operand type to be found.
    644 
    645  @return: number of operands of given type @op_type in instruction @insn,
    646  or -1 on failure.
    647 */
    648 CAPSTONE_EXPORT
    649 int CAPSTONE_API cs_op_count(csh handle, const cs_insn *insn, unsigned int op_type);
    650 
    651 /*
    652  Retrieve the position of operand of given type in <arch>.operands[] array.
    653  Later, the operand can be accessed using the returned position.
    654  Find the operand type in header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...)
    655 
    656  NOTE: this API is only valid when detail option is ON (which is OFF by default)
    657 
    658  @handle: handle returned by cs_open()
    659  @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter()
    660  @op_type: Operand type to be found.
    661  @position: position of the operand to be found. This must be in the range
    662 			[1, cs_op_count(handle, insn, op_type)]
    663 
    664  @return: index of operand of given type @op_type in <arch>.operands[] array
    665  in instruction @insn, or -1 on failure.
    666 */
    667 CAPSTONE_EXPORT
    668 int CAPSTONE_API cs_op_index(csh handle, const cs_insn *insn, unsigned int op_type,
    669 		unsigned int position);
    670 
    671 #ifdef __cplusplus
    672 }
    673 #endif
    674 
    675 #endif
    676