The following functions allow you to set/get common parameters.
Please note that not all parameters can be set directly.
long get_inf_attr(long attr);
success set_inf_attr(long attr, long value);
// Set or clear bits in parameter
// attr - same as for get_inf_attr()/set_inf_attr() functions
// bits - bit mask
// on - boolean value, set or clear bits
// Convenience function
void set_flag(long attr, long bits, long on);
// 'attr' may be one of the following:
#define INF_VERSION 0 // ushort; Version of database
#define INF_PROCNAME 1 // char[16];Name of current processor
#define INF_GENFLAGS 2 // ushort; General flags:
#define INFFL_AUTO 0x01 // Autoanalysis is enabled?
#define INFFL_ALLASM 0x02 // May use constructs not supported by
// the target assembler
#define INFFL_LOADIDC 0x04 // Loading an idc file that contains database info
#define INFFL_NOUSER 0x08 // do not store user info in the database
#define INFFL_READONLY 0x10 // (internal) temporary interdiction to modify the database
#define INFFL_CHKOPS 0x20 // check manual operands? (unused)
#define INFFL_NMOPS 0x40 // allow non-matched operands? (unused)
#define INFFL_GRAPH_VIEW 0x80 // currently using graph options (\dto{graph})
#define INF_LFLAGS 3 // uint32 IDP-dependent flags
#define LFLG_PC_FPP 0x00000001 // decode floating point
// processor instructions?
#define LFLG_PC_FLAT 0x00000002 // Flat model?
#define LFLG_64BIT 0x00000004 // 64-bit program?
#define LFLG_IS_DLL 0x00000008 // is dynamic library?
#define LFLG_FLAT_OFF32 0x00000010 // treat REF_OFF32 as 32-bit offset for 16bit segments (otherwise try SEG16:OFF16)
#define LFLG_MSF 0x00000020 // byte order: is MSB first?
#define LFLG_WIDE_HBF 0x00000040 // bit order of wide bytes: high byte first?
#define LFLG_DBG_NOPATH 0x00000080 // do not store input full path
#define LFLG_SNAPSHOT 0x00000100 // is memory snapshot?
#define LFLG_PACK 0x00000200 // pack the database?
#define LFLG_COMPRESS 0x00000400 // compress the database?
#define LFLG_KERNMODE 0x00000800 // is kernel mode binary?
#define INF_DATABASE_CHANGE_COUNT 4 // uint32; database change counter; keeps track of byte and segment modifications
#define INF_FILETYPE 5 // ushort; type of input file (see ida.hpp)
#define FT_EXE_OLD 0 // MS DOS EXE File (obsolete)
#define FT_COM_OLD 1 // MS DOS COM File (obsolete)
#define FT_BIN 2 // Binary File
#define FT_DRV 3 // MS DOS Driver
#define FT_WIN 4 // New Executable (NE)
#define FT_HEX 5 // Intel Hex Object File
#define FT_MEX 6 // MOS Technology Hex Object File
#define FT_LX 7 // Linear Executable (LX)
#define FT_LE 8 // Linear Executable (LE)
#define FT_NLM 9 // Netware Loadable Module (NLM)
#define FT_COFF 10 // Common Object File Format (COFF)
#define FT_PE 11 // Portable Executable (PE)
#define FT_OMF 12 // Object Module Format
#define FT_SREC 13 // R-records
#define FT_ZIP 14 // ZIP file (this file is never loaded to IDA database)
#define FT_OMFLIB 15 // Library of OMF Modules
#define FT_AR 16 // ar library
#define FT_LOADER 17 // file is loaded using LOADER DLL
#define FT_ELF 18 // Executable and Linkable Format (ELF)
#define FT_W32RUN 19 // Watcom DOS32 Extender (W32RUN)
#define FT_AOUT 20 // Linux a.out (AOUT)
#define FT_PRC 21 // PalmPilot program file
#define FT_EXE 22 // MS DOS EXE File
#define FT_COM 23 // MS DOS COM File
#define FT_AIXAR 24 // AIX ar library
#define FT_MACHO 25 // Mac OS X Mach-O file
#define INF_OSTYPE 6 // ushort; FLIRT: OS type the program is for
#define OSTYPE_MSDOS 0x0001
#define OSTYPE_WIN 0x0002
#define OSTYPE_OS2 0x0004
#define OSTYPE_NETW 0x0008
#define INF_APPTYPE 7 // ushort; FLIRT: Application type
#define APPT_CONSOLE 0x0001 // console
#define APPT_GRAPHIC 0x0002 // graphics
#define APPT_PROGRAM 0x0004 // EXE
#define APPT_LIBRARY 0x0008 // DLL
#define APPT_DRIVER 0x0010 // DRIVER
#define APPT_1THREAD 0x0020 // Singlethread
#define APPT_MTHREAD 0x0040 // Multithread
#define APPT_16BIT 0x0080 // 16 bit application
#define APPT_32BIT 0x0100 // 32 bit application
#define INF_ASMTYPE 8 // uchar; target assembler number (0..n)
#define INF_SPECSEGS 9 // uchar; What format do special segments use? 0-unspecified, 4-entries are 4 bytes, 8- entries are 8 bytes
// program execution
#define INF_AF 10 // uint32; Analysis flags:
#define AF_CODE 0x00000001 // Trace execution flow
#define AF_MARKCODE 0x00000002 // Mark typical code sequences as code
#define AF_JUMPTBL 0x00000004 // Locate and create jump tables
#define AF_PURDAT 0x00000008 // Control flow to data segment is ignored
#define AF_USED 0x00000010 // Analyze and create all xrefs
#define AF_UNK 0x00000020 // Delete instructions with no xrefs
#define AF_PROCPTR 0x00000040 // Create function if data xref data->code32 exists
#define AF_PROC 0x00000080 // Create functions if call is present
#define AF_FTAIL 0x00000100 // Create function tails
#define AF_LVAR 0x00000200 // Create stack variables
#define AF_STKARG 0x00000400 // Propagate stack argument information
#define AF_REGARG 0x00000800 // Propagate register argument information
#define AF_TRACE 0x00001000 // Trace stack pointer
#define AF_VERSP 0x00002000 // Perform full SP-analysis. (\ph{verify_sp})
#define AF_ANORET 0x00004000 // Perform 'no-return' analysis
#define AF_MEMFUNC 0x00008000 // Try to guess member function types
#define AF_TRFUNC 0x00010000 // Truncate functions upon code deletion
#define AF_STRLIT 0x00020000 // Create string literal if data xref exists
#define AF_CHKUNI 0x00040000 // Check for unicode strings
#define AF_FIXUP 0x00080000 // Create offsets and segments using fixup info
#define AF_DREFOFF 0x00100000 // Create offset if data xref to seg32 exists
#define AF_IMMOFF 0x00200000 // Convert 32bit instruction operand to offset
#define AF_DATOFF 0x00400000 // Automatically convert data to offsets
#define AF_FLIRT 0x00800000 // Use flirt signatures
#define AF_SIGCMT 0x01000000 // Append a signature name comment for recognized anonymous library functions
#define AF_SIGMLT 0x02000000 // Allow recognition of several copies of the same function
#define AF_HFLIRT 0x04000000 // Automatically hide library functions
#define AF_JFUNC 0x08000000 // Rename jump functions as j_...
#define AF_NULLSUB 0x10000000 // Rename empty functions as nullsub_...
#define AF_DODATA 0x20000000 // Coagulate data segs at the final pass
#define AF_DOCODE 0x40000000 // Coagulate code segs at the final pass
#define AF_FINAL 0x80000000 // Final pass of analysis
#define INF_AF2 11 // uint32; Analysis flags 2
#define AF2_DOEH 0x00000001 // Handle EH information
#define AF2_DORTTI 0x00000002 // Handle RTTI information
#define AF2_MACRO 0x00000004 // Try to combine several instructions into a macro instruction
#define INF_BASEADDR 12 // uval_t; base paragraph of the program
#define INF_START_SS 13 // sel_t; value of SS at the start
#define INF_START_CS 14 // sel_t; value of CS at the start
#define INF_START_IP 15 // ea_t; IP register value at the start of
#define INF_START_EA 16 // ea_t; Linear address of program entry point
#define INF_START_SP 17 // ea_t; SP register value at the start of
#define INF_MAIN 18 // ea_t; address of main()
#define INF_MIN_EA 19 // ea_t; The lowest address used
// in the program
#define INF_MAX_EA 20 // ea_t; The highest address used
// in the program - 1
#define INF_OMIN_EA 21 // ea_t;
#define INF_OMAX_EA 22 // ea_t;
#define INF_LOWOFF 23 // ea_t; low limit of voids
#define INF_HIGHOFF 24 // ea_t; high limit of voids
#define INF_MAXREF 25 // uval_t; max xref depth
#define INF_PRIVRANGE_START_EA 27 // ea_t; Range of addresses reserved for internal use.
#define INF_PRIVRANGE_END_EA 28 // ea_t; Initially specified by cfgvar PRIVRANGE
#define INF_NETDELTA 29 // sval_t; Delta value to be added to all addresses for mapping to netnodes.
// Initially 0.
// CROSS REFERENCES
#define INF_XREFNUM 30 // uchar; Number of references to generate
// 0 - xrefs won't be generated at all
#define INF_TYPE_XREFNUM 31 // uchar; Number of references to generate
// in the struct & enum windows
// 0 - xrefs won't be generated at all
#define INF_REFCMTNUM 32 // uchar; number of comment lines to
// generate for refs to ASCII
// string or demangled name
// 0 - such comments won't be
// generated at all
#define INF_XREFFLAG 33 // uchar; xrefs representation:
#define SW_SEGXRF 0x01 // show segments in xrefs?
#define SW_XRFMRK 0x02 // show xref type marks?
#define SW_XRFFNC 0x04 // show function offsets?
#define SW_XRFVAL 0x08 // show xref values? (otherwise-"...")
// NAMES
#define INF_MAX_AUTONAME_LEN 34 // ushort; max autogenerated name length (without zero byte)
#define INF_NAMETYPE 34 // char; dummy names representation type
#define NM_REL_OFF 0
#define NM_PTR_OFF 1
#define NM_NAM_OFF 2
#define NM_REL_EA 3
#define NM_PTR_EA 4
#define NM_NAM_EA 5
#define NM_EA 6
#define NM_EA4 7
#define NM_EA8 8
#define NM_SHORT 9
#define NM_SERIAL 10
#define INF_SHORT_DEMNAMES 36 // uint32; short form of demangled names
#define INF_LONG_DEMNAMES 37 // uint32; long form of demangled names
// see demangle.h for definitions
#define INF_DEMNAMES 38 // uchar; display demangled names as:
#define DEMNAM_CMNT 0 // comments
#define DEMNAM_NAME 1 // regular names
#define DEMNAM_NONE 2 // don't display
#define DEMNAM_GCC3 4 // assume gcc3 names (valid for gnu compiler)
#define DEMNAM_FIRST 8 // override type info
#define INF_LISTNAMES 39 // uchar; What names should be included in the list?
#define LN_NORMAL 0x01 // normal names
#define LN_PUBLIC 0x02 // public names
#define LN_AUTO 0x04 // autogenerated names
#define LN_WEAK 0x08 // weak names
// DISASSEMBLY LISTING DETAILS
#define INF_INDENT 40 // uchar; Indention for instructions
#define INF_CMT_INDENT 41 // uchar; Indention for comments
#define INF_MARGIN 42 // ushort; max length of data lines
#define INF_LENXREF 43 // ushort; max length of line with xrefs
#define INF_OUTFLAGS 44 // uint32; output flags
#define OFLG_SHOW_VOID 0x0002 // Display void marks?
#define OFLG_SHOW_AUTO 0x0004 // Display autoanalysis indicator?
#define OFLG_GEN_NULL 0x0010 // Generate empty lines?
#define OFLG_SHOW_PREF 0x0020 // Show line prefixes?
#define OFLG_PREF_SEG 0x0040 // line prefixes with segment name?
#define OFLG_LZERO 0x0080 // generate leading zeroes in numbers
#define OFLG_GEN_ORG 0x0100 // Generate 'org' directives?
#define OFLG_GEN_ASSUME 0x0200 // Generate 'assume' directives?
#define OFLG_GEN_TRYBLKS 0x0400 // Generate try/catch directives?
#define INF_CMTFLG 45 // uchar; comments:
#define SCF_RPTCMT 0x01 // show repeatable comments?
#define SCF_ALLCMT 0x02 // comment all lines?
#define SCF_NOCMT 0x04 // no comments at all
#define SCF_LINNUM 0x08 // show source line numbers
#define SCF_TESTMODE 0x10 // testida.idc is running
#define SCF_SHHID_ITEM 0x20 // show hidden instructions
#define SCF_SHHID_FUNC 0x40 // show hidden functions
#define SCF_SHHID_SEGM 0x80 // show hidden segments
#define INF_LIMITER 46 // uchar; Generate borders?
#define INF_BIN_PREFIX_SIZE 47 // short; # of instruction bytes to show
// in line prefix
#define INF_PREFFLAG 48 // uchar; line prefix type:
#define PREF_SEGADR 0x01 // show segment addresses?
#define PREF_FNCOFF 0x02 // show function offsets?
#define PREF_STACK 0x04 // show stack pointer?
#define PREF_PFXTRUNC 0x08 // truncate instruction bytes if they would need more than 1 line
// STRING LITERALS
#define INF_STRLIT_FLAGS 49 // uchar; string literal flags
#define STRF_GEN 0x01 // generate names?
#define STRF_AUTO 0x02 // names have 'autogenerated' bit?
#define STRF_SERIAL 0x04 // generate serial names?
#define STRF_COMMENT 0x10 // generate auto comment for string references?
#define STRF_SAVECASE 0x20 // preserve case of strings for identifiers
#define INF_STRLIT_BREAK 50 // uchar; string literal line break symbol
#define INF_STRLIT_ZEROES 51 // char; leading zeroes
#define INF_STRTYPE 52 // int32; current ascii string type
// is considered as several bytes:
// low byte:
// Number of bytes per "units" in a string.
#define STRWIDTH_1B 0
#define STRWIDTH_2B 1
#define STRWIDTH_4B 2
#define STRWIDTH_MASK 0x03
// The string layout; how the string is laid out in data.
#define STRLYT_TERMCHR 0
#define STRLYT_PASCAL1 1
#define STRLYT_PASCAL2 2
#define STRLYT_PASCAL4 3
#define STRLYT_MASK 0xFC
#define STRLYT_SHIFT 2
#define INF_STRLIT_PREF 53 // char[16];ASCII names prefix
#define INF_STRLIT_SERNUM 54 // uval_t; serial number
// DATA ITEMS
#define INF_DATATYPES 55 // uval_t; data types allowed in data carousel
// COMPILER
#define INF_CC_ID 57 // uchar; compiler
#define COMP_MASK 0x0F // mask to apply to get the pure compiler id
#define COMP_UNK 0x00 // Unknown
#define COMP_MS 0x01 // Visual C++
#define COMP_BC 0x02 // Borland C++
#define COMP_WATCOM 0x03 // Watcom C++
#define COMP_GNU 0x06 // GNU C++
#define COMP_VISAGE 0x07 // Visual Age C++
#define COMP_BP 0x08 // Delphi
#define COMP_UNSURE 0x80 // uncertain compiler id
#define INF_CC_CM 58 // cm_t; memory model & calling convention. see below
#define INF_CC_SIZE_I 59 // uchar; sizeof(int)
#define INF_CC_SIZE_B 60 // uchar; sizeof(bool)
#define INF_CC_SIZE_E 61 // uchar; sizeof(enum)
#define INF_CC_DEFALIGN 62 // uchar; default alignment
#define INF_CC_SIZE_S 63 // uchar;
#define INF_CC_SIZE_L 64 // uchar;
#define INF_CC_SIZE_LL 65 // uchar;
#define INF_CC_SIZE_LDBL 66 // uchar; sizeof(long double)
#define INF_ABIBITS 67 // uint32; ABI features
#define ABI_8ALIGN4 0x00000001 // 4 byte alignment for 8byte scalars (__int64/double) inside structures?
#define ABI_PACK_STKARGS 0x00000002 // do not align stack arguments to stack slots
#define ABI_BIGARG_ALIGN 0x00000004 // use natural type alignment for argument if the alignment exceeds native word size (e.g. __int64 argument should be 8byte aligned on some 32bit platforms)
#define ABI_STACK_LDBL 0x00000008 // long double areuments are passed on stack
#define ABI_STACK_VARARGS 0x00000010 // varargs are always passed on stack (even when there are free registers)
#define ABI_HARD_FLOAT 0x00000020 // use the floating-point register set
#define ABI_SET_BY_USER 0x00000040 // compiler/abi were set by user flag and require SETCOMP_BY_USER flag to be changed
#define ABI_GCC_LAYOUT 0x00000080 // use gcc layout for udts (used for mingw)
#define ABI_MAP_STKARGS 0x00000100 // register arguments are mapped to stack area (and consume stack slots)
#define ABI_HUGEARG_ALIGN 0x00000200 // use natural type alignment for an argument
// even if its alignment exceeds double native word size
// (the default is to use double word max).
// e.g. if this bit is set, __int128 has 16-byte alignment
#define INF_APPCALL_OPTIONS 68 // uint32; appcall options
// Pointer size, memory model, and calling convention are encoded using:
#define CM_MASK 0x03 // Default pointer size:
#define CM_UNKNOWN 0x00 // unknown
#define CM_N8_F16 0x01 // if sizeof(int)<=2: near 1 byte, far 2 bytes
#define CM_N64 0x01 // if sizeof(int)>2: near 8 bytes, far 8 bytes
#define CM_N16_F32 0x02 // near 2 bytes, far 4 bytes
#define CM_N32_F48 0x03 // near 4 bytes, far 6 bytes
#define CM_M_MASK 0x0C // Memory model:
#define CM_M_NN 0x00 // small: code=near, data=near (or unknown if CM_UNKNOWN)
#define CM_M_FF 0x04 // large: code=far, data=far
#define CM_M_NF 0x08 // compact: code=near, data=far
#define CM_M_FN 0x0C // medium: code=far, data=near
#define is_code_far(cm) (((cm) & 4) != 0) // Does the given model specify far code?
#define is_data_far(cm) (((cm) &= CM_M_MASK) && (cm) != CM_M_FN) // Does the given model specify far data?
\defgroup CM_CC_
//@{
#define CM_CC_MASK 0xF0 // Calling convention
#define CM_CC_INVALID 0x00 // this value is invalid
#define CM_CC_UNKNOWN 0x10 // unknown calling convention
#define CM_CC_VOIDARG 0x20 // function without arguments
// if has other cc and argnum == 0,
// represent as f() - unknown list
#define CM_CC_CDECL 0x30 // stack
#define CM_CC_ELLIPSIS 0x40 // cdecl + ellipsis
#define CM_CC_STDCALL 0x50 // stack, purged
#define CM_CC_PASCAL 0x60 // stack, purged, reverse order of args
#define CM_CC_FASTCALL 0x70 // stack, purged (x86), first args are in regs (compiler-dependent)
#define CM_CC_THISCALL 0x80 // stack, purged (x86), first arg is in reg (compiler-dependent)
#define CM_CC_GOLANG 0xB0 // GO: arguments and return value in stack
#define CM_CC_SPECIALE 0xD0 // ::CM_CC_SPECIAL with ellipsis
#define CM_CC_SPECIALP 0xE0 // Equal to ::CM_CC_SPECIAL, but with purged stack.
#define CM_CC_SPECIAL 0xF0 // usercall: locations of all arguments
// and the return value are explicitly specified
// Convenience function to set a flag bit
static set_flag(off, bit, value)
{
auto v = get_inf_attr(off);
v = value ? (bit | v) : (~bit & v);
return set_inf_attr(off, v);
}
// Set/get application bitness
#define inf_set_64bit() set_flag(INF_LFLAGS, LFLG_64BIT, 1)
#define inf_set_32bit() set_flag(INF_LFLAGS, LFLG_PC_FLAT, 1)
#define inf_is_64bit() ((get_inf_attr(INF_LFLAGS) & LFLG_64BIT) != 0)
#define inf_is_32bit_or_higher() ((get_inf_attr(INF_LFLAGS) & LFLG_PC_FLAT) != 0)