home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Mammon_ / ida.txt < prev    next >
Text File  |  2000-05-25  |  158KB  |  4,968 lines

  1.  
  2.  
  3. ===============================================================================
  4.  
  5. Introduction
  6. ------------
  7.  
  8. IDA is an interactive disassembler - it converts a binary executable program
  9. into an assembler text, allowing you to examine internals of the executable,
  10. to reverse engineer it and obtain a source text of the input file.
  11.  
  12. Its most outstanding feature that makes it unique among other disassemblers
  13. is interactivity (as the name implies). With IDA you may examine the input
  14. file and make modifications on the fly, with zero wait time, all your modifi-
  15. cations are instantly displayed on the screen.
  16.  
  17. Another unparalleled aspect of IDA is FLIRT - Fast Library Identification and
  18. Recognition Technology. The disassembler looks at the input file and tries to
  19. find common procedures and properly names and attaches comments to them,
  20. working as an intelligent assistant for you. FLIRT technology saves your
  21. valuable time, taking the routine part of work. It is pretty funny to open a
  22. window with the list of functions and to look how FLIRT gives meaningful names
  23. to the functions and attaches comments to them.
  24.  
  25. Also, IDA is the only disassembler that knows about high level language data
  26. structures like arrays, enumerations and structs. You may use them to make your
  27. disassembly clearer and more understandable. The upcoming version of IDA under-
  28. stands even local variables of procedures.
  29.  
  30. Some key features:
  31.  
  32.      *You may patch the input file and get a patched version of the input file
  33.       (works for some file formats)
  34.      *There is a built-in C like language. It will help you to automate routine
  35.       tasks.
  36.      *IDA is capable to analyse program in the background, in parallel with you.
  37.      *IDA saves the database with the disassembly on the disk: you may continue
  38.       the disassembly later.
  39.      *The autocommenting feature makes the output text clearer.
  40.      *The standard TVision interface will help you to get learn IDA quickly.
  41.       The context sensitive help makes it even more easier. You may open windows
  42.       up to 132x100 characters. Also you can redefine keys and create your own
  43.       keyboard macros.
  44.      *A little but important thing as a built-in calculator is a necessity.
  45.  
  46. And finally, limitations:
  47.  
  48.      Size of input file is limited: 64 megabytes as distributed. If you change
  49.      VPAGESIZE parameter in the configuration file, you will be able to disas-
  50.      semble files up to 256 megabytes. Enough for the moment?
  51.      Number of segments is really unlimited. The only limitation is on the number
  52.      of contiguous memory chunks, it also depends on VPAGESIZE parameter.
  53.      Initially the limit is approximately 340 chunks. Address space available for
  54.      disassembling is 32 bit. There is a small window at 0xFF000000 which is used
  55.      by IDA for the internal housekeeping.
  56.      Number of lines per instruction/data: 500. You can't enter a long comment with
  57.      length more than 4095 characters for one instruction. Length of a short
  58.      comment is 255 characters.
  59.      You may define up to 1024 segment selectors.
  60.  
  61. Arrays
  62. ------
  63. IDA knows about arrays and provides you with one dimensional arrays of any
  64. elements. IDA can create simple arrays automatically.
  65.  
  66. To create an array, use '*' (asterisk) key. For example, you need to create
  67. array of double-bytes. The following actions will do the job:
  68.  
  69.    1.Define the first element of array
  70.    2.Press '*'
  71.    3.Specify size of array (and possibly other array attributes) and press
  72.    the Enter key.
  73.  
  74. That's all - the array is created.
  75. To create an array of structures, define a structure first.
  76.  
  77. Enumeration
  78. -----------
  79. IDA is able to represent constants as symbolic names. All what you need to do
  80. is to create a collection of symbolic names and specify representation of an
  81. operand as a "enumeration".
  82.  
  83. For example:
  84.  
  85.         mov     ax, 4C00h
  86.         int     21h
  87.  
  88. may be represented as
  89.  
  90.         ExitFunc = 4C00h
  91.         DosFunc  = 21h
  92.  
  93.         ....
  94.  
  95.         mov     ax, ExitFunc
  96.         int     DosFunc
  97.  
  98. Structures
  99. ----------
  100. IDA knows about structured types and provides you with means to define and
  101. use them. You need first to create a structure type and after define instances
  102. of structured types. Also, you may use pointers to structures.
  103.  
  104. For example:
  105.  
  106.         les     bx, [bp+4]
  107.         mov     ax, [bx+2]
  108.  
  109. may be represented as
  110.  
  111. mystr   struc
  112. name    dw      ?
  113. pointer dw      ?
  114. mystr   ends
  115.  
  116.         ...
  117.  
  118.         les     bx, [bp+arg0]
  119.         mov     ax, [bx+mystr.pointer]
  120.  
  121.  
  122. Autocommenting
  123. --------------
  124. Auto-Commenting is a nifty feature that you expect from any debugger. IDA Pro
  125. is very capable at auto-commenting. Below are a few samples of the auto-
  126. commenting ability of IDA. And if that isn't enough to make you happy, it is
  127. possible to define your own comments databases !
  128.  
  129. Windows, Windows NT, Windows 95 auto-commenting
  130.  
  131. Here is a small WIN 3.1 VxD fragment, as it is disassembled and commented by IDA
  132.  
  133.  
  134.  
  135. 000004C1                 push    eax
  136. 000004C2                 push    ebx
  137. 000004C3                 push    ecx
  138. 000004C4                 push    edx
  139. 000004C5                 mov     eax, 0
  140. 000004CA                 VxDcall VDD_Msg_ClrScrn
  141. 000004D0                 mov     eax, 8
  142. 000004D5                 VxDcall VDD_Msg_BakColor
  143. 000004DB                 mov     eax, 1Eh
  144. 000004E0                 VxDcall VDD_Msg_ForColor
  145. 000004E6                 mov     eax, 1Ah
  146. 000004EB                 mov     edx, 1
  147. 000004F0                 VxDcall VDD_Msg_SetCursPos
  148. 000004F6                 mov     ebx, large ds:18F2h
  149.  
  150.  
  151. OS/2 1.3, 2.1 and Warp auto-commenting
  152.  
  153. Of course, OS2 programs are also auto-commented. Here is a part taken from
  154. the disassembly of a 32-bit OS/2 program.
  155.  
  156.  
  157.  
  158. 00010949                 call    DosSetExceptionHandler
  159. 0001094E                 mov     eax, offset CPPOS30__matherr
  160. 00010953                 call    CPPOS30__exception_procinit
  161. 00010958                 mov     eax, [esp+20h]
  162. 0001095C                 call    sub_109E4
  163. 00010961                 push    109ACh
  164. 00010966                 push    0FF01h
  165. 0001096B                 call    DosExitList
  166. 00010970                 call    sub_109DC
  167. 00010975                 push    10000h
  168. 0001097A                 mov     ecx, large dword ptr ds:CPPOS30__environ
  169. 00010980                 sub     esp, 0Ch
  170. 00010983                 mov     edx, dword_203AC
  171. 00010989                 mov     eax, dword_203A8
  172. 0001098E                 call    CPPOS30__callback_opt_sys
  173. 00010993                 call    CPPOS30_exit
  174. 00010998                 lea     ecx, [esp+20h]
  175. 0001099C                 push    ecx
  176. 0001099D                 call    DosUnsetExceptionHandler
  177. 000109A2                 add     esp, 2Ch
  178.  
  179. DOS auto-commenting
  180.  
  181. DOS Programs are a piece of cake with that level of information.
  182.  
  183.  
  184.  
  185. seg000:09D2 loc_0_9D2:                              ; CODE XREF: start+8CCj
  186. seg000:09D2                 mov     al, 0
  187. seg000:09D4                 mov     dx, 194Fh
  188. seg000:09D7                 xor     cx, cx
  189. seg000:09D9                 mov     bh, 7
  190. seg000:09DB                 mov     ah, 6
  191. seg000:09DD                 int     10h             ; - VIDEO - SCROLL PAGE UP
  192. seg000:09DD                                         ; AL = number of lines to scroll window (0 = blank whole window)
  193. seg000:09DD                                         ; BH = attributes to be used on blanked lines
  194. seg000:09DD                                         ; CH,CL = row,column of upper left corner of window to scroll
  195. seg000:09DD                                         ; DH,DL = row,column of lower right corner of window
  196. seg000:09DF                 xor     dx, dx
  197. seg000:09E1                 mov     word_0_15F, dx
  198. seg000:09E5                 mov     ah, 2
  199. seg000:09E7                 xor     bh, bh
  200. seg000:09E9                 int     10h             ; - VIDEO - SET CURSOR POSITION
  201. seg000:09E9                                         ; DH,DL = row, column (0,0 = upper left)
  202. seg000:09E9                                         ; BH = page number
  203. seg000:09EB                 mov     di, 546h
  204. seg000:09EE                 call    off_0_16C
  205. seg000:09F2                 mov     di, 4B4h
  206. seg000:09F5                 call    off_0_16C
  207. seg000:09F9                 mov     di, 54Ah
  208. seg000:09FC                 call    off_0_16C
  209. seg000:0A00                 call    off_0_16E
  210. seg000:0A04                 mov     ax, 4C00h
  211. seg000:0A07                 int     21h             ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT)
  212. seg000:0A07                                         ; AL = exit code
  213.  
  214.  
  215. Input File Types
  216. -----------------
  217. EXE
  218.      MS DOS plain executable file
  219.  
  220. COM
  221.      MS DOS .com file
  222.  
  223. SYS or DRV
  224.      MS DOS Driver
  225.  
  226. NE
  227.      New Executable Format. This format is used in MS Windows 3.x and OS/2 files.
  228.  
  229. LX
  230.      Linear Executable Format. This format is used in OS/2 2.x and OS/2 Warp.
  231.  
  232. LE
  233.      Linear Executable Format. This format is used in MS Windows VxD files.
  234.  
  235. PE
  236.      Portable Executable Format. This format is used in MS Windows 95 and MS Windows NT.
  237.  
  238. OMF
  239.      Intel Object Module Format. This format is used in MS DOS, MS Windows 3.x and OS/2 object files.
  240.  
  241. LIB
  242.      Library of Object Files. This format is used in MS DOS, MS Windows 3.x and OS/2.
  243.  
  244. AR
  245.      Library of Object Files. UNIX, MS Windows95 and MS Windows NT Library files.
  246.  
  247. COFF
  248.      Common Object File Format. This format is widely used in UNIX world. For example, SCO UNIX,
  249.      DGJPP, GNU32 executable and object files have this format.
  250.  
  251. Intel Hex Object Format
  252.      This format is used to keep image files for microprocessors. Don't confuse it with OMF!
  253.  
  254. MOS Technology Hex Object Format
  255.      This format is used to keep image files for microprocessors.
  256.  
  257. S-record Format
  258.      This format is used to keep image files for microprocessors.
  259.  
  260. Overlayed EXE
  261.      Borland C overlayed files. Overlayed part of the program is kept together with the non-overlayed part in
  262.      one executable file.
  263.  
  264. Borland Pascal Overlays
  265.      Borland Pascal Overlayed files. Overlays are kept in a separate file.
  266.  
  267. NLM
  268.      Novell Netware 3.x, 4.x Loadable Modules. IDA understands compressed modules too.
  269.  
  270. ZIP
  271.      Archive files. Of course, IDA doesn't disassemble ZIP files (there is nothing to disassemble), it can just
  272.      fetch a file from the archive.
  273.  
  274. JAVA
  275.      Java classes
  276.  
  277. BIN
  278.      Binary. Any unformatted file.
  279.  
  280. This list of not exhaustive and never will be, there are two reasons why:
  281.  
  282.    1.New input file formats are constantly added to the list. The upcoming version is likely to support ELF format - a
  283.      new de-facto standard for UNIX executables. Linux uses ELF format, for example.
  284.    2.Any user can write a DLL module to load any new format. We already have a module to load Watcom's platform
  285.      independent executables.
  286.  
  287. Output File Types
  288. -----------------
  289. IDA can create the following files
  290.  
  291.      ASM (output source code)
  292.      LST (output source code)
  293.      MAP (output MAP file for debugging)
  294.      MS DOS EXE, COM (eventually patched input file)
  295.      BIN (patched input file)
  296.      IDC (IDC program to recreate IDA database)
  297.  
  298. Supported Processors
  299. --------------------
  300. List of supported processors
  301.  
  302.      Intel 8080/85
  303.      Z80, HD 64180
  304.      Intel 8086/87
  305.      Intel 80286/287 real & protected modes
  306.      Intel 80386/387 real & protected modes
  307.      Intel 80486/487 real & protected modes
  308.      Intel Pentium real & protected modes
  309.      Intel Pentium MMX real & protected modes
  310.      Intel Pentium Pro real & protected modes
  311.      Intel 860 XR, 860 XP (alpha!)
  312.      Intel 8051 series
  313.      MOS Technologies 6502
  314.      DEC PDP-11
  315.      Motorola MC68000
  316.      Motorola MC68010
  317.      Motorola MC68020
  318.      Motorola MC68030
  319.      Motorola MC68040
  320.      Motorola CPU32 (68330)
  321.      Motorola MC68020 with MC68882
  322.      Motorola MC68020 with MC68851
  323.      Motorola MC68020 with MC68882 and MC68851
  324.  
  325. IDA is capable to disassemble Java classes.
  326.  
  327. Due to modular structure of IDA is it possible to write a module to disassemble files for new processors. The users of
  328. IDA have created such modules.
  329.  
  330.  
  331.  
  332. ===============================================================================
  333.                          Section II : FLIRT
  334. ===============================================================================
  335. FLIRT - Fast Library Identification and Recognition Technology
  336.  
  337.    1.The goal
  338.    2.Difficulties
  339.    3.The idea
  340.    4.Implementation
  341.    5.Results
  342.  
  343. The goal
  344.  
  345. Disassembling of modern high level language programs requires a lot of time to determine library functions. This time may
  346. be considered lost because meanwhile we do not receive new knowledge and only facilitate further analysis of the
  347. program and algorithms containing in the program. It's a pity that such determination is necessary for every new
  348. disassembled program.
  349.  
  350. Sometimes of analysis of a program is considerably eased by knowing 'class' of a library function, it helps to sieve out
  351. uninteresting functions. For example, a function that works with streams in C++ usually has nothing to do with an
  352. algorithm of a function.
  353.  
  354. On the other hand every high level language program uses a great quantity of standard library functions and sometimes
  355. programs contain up to 95% standard functions. For example well-known program "Hello, world!" contains:
  356.  
  357.         library functions       -       58
  358.         function main()         -       1
  359.  
  360. Naturally it's a trivial program but usually the library functions constitute about a half (50%) of the program code. It's the
  361. reason a user of a disassembler is forced to waste more than a half of time to determine the library functions. The matter
  362. is that a process of analysis of the program resembles a process of solution of crossword puzzles: the more letters we
  363. know the easier is to guess the next word and in disassembling the more comments and meaningful names in a function
  364. are the quicker we understand what this function is. Wide usage of the standard libraries such as OWL, MFC and others
  365. increase contribution of the standard functions in the program yet more. A middle sized program for Win32, written on
  366. C++ using modern technologies (e.g., AppExpert and similar wizards) calls 1000-2500 library functions.
  367.  
  368. To enable a lot :) of an IDA user we tried to create an algorithm of recognition of the standard library functions. To
  369. achieve a real usable result we agreed about the following:
  370.  
  371.      we consider the C(C++) language programs
  372.      we have no such goal to recognize 100% of functions. It's impossible theoretically and moreover a recognition of
  373.      certain functions may lead to undesirable consequences. For example it's unreasonable to recognize function:
  374.  
  375.  
  376.                      push    bp
  377.                      mov     bp, sp
  378.                      xor     ax, ax
  379.                      pop     bp
  380.                      ret
  381.  
  382.      because a probability of wrong recognition is very high (it's curiously but in modern C++ libraries there are a lot of
  383.      such functions that are absolutely identical byte- to-byte but have different names).
  384.      we recognize and give the names to functions only (code segment), ignoring the data (data segment).
  385.      if we recognize a function successfully we assign a name and/or comment the function. We have no aim to get an
  386.      information about the types of function arguments, about the behavior of the function and what it does.
  387.      a percentage of wrong recognized functions must be minimal. We consider a wrong recognized function is worse
  388.      than not recognized one so an ideal situation is when there are no wrong recognized functions at all.
  389.      the recognition of the functions must require a minimum of processor and memory resources.
  390.      an algorithm must be platform-independent, i.e. it must work with the programs compiled for any processor.
  391.      when it's possible we search for and locate a main() function and position the cursor at it, because a startup-code
  392.      taken from a library is not interesting.
  393.  
  394. Difficulties
  395.  
  396. The main difficulty is the quantity of the functions and memory they occupy. If we calculate memory occupied by all
  397. _versions_ of all libraries produced by all compiler _vendors_ for memory _models_, we easily achieve tens of
  398. gigabytes. And if we take into account OWL, MFC, MFC and similar libraries, then the required disk space is as high
  399. as the sky. For the time being users of personal systems cannot afford to set aside so huge disk space for a simple utility
  400. disassembler, so we need to design some algorithm to diminish volume of information required to recognize standard
  401. library functions. Also, quantity of functions dictates the necessity of efficient recognition algorithm. Simple brute-force
  402. search is not acceptable.
  403.  
  404. The next difficulty is the presence of _variant_ bytes in the program. The variant bytes are non-constant bytes in the
  405. program. Some bytes of a program corrected (fixed up) at the loading time. Some others become constants at linking
  406. time. Mainly the variant bytes are originate from references to external names. In this case the compiler does not know
  407. addresses of called functions and leaves these bytes equal to zeroes and writes so called "fixup information" to the output
  408. file (sometimes this table is called "relocation table", "relocation information"). For example, an excerpt of an assembler
  409. program listing
  410.  
  411. B8 0000s                               mov     ax, seg _OVRGROUP_
  412. 9A 00000000se                          call    _farmalloc
  413. 26: 3B 1E 0000e                        cmp     bx, word ptr es:__ovrbuffer
  414.  
  415. contains variant bytes. The linker will try to resolve external references, replacing zeroes with addresses of called
  416. functions, but some bytes are left untouched, for example references to dynamic libraries and bytes containing absolute
  417. address in the program. These references can be resolved only at the loading time. This is done by a special part of an
  418. operating system - system loader. It will try to resolve all external references and replace zeroes with absolute addresses.
  419. If even a system loader cannot resolve an external reference (i.e. the program refers to an unknown DLL or name), the
  420. program will not run.
  421.  
  422. Also, some linkers count themselves authorized to change bytes without fixup information (non-variant bytes). They
  423. modify object code, making it faster. For example:
  424.  
  425.  
  426.                 0000: 9A........        call    far ptr xxx
  427.  
  428. is replaced by
  429.  
  430.                 0000: 90                nop
  431.                 0001: 0E                push    cs
  432.                 0002: E8....            call    near ptr xxx
  433.  
  434. Naturally, the program will run as it ran before, without this modification, but the replacement made by the linker
  435. effectively prohibits byte-to-byte comparison bytes of the program with templates.
  436.  
  437. The presence of variant bytes in a program makes it impossible to use checksums for recognition. If functions would not
  438. contain variant bytes, it would be enough to calculate checksum (CRC, for example) of first N bytes and select a group
  439. of functions by a hash-table. It would greatly decrease the size of information required for recognition: name of a
  440. function, its length and checksum would suffice.
  441.  
  442. I have already told that it is impossible to recognize all standard library functions. There are functions that are identical
  443. byte-to-byte, doing the same but they are called differently. For example, functions strcmp() and fstrcmp() are identical
  444. in large memory models. On the one hand, we do not want to throw away these functions because they are not trivial
  445. and recognition would help the user, but we cannot distinguish them.
  446.  
  447. Another kind of difficulty for recognition are functions like
  448.  
  449.                 call    xxx
  450.                 ret
  451.  
  452. or
  453.  
  454.                 jmp     xxx
  455.  
  456. At first sight these functions are trivial and uninteresting, but you will be surprised if you learn how many such functions
  457. exist in the libraries. For example, libraries from BCC OS/2 v1.5 contain 20 such functions including functions like
  458. read(), write(), etc. Plain comparison of these functions gives nothing. In any library we can find dozens of functions
  459. distinguishable only by the functions they call.
  460.  
  461. Generally, all short functions (consisting merely of 2-3 instructions) are difficult to recognize - probability of wrong
  462. recognition is very high. At the same time leaving them unrecognized is undesirable - for example, if we do not recognize
  463. tolower() function, we may fail to recognize strlwr() which refers to tolower().
  464.  
  465. The last, but very important difficulty is copyright issues. We cannot distribute standard libraries so we should use
  466. checksums, etc.
  467.  
  468. The idea
  469.  
  470. The idea is simple: let's create a database of all functions from all libraries of all vendors and check each byte of the
  471. program being disassembled whether a standard function can be started at it.
  472.  
  473. All information required for the recognition is kept in a signature file. Each function is represented by a pattern. Pattern
  474. is first 32 bytes of a function with all variant bytes marked. For example:
  475.  
  476. 558BEC0EFF7604..........59595DC3558BEC0EFF7604..........59595DC3 _registerbgidriver
  477. 558BEC1E078A66048A460E8B5E108B4E0AD1E9D1E980E1C0024E0C8A6E0A8A76 _biosdisk
  478. 558BEC1EB41AC55604CD211F5DC3.................................... _setdta
  479. 558BEC1EB42FCD210653B41A8B5606CD21B44E8B4E088B5604CD219C5993B41A _findfirst
  480.  
  481. here variant bytes are displayed as ".."
  482.  
  483. We see that many functions start with the same byte. Therefore we build the following tree:
  484.  
  485. 558BEC
  486.       0EFF7604..........59595DC3558BEC0EFF7604..........59595DC3 _registerbgidriver
  487.       1E
  488.         078A66048A460E8B5E108B4E0AD1E9D1E980E1C0024E0C8A6E0A8A76 _biosdisk
  489.       B4
  490.         1AC55604CD211F5DC3                                       _setdta
  491.         2FCD210653B41A8B5606CD21B44E8B4E088B5604CD219C5993B41A   _findfirst
  492.  
  493. (This tree is built from the above patterns). In the nodes of the tree we keep sequences of bytes. In this example root of
  494. the tree contains sequence "558BEC", three subtrees stem from the root, starting with bytes 0E, 1E, B4 accordingly.
  495. Subtree starting with B4 in its turn refers to two subtree. Each subtree ends with leaves. In a leaf we keep information
  496. about a function (only name of a function is depicted here).
  497.  
  498. Building the tree allows to achieve two goals at the same time:
  499.  
  500.      we decrease memory requirements by keeping bytes that are common for more than one function, in tree nodes.
  501.      Also, the more function with the same starting sequence the more memory we save.
  502.      we can use the tree for fast pattern matching - the number of comparisons required to match place of a program
  503.      with all functions in a signature file depends logarithmically on the number of functions.
  504.  
  505. It would be at least irresponsible to take a decision based on the first 32 bytes of a function. Besides in real-world
  506. libraries one can find lots of functions starting with the same bytes:
  507.  
  508. 558BEC
  509.       56
  510.         1E
  511.           B8....8ED8
  512.                    33C050FF7608FF7606..........83C406
  513.                                                       8BF083FEFF
  514.                     0. _chmod   (20 5F33)
  515.                     1. _access  (18 9A62)
  516.  
  517. To all appearance, these functions differ somewhere after the first 32 bytes and have the same first 32 bytes. That's the
  518. reason why they are attached to one leaf of the tree. In this case we calculate CRC16 (16 bit cyclic redundancy
  519. checksum) of bytes starting from position 33 till the first variant byte and save it in the signature file. We need to save the
  520. number of bytes used to calculate CRC16 because it differs from function to function. In the above example CRC16 is
  521. calculated using 20 bytes for function _chmod (bytes 33..52). For function _access we have used 18 bytes.
  522.  
  523. There is a possibility that the first variant byte will be at 33d position and length of sequence of bytes to calculate CRC16
  524. may be equal to zero. However, practice shows that this happens rarely and the algorithm gives very low number of false
  525. recognitions, but it happens sometimes.
  526.  
  527. There are functions having the same pattern and the same CRC16 (possibly because of too few bytes used to calculate
  528. CRC16). Example:
  529.  
  530. ... (partial tree is shown here)
  531. 05B8FFFFEB278A4606B4008BD8B8....8EC0
  532.           0. _tolower (03 41CB) (000C:00)
  533.           1. _toupper (03 41CB) (000C:FF)
  534.  
  535. We were unlucky: only 3 bytes were used to calculate CRC16 and is was the same for both functions. In this case we
  536. try to find a position at which all functions in a leaf have different bytes. (in our example this position is 32+3+000C)
  537.  
  538. Even this method does not allow to recognize all function. Here is an example:
  539.  
  540. ... (partial tree is shown here)
  541.                 0D8A049850E8....83C402880446803C0075EE8BC7:
  542.                   0. _strupr (04 D19F) (REF 0011: _toupper)
  543.                   1. _strlwr (04 D19F) (REF 0011: _tolower)
  544.  
  545. These functions are identical at non-variant bytes and differ only by the functions they call. In this example the only way
  546. to distinguish functions is to examine name referenced from an instruction at offset 11.
  547.  
  548. The last method has a disadvantage: proper recognition of functions _strupr() and _strlwr() depends on recognition of
  549. functions _toupper() and _tolower(). It means that in the case of failure because of the absence of reference to
  550. _toupper() or _tolower() we should defer recognition and repeat it later, after finding _tolower() or _toupper(). This
  551. means the our algorithm is not one-pass algorithm anymore, but luckily the second and subsequent passes are applied
  552. only to a few locations in the program.
  553.  
  554. At last, functions may be identical at non-variant bytes, refer to the same names but be called differently. That is,
  555. functions have the same implementations and different names. Surprisingly, this is a frequent situation in standard libraries,
  556. especially in C++ libraries.
  557.  
  558. This situation is called a collision (collision occurs when functions attached to a leaf can not be distinguished from each
  559. other by using the explained above methods). A classical example is:
  560.  
  561. 558BEC1EB441C55606CD211F720433C0EB0450E8....5DCB................
  562.    0. _remove (00 0000)
  563.    1. _unlink (00 0000)
  564.  
  565. or
  566.  
  567. 8BDC36834702FAE9....8BDC36834702F6E9............................
  568.    0. @iostream@$vsn            (00 0000)
  569.    1. @iostream_withassign@$vsn (00 0000)
  570.  
  571. These examples appeal to an artificial intelligence :) We made our goal to be an efficient and fast algorithm and therefore
  572. we leave artificial intelligence for the future development of the algorithm.
  573.  
  574. Implementation
  575.  
  576. Today the implementation coincides practically the algorithm described above. We consider only the C and C++
  577. language programs. It will be possible to write the preprocessors for other libraries in future.
  578.  
  579. For every vendor a separate signature file is created, such decision allows to decrease a probability of collisions and not
  580. to take into account other vendor functions.
  581.  
  582. Special signature files applied to the entry point of a program are created to determine a compiler used for the program.
  583. They also determine a signature file for that vendor/compiler. These special signature files are called startup-signatures.
  584. Our algorithm successfully discerns the startup modules of all popular vendors. It's not necessary to discern the models
  585. (small, compact, medium, large, huge) of the libraries and versions of the compilers because all functions are stored in
  586. one signature file so it's enough to determine right signature file and our algorithm takes everything upon.
  587.  
  588. There are special startup-signatures for every format of disassembled file. The signature exe.sig is used for programs
  589. running under MS DOS, lx.sig or ne.sig - for OS/2, etc.
  590.  
  591. To decrease a probability of false recognition of short functions it's sine qua non to remember a reference to an external
  592. name if such a reference exists. It may decrease in some degree the probability of the recognition of the function in
  593. general but such approach is justified. It's better not to recognize than to recognize wrongly. The too short functions (the
  594. length less than 4 bytes) not containing the references to external names do not participate in creation of a signature file
  595. and such functions are not recognized.
  596.  
  597. For the functions from <ctype.h> are short and refer to the array of types of the symbols, we decided to consider the
  598. references to this array as an exception so that CRC16 of the array of the types of the symbols is stored in the signature
  599. file.
  600.  
  601. The collisions are solved by a human (creator) of a signature file. He chooses the functions to be included in the signature
  602. file and the functions that are unnecessary. Note that the process of this choice is very easy and resolves itself into editing
  603. of a text file.
  604.  
  605. The patterns of the functions are stored in a signature file not in their original form (i.e., they do not look as it was
  606. demonstrated in the examples). Instead of the patterns the arrays of bits determining the changing bytes and the values of
  607. the individual bytes are stored. Accordingly the signature file contains nary byte from the libraries excepting names of the
  608. functions.
  609.  
  610. A creation of a signature file involves in 2 stages: a preprocessor of the libraries and a formation of a signature file. At the
  611. first stage the program 'parselib' is used. It preprocesses *.obj and *.lib files and produces a pattern-file. The pattern-file
  612. contains patterns of the functions, their names, CRC16 and all other information that is necessary to create the signature
  613. file. At the second stage an utility 'sigmake' makes the signature file from the pattern-file.
  614.  
  615. This division into 2 stages allows sigmake utility to be independent from a format of an input file. It will be possible to
  616. write other preprocessors for files differing from *.obj and *.lib in future.
  617.  
  618. We decided to compress (using InfoZip algorithm) the created signature files to decrease the disk space necessary for
  619. their storage.
  620.  
  621. For the sake of convenience of a user we tried to recognize the function main() in a program. An algorithm for finding this
  622. function is different for the different compilers and for the different types of the programs
  623. (DOS/OS2/WinDows/GUI/Console...), so this algorithm is written in a signature file as a text string. Unfortunately
  624. creation of this algorithm is not automated and is laborious.
  625.  
  626. Results
  627.  
  628. As it turned out the signature files are compressible well; they may be compressed more than 2 times. The reason is that
  629. about 95% of a signature file are function names. (Example: signature file for MFC 2.x before compression was 2.5Mb,
  630. after - 700Kb. It contains 33634 function names; average is 21 byte for a function). Generally, ratio of a library size to a
  631. signature size is from 100 to 500.
  632.  
  633. Percentage of properly recognized functions is very high. In the "Hello, world" program our algorithm recognized all
  634. library functions except one function which consists of one instruction:
  635.  
  636.         jmp     off_1234
  637.  
  638. The most pleasing is that there were no false recognitions. However it does not mean that they will not appear in the
  639. future. It should be noted that the algorithm works only with functions. Sometimes data is located in code segment and
  640. therefore we need to mark some names as "data names", not as "function names". It is not easy to examine all names in a
  641. modern large library and mark all data names. However, there is possibility to mark a name in a signature file as a data
  642. name, but the process of marking data names is left for the future.
  643.  
  644.  
  645. ================================================================================
  646.                           SECTION III : IDC COMMANDS
  647. ================================================================================
  648.  
  649. IDC language is a C-like language. It has the same lexical tokens as C: character set, constants, identifiers,
  650. keywords, etc. All variables in IDC are automatic local variables. A variable can contain:
  651.  
  652.      a 32-bit signed long integer
  653.      a character string (max 255 characters long)
  654.      a floating point number (extra precision, up to 25 decimal digits)
  655.  
  656. A program in IDC consists of function declarations. A function in IDC returns a value. There are 2 kinds of functions:
  657.  
  658.      built-in functions
  659.      user-defined functions
  660.  
  661. Here is how a function is declared :
  662.  
  663.   static func(arg1,arg2,arg3) {
  664.     ...
  665.   }
  666.  
  667. where arg1,arg2,arg3 are the function parameters,'func' is the function name. It is not nesessary to specify the types of
  668. the parameters because any variable can contain a string or a number.
  669.  
  670. Here is how a variable is declared :
  671.  
  672.   auto var;
  673.  
  674. This declaration introduces a variable named 'var'. It can contain a string or a number. All C and C++ keywords are
  675. reserved and cannot be used as a variable name. The scope of the variable is the function where it is defined.
  676.  
  677. IDC supports the following statements:
  678.  
  679.      if (expression) statement
  680.  
  681.      if (expression) statement else statement
  682.  
  683.      for ( expr1; expr2; expr3 ) statement
  684.  
  685.      while (expression) statement
  686.  
  687.      do statement while (expression);
  688.  
  689.      break;
  690.  
  691.      continue;
  692.  
  693.      return ;
  694.  
  695.      return;
  696.  
  697.      the same as 'return 0;'
  698.      { statements... }
  699.  
  700.      expression;
  701.  
  702.      (expression-statement)
  703.      ;
  704.  
  705.      (empty statement)
  706.  
  707. In expressions you may use almost all C operations except:
  708.  
  709.      ++,--
  710.      complex assigment operations as '+='
  711.      , (comma operation)
  712.  
  713. You may use the following construct in the expressions:
  714.  
  715.   [ s, o ]
  716.  
  717. Suppose one wants to calculate the linear (effective) address for segment 's' offset 'o'. Here is how it is done :
  718.  
  719.   (s << 4) + o
  720.  
  721. If a string constant is specified as 's', it denotes a segment by its name.
  722.  
  723. There are 3 type conversion operations:
  724.  
  725.      long( expr )
  726.      floating point number is truncated during conversion
  727.      char( expr )
  728.      float( expr )
  729.  
  730. However, all type conversions are made automatically:
  731.  
  732. addition
  733.      if both operands are strings, string addition is performed (strings are concatenated);
  734.      if floating point operand exists, both operands are converted to floats; otherwise both operands are converted to
  735.      longs;
  736. subtraction/multiplication/division
  737.      if floating point operand exists, both operands are converted to floats; otherwise both operands are converted to
  738.      longs;
  739. comparisions (==,!=, etc)
  740.      if both operands are strings, string comparision is performed; if floating point operand exists, both operands are
  741.      converted to floats; otherwise both operands are converted to longs;
  742. all other operations
  743.      operand(s) are converted to longs;
  744.  
  745. Built-in functions
  746. ------------------
  747. Alphabetical list of IDC functions :
  748.  
  749. AddCodeXref
  750. AddConst
  751. AddEntryPoint
  752. AddEnum
  753. AddHotkey
  754. AddSourceFile
  755. AddStruc
  756. AddStrucMember
  757. AltOp
  758. AnalyseArea
  759. Analysis
  760. AskAddr
  761. AskFile
  762. AskIdent
  763. AskSeg
  764. AskSelector
  765. AskStr
  766. AskYN
  767. AutoMark
  768. AutoMark2
  769. AutoShow
  770. Batch
  771. BeginEA
  772. Byte
  773. ChooseFunction
  774. CmtIndent
  775. Comment
  776. Comments
  777. Compile
  778. CreateArray
  779. DelArrayElement
  780. DelCodeXref
  781. DelConst
  782. DelEnum
  783. DelExtLnA
  784. DelExtLnB
  785. DelFixup
  786. DelFunction
  787. DelHotkey
  788. DelLineNumber
  789. DelSelector
  790. DelSourceFile
  791. DelStruc
  792. DelStrucMember
  793. DeleteAll
  794. DeleteArray
  795. Dfirst
  796. DfirstB
  797. Direction
  798. Dnext
  799. DnextB
  800. Dword
  801. Exit
  802. ExtLinA
  803. ExtLinB
  804. Fatal
  805. FindBinary
  806. FindCode
  807. FindData
  808. FindExplored
  809. FindFuncEnd
  810. FindImmediate
  811. FindProc
  812. FindSelector
  813. FindText
  814. FindUnexplored
  815. FindVoid
  816. FirstSeg
  817. GetArrayElement
  818. GetArrayId
  819. GetCharPrm
  820. GetConst
  821. GetConstByName
  822. GetConstCmt
  823. GetConstEnum
  824. GetConstName
  825. GetConstValue
  826. GetEntryOrdinal
  827. GetEntryPoint
  828. GetEntryPointQty
  829. GetEnum
  830. GetEnumCmt
  831. GetEnumFlag
  832. GetEnumIdx
  833. GetEnumName
  834. GetEnumQty
  835. GetEnumSize
  836. GetFirstConst
  837. GetFirstIndex
  838. GetFirstMember
  839. GetFirstStrucIdx
  840. GetFixupTgtDispl
  841. GetFixupTgtOff
  842. GetFixupTgtSel
  843. GetFixupTgtType
  844. GetFlags
  845. GetFrame
  846. GetFrameArgsSize
  847. GetFrameLvarSize
  848. GetFrameRegsSize
  849. GetFrameSize
  850. GetFuncOffset
  851. GetFunctionFlags
  852. GetFunctionName
  853. GetLastConst
  854. GetLastIndex
  855. GetLastMember
  856. GetLastStrucIdx
  857. GetLineNumber
  858. GetLongPrm
  859. GetMarkComment
  860. GetMarkedPos
  861. GetMemberComment
  862. GetMemberFlag
  863. GetMemberName
  864. GetMemberOffset
  865. GetMemberQty
  866. GetMemberSize
  867. GetMemberStrId
  868. GetMnem
  869. GetNextConst
  870. GetNextFixupEA
  871. GetNextIndex
  872. GetNextStrucIdx
  873. GetOpType
  874. GetOperandValue
  875. GetOpnd
  876. GetPrevConst
  877. GetPrevFixupEA
  878. GetPrevIndex
  879. GetPrevStrucIdx
  880. GetReg
  881. GetSegmentAttr
  882. GetShortPrm
  883. GetSourceFile
  884. GetSpDiff
  885. GetSpd
  886. GetStrucComment
  887. GetStrucId
  888. GetStrucIdByName
  889. GetStrucIdx
  890. GetStrucName
  891. GetStrucNextOff
  892. GetStrucPrevOff
  893. GetStrucQty
  894. GetStrucSize
  895. GetTrueName
  896. GetnEnum
  897. HighVoids
  898. Indent
  899. ItemEnd
  900. ItemSize
  901. JmpTable
  902. Jump
  903. LineA
  904. LineB
  905. LocByName
  906. LowVoids
  907. MK_FP
  908. MakeArray
  909. MakeByte
  910. MakeCode
  911. MakeComm
  912. MakeDouble
  913. MakeDword
  914. MakeFloat
  915. MakeFrame
  916. MakeFunction
  917. MakeLocal
  918. MakeName
  919. MakePackReal
  920. MakeQword
  921. MakeRptCmt
  922. MakeStr
  923. MakeStruct
  924. MakeTbyte
  925. MakeUnkn
  926. MakeVar
  927. MakeWord
  928. MarkPosition
  929. MaxEA
  930. Message
  931. MinEA
  932. Name
  933. NextAddr
  934. NextFunction
  935. NextHead
  936. NextNotTail
  937. NextSeg
  938. OpAlt
  939. OpBinary
  940. OpChr
  941. OpDecimal
  942. OpEnum
  943. OpHex
  944. OpNumber
  945. OpOctal
  946. OpOff
  947. OpSeg
  948. OpSign
  949. OpStkvar
  950. OpStroff
  951. PatchByte
  952. PatchDword
  953. PatchWord
  954. PrevAddr
  955. PrevFunction
  956. PrevHead
  957. PrevNotTail
  958. RenameArray
  959. RenameEntryPoint
  960. Rfirst
  961. Rfirst0
  962. RfirstB
  963. RfirstB0
  964. Rnext
  965. Rnext0
  966. RnextB
  967. RnextB0
  968. RptCmt
  969. ScreenEA
  970. SegAddrng
  971. SegAlign
  972. SegBounds
  973. SegByBase
  974. SegByName
  975. SegClass
  976. SegComb
  977. SegCreate
  978. SegDefReg
  979. SegDelete
  980. SegEnd
  981. SegName
  982. SegRename
  983. SegStart
  984. SelEnd
  985. SelStart
  986. SetArrayLong
  987. SetArrayString
  988. SetCharPrm
  989. SetConstCmt
  990. SetConstName
  991. SetEnumCmt
  992. SetEnumFlag
  993. SetEnumIdx
  994. SetEnumName
  995. SetFixup
  996. SetFlags
  997. SetFunctionEnd
  998. SetFunctionFlags
  999. SetLineNumber
  1000. SetLongPrm
  1001. SetMemberComment
  1002. SetMemberName
  1003. SetMemberType
  1004. SetPrcsr
  1005. SetReg
  1006. SetSegmentType
  1007. SetSelector
  1008. SetShortPrm
  1009. SetSpDiff
  1010. SetStrucComment
  1011. SetStrucIdx
  1012. SetStrucName
  1013. StringStp
  1014. Tabs
  1015. TailDepth
  1016. Voids
  1017. Wait
  1018. Warning
  1019. Word
  1020. WriteExe
  1021. WriteMap
  1022. WriteTxt
  1023. XrefShow
  1024. XrefType
  1025. add_dref
  1026. atoa
  1027. atol
  1028. byteValue
  1029. del_dref
  1030. fclose
  1031. fgetc
  1032. filelength
  1033. fopen
  1034. form
  1035. fprintf
  1036. fputc
  1037. fseek
  1038. ftell
  1039. hasName
  1040. hasValue
  1041. isBin0
  1042. isBin1
  1043. isChar0
  1044. isChar1
  1045. isCode
  1046. isData
  1047. isDec0
  1048. isDec1
  1049. isDefArg0
  1050. isDefArg1
  1051. isEnum0
  1052. isEnum1
  1053. isExtra
  1054. isFlow
  1055. isFop0
  1056. isFop1
  1057. isHead
  1058. isHex0
  1059. isHex1
  1060. isLoaded
  1061. isOct0
  1062. isOct1
  1063. isOff0
  1064. isOff1
  1065. isRef
  1066. isSeg0
  1067. isSeg1
  1068. isStkvar0
  1069. isStkvar1
  1070. isStroff0
  1071. isStroff1
  1072. isTail
  1073. isUnknown
  1074. isVar
  1075. loadfile
  1076. ltoa
  1077. readlong
  1078. readshort
  1079. readstr
  1080. savefile
  1081. set_start_cs
  1082. set_start_ip
  1083. strlen
  1084. strstr
  1085. substr
  1086. writelong
  1087. writeshort
  1088. writestr
  1089. xtol
  1090.  
  1091. Function Definitions:
  1092.  
  1093. hasValue
  1094.  
  1095.  
  1096. // Do flags contain byte value? (i.e. has the byte a value?)
  1097. // if not, the byte is uninitialized.
  1098.  
  1099. #define hasValue(F)     ((F & FF_IVL) != 0)     // any defined value?
  1100.  
  1101.  
  1102. byteValue
  1103.  
  1104.  
  1105. // Get byte value from flags
  1106. // Get value of byte provided that the byte is initialized.
  1107. // This macro works ok only for 8-bit byte machines.
  1108.  
  1109. #define byteValue(F)    (F & MS_VAL)    // quick replacement for Byte()
  1110.  
  1111.  
  1112. isLoaded
  1113.  
  1114.  
  1115. // Is the byte initialized?
  1116.  
  1117. #define isLoaded(ea)    hasValue(GetFlags(ea))  // any defined value?
  1118.  
  1119.  
  1120. isCode
  1121.  
  1122.  
  1123. #define MS_CLS  0x00000600L             // Mask for typing
  1124. #define FF_CODE 0x00000600L             // Code ?
  1125. #define FF_DATA 0x00000400L             // Data ?
  1126. #define FF_TAIL 0x00000200L             // Tail ?
  1127. #define FF_UNK  0x00000000L             // Unknown ?
  1128.  
  1129.  
  1130. #define isCode(F)       ((F & MS_CLS) == FF_CODE) // is code byte?
  1131. #define isData(F)       ((F & MS_CLS) == FF_DATA) // is data byte?
  1132. #define isTail(F)       ((F & MS_CLS) == FF_TAIL) // is tail byte?
  1133. #define isUnknown(F)    ((F & MS_CLS) == FF_UNK)  // is unexplored byte?
  1134. #define isHead(F)       ((F & FF_DATA) != 0)      // is start of code/data?
  1135.  
  1136.  
  1137. CommonBits
  1138.  
  1139. //
  1140. //      Common bits
  1141. //
  1142.  
  1143. #define MS_COMM 0x000FF800L             // Mask of common bits
  1144. #define FF_COMM 0x00000800L             // Has comment?
  1145. #define FF_REF  0x00001000L             // has references?
  1146. #define FF_LINE 0x00002000L             // Has next or prev cmt lines ?
  1147. #define FF_NAME 0x00004000L             // Has user-defined name ?
  1148. #define FF_LABL 0x00008000L             // Has dummy name?
  1149. #define FF_FLOW 0x00010000L             // Exec flow from prev instruction?
  1150. #define FF_VAR  0x00080000L             // Is byte variable ?
  1151.  
  1152. #define isFlow  (F)     ((F & FF_FLOW) != 0)
  1153. #define isVar   (F)     ((F & FF_VAR ) != 0)
  1154. #define isExtra (F)     ((F & FF_LINE) != 0)
  1155. #define isRef   (F)     ((F & FF_REF)  != 0)
  1156. #define hasName (F)     ((F & FF_NAME) != 0)
  1157.  
  1158.  
  1159. OpTypes
  1160.  
  1161.  
  1162. #define MS_0TYPE 0x00F00000L            // Mask for 1st arg typing
  1163. #define FF_0VOID 0x00000000L            // Void (unknown)?
  1164. #define FF_0NUMH 0x00100000L            // Hexadecimal number?
  1165. #define FF_0NUMD 0x00200000L            // Decimal number?
  1166. #define FF_0CHAR 0x00300000L            // Char ('x')?
  1167. #define FF_0SEG  0x00400000L            // Segment?
  1168. #define FF_0OFF  0x00500000L            // Offset?
  1169. #define FF_0NUMB 0x00600000L            // Binary number?
  1170. #define FF_0NUMO 0x00700000L            // Octal number?
  1171. #define FF_0ENUM 0x00800000L            // Enumeration?
  1172. #define FF_0FOP  0x00900000L            // Forced operand?
  1173. #define FF_0STRO 0x00A00000L            // Struct offset?
  1174.  
  1175. #define MS_1TYPE 0x0F000000L            // Mask for 2nd arg typing
  1176. #define FF_1VOID 0x00000000L            // Void (unknown)?
  1177. #define FF_1NUMH 0x01000000L            // Hexadecimal number?
  1178. #define FF_1NUMD 0x02000000L            // Decimal number?
  1179. #define FF_1CHAR 0x03000000L            // Char ('x')?
  1180. #define FF_1SEG  0x04000000L            // Segment?
  1181. #define FF_1OFF  0x05000000L            // Offset?
  1182. #define FF_1NUMB 0x06000000L            // Binary number?
  1183. #define FF_1NUMO 0x07000000L            // Octal number?
  1184. #define FF_1ENUM 0x08000000L            // Enumeration?
  1185. #define FF_1FOP  0x09000000L            // Forced operand?
  1186. #define FF_1STRO 0x0A000000L            // Struct offset?
  1187.  
  1188. // The following macros answer questions like
  1189. //   'is the 1st (or 2nd) operand of instruction or data of the given type'?
  1190. // Please note that data items use only the 1st operand type (is...0)
  1191.  
  1192. #define isDefArg0(F)    ((F & MS_0TYPE) != FF_0VOID)
  1193. #define isDefArg1(F)    ((F & MS_1TYPE) != FF_1VOID)
  1194. #define isDec0(F)       ((F & MS_0TYPE) == FF_0NUMD)
  1195. #define isDec1(F)       ((F & MS_1TYPE) == FF_1NUMD)
  1196. #define isHex0(F)       ((F & MS_0TYPE) == FF_0NUMH)
  1197. #define isHex1(F)       ((F & MS_1TYPE) == FF_1NUMH)
  1198. #define isOct0(F)       ((F & MS_0TYPE) == FF_0NUMO)
  1199. #define isOct1(F)       ((F & MS_1TYPE) == FF_1NUMO)
  1200. #define isBin0(F)       ((F & MS_0TYPE) == FF_0NUMB)
  1201. #define isBin1(F)       ((F & MS_1TYPE) == FF_1NUMB)
  1202. #define isOff0(F)       ((F & MS_0TYPE) == FF_0OFF)
  1203. #define isOff1(F)       ((F & MS_1TYPE) == FF_1OFF)
  1204. #define isChar0(F)      ((F & MS_0TYPE) == FF_0CHAR)
  1205. #define isChar1(F)      ((F & MS_1TYPE) == FF_1CHAR)
  1206. #define isSeg0(F)       ((F & MS_0TYPE) == FF_0SEG)
  1207. #define isSeg1(F)       ((F & MS_1TYPE) == FF_1SEG)
  1208. #define isEnum0(F)      ((F & MS_0TYPE) == FF_0ENUM)
  1209. #define isEnum1(F)      ((F & MS_1TYPE) == FF_1ENUM)
  1210. #define isFop0(F)       ((F & MS_0TYPE) == FF_0FOP)
  1211. #define isFop1(F)       ((F & MS_1TYPE) == FF_1FOP)
  1212. #define isStroff0(F)    ((F & MS_0TYPE) == FF_0STRO)
  1213. #define isStroff1(F)    ((F & MS_1TYPE) == FF_1STRO)
  1214. #define isStkvar0(F)    ((F & MS_0TYPE) == FF_0STK)
  1215. #define isStkvar1(F)    ((F & MS_1TYPE) == FF_1STK)
  1216.  
  1217. //
  1218. //      Bits for DATA bytes
  1219. //
  1220.  
  1221. #define DT_TYPE 0xF0000000L             // Mask for DATA typing
  1222.  
  1223. #define FF_BYTE 0x00000000L             // byte
  1224. #define FF_WORD 0x10000000L             // word
  1225. #define FF_DWRD 0x20000000L             // dword
  1226. #define FF_QWRD 0x30000000L             // qword
  1227. #define FF_TBYT 0x40000000L             // tbyte
  1228. #define FF_ASCI 0x50000000L             // ASCII ?
  1229. #define FF_STRU 0x60000000L             // Struct ?
  1230. #define FF_XTRN 0x70000000L             // Extern data, unknown size
  1231. #define FF_FLOAT 0x80000000L            // float
  1232. #define FF_DOUBLE 0x90000000L           // double
  1233. #define FF_PACKREAL 0xA0000000L         // packed decimal real
  1234. #define FF_ALIGN    0xB0000000L         // alignment directive
  1235.  
  1236. //
  1237. //      Bits for CODE bytes
  1238. //
  1239.  
  1240. #define MS_CODE 0xF0000000L
  1241. #define FF_FUNC 0x10000000L             // function start?
  1242. #define FF_IMMD 0x40000000L             // Has Immediate value ?
  1243. #define FF_JUMP 0x80000000L             // Has jump table
  1244.  
  1245.  
  1246. MK_FP
  1247.  
  1248.  
  1249. // Return value of expression: ((seg<<4) + off)
  1250.  
  1251. long    MK_FP           (long seg,long off);    // the same as [ seg, off ]
  1252.                                                 // i.e: ((seg<<4)+off)
  1253.  
  1254.  
  1255. form
  1256.  
  1257.  
  1258. // Return a formatted string.
  1259. //      format - printf-style format string.
  1260. //               %a - means address expression.
  1261. //               floating point values are output only in one format
  1262. //                regardless of the character specified (f,e,g,E,G)
  1263. //               %p is not supported.
  1264. // The resulting string must be less than 255 characters
  1265.  
  1266. char    form            (char format,...);      // works as sprintf
  1267.                                                 // The resulting string should
  1268.                                                 // be less than 255 characters.
  1269.  
  1270.  
  1271. substr
  1272.  
  1273.  
  1274. // Return substring of a string
  1275. //      str - input string
  1276. //      x1  - starting index (0..n)
  1277. //      x2  - ending index. If x2 == -1, then return substring
  1278. //            from x1 to the end of string.
  1279.  
  1280. char    substr          (char str,long x1,long x2); // substring [x1..x2-1]
  1281.                                                 // if x2 == -1, then till end of line
  1282.  
  1283.  
  1284. strstr
  1285.  
  1286.  
  1287. // Search a substring in a string
  1288. //      str    - input string
  1289. //      substr - substring to search
  1290. // returns: 0..n - index in the 'str' where the substring starts
  1291. //          -1   - if the substring is not found
  1292.  
  1293. long    strstr          (char str,char substr); // find a substring, -1 - not found
  1294.  
  1295.  
  1296.  
  1297. strlen
  1298.  
  1299.  
  1300. // Return length of a string in bytes
  1301. //      str - input string
  1302. // Returns: length (0..n)
  1303.  
  1304. long    strlen          (char str);             // calculate length
  1305.  
  1306.  
  1307. xtol
  1308.  
  1309.  
  1310. // Convert ascii string to a binary number.
  1311. // (this function is the same as hexadecimal 'strtol' from C library)
  1312.  
  1313. long    xtol            (char str);             // ascii hex -> number
  1314.                                                 // (use long() for atol)
  1315.  
  1316. atoa
  1317.  
  1318.  
  1319. // Convert address value to a string
  1320.  
  1321. char    atoa            (long ea);              // returns address in
  1322.                                                 // the form 'seg000:1234'
  1323.                                                 // (the same as in line prefixes)
  1324.  
  1325.  
  1326. ltoa
  1327.  
  1328.  
  1329. // Convert a number to a string.
  1330. //      n - number
  1331. //      radix - number base (2,8,10,16)
  1332.  
  1333. char    ltoa            (long n,long radix);    // convert to ascii string
  1334.  
  1335.  
  1336. atol
  1337.  
  1338.  
  1339. // Convert ascii string to a number
  1340. //      str - a decimal representation of a number
  1341. // returns: a binary number
  1342.  
  1343. long    atol            (char str);             // convert ascii decimal to long
  1344.  
  1345.  
  1346. AddHotkey
  1347.  
  1348.  
  1349. // Add hotkey for IDC function
  1350. //      hotkey  - hotkey name ('a', "Alt-A", etc)
  1351. //      idcfunc - IDC function name
  1352. // returns:
  1353. #endif
  1354. #define IDCHK_OK        0       // ok
  1355. #define IDCHK_ARG       -1      // bad argument(s)
  1356. #define IDCHK_KEY       -2      // bad hotkey name
  1357. #define IDCHK_MAX       -3      // too many IDC hotkeys
  1358. #ifdef _notdefinedsymbol
  1359.  
  1360. long AddHotkey(char hotkey,char idcfunc);
  1361.  
  1362.  
  1363. DelHotkey
  1364.  
  1365.  
  1366. // Delete IDC function hotkey
  1367.  
  1368. success DelHotkey(char hotkey);
  1369.  
  1370.  
  1371. Jump
  1372.  
  1373.  
  1374. // Move cursor to the specifed linear address
  1375. //      ea - linear address
  1376.  
  1377. success Jump            (long ea);              // move cursor to ea
  1378.                                                 // screen is refreshed at
  1379.                                                 // the end of IDC execution
  1380.  
  1381.  
  1382. Wait
  1383.  
  1384.  
  1385. // Wait for the end of autoanalysis
  1386. // This function will suspend execution of IDC program
  1387. // till the autoanalysis queue is empty.
  1388.  
  1389. void    Wait            ();                     // Process all entries in the
  1390.                                                 // autoanalysis queue
  1391.  
  1392.  
  1393. Compile
  1394.  
  1395.  
  1396. // Compile an IDC file.
  1397. // The file being compiled should not contain functions that are
  1398. // currently executing - otherwise the behaviour of the replaced
  1399. // functions is undefined.
  1400. //      filename - name of file to compile
  1401. // returns: "" - ok, otherwise it returns an error message.
  1402.  
  1403. char    Compile         (char filename);        // Compile an IDC file.
  1404.                                                 // returns error message.
  1405.  
  1406.  
  1407. Exit
  1408.  
  1409.  
  1410. // Stop execution of IDC program, close the database and exit to OS
  1411. //      code - code to exit with.
  1412.  
  1413. void    Exit            (long code);            // Exit to OS
  1414.  
  1415.  
  1416.  
  1417. DeleteAll
  1418.  
  1419.  
  1420. // Delete all segments, instructions, comments, i.e. everything
  1421. // except values of bytes.
  1422.  
  1423. void    DeleteAll       ();                     // delete ALL information
  1424.                                                 // about the program
  1425.  
  1426.  
  1427. MakeCode
  1428.  
  1429.  
  1430. // Create an instruction at the specified address
  1431. //      ea - linear address
  1432. // returns: 0 - can't create an instruction (no such opcode, the instruction would
  1433. //              overlap with existing items, etc)
  1434. //          otherwise returns length of the instruction in bytes
  1435.  
  1436. long    MakeCode        (long ea);              // convert to instruction
  1437.                                                 // returns number of bytes
  1438.                                                 // occupied by the instruction
  1439.  
  1440.  
  1441.  
  1442. AnalyseArea
  1443.  
  1444.  
  1445. // Perform full analysis of the area
  1446. //      sEA - starting linear address
  1447. //      eEA - ending linear address (excluded)
  1448. // returns: 1-ok, 0-Ctrl-Break was pressed.
  1449.  
  1450. long    AnalyseArea     (long sEA,long eEA);    // analyse area and try to
  1451.                                                 // convert to code all bytes
  1452.                                                 // Returns 1-ok,0-CtrlBreak pressed
  1453.  
  1454.  
  1455. MakeName
  1456.  
  1457.  
  1458. // Rename a byte
  1459. //      ea - linear address
  1460. //      name - new name of address. If name == "", then delete old name
  1461. // returns: 1-ok, 0-failure
  1462.  
  1463. success MakeName        (long ea,char name);    // assign a name to a location
  1464.  
  1465.  
  1466.  
  1467. MakeComm
  1468.  
  1469.  
  1470. // Set an indented regular comment of an item
  1471. //      ea      - linear address
  1472. //      comment - comment string
  1473.  
  1474. success MakeComm        (long ea,char comment); // give a comment
  1475.  
  1476.  
  1477. MakeRptCmt
  1478.  
  1479.  
  1480. // Set an indented repeatable comment of an item
  1481. //      ea      - linear address
  1482. //      comment - comment string
  1483.  
  1484. success MakeRptCmt      (long ea,char comment); // give a repeatable comment
  1485.  
  1486.  
  1487. MakeArray
  1488.  
  1489.  
  1490. // Create an array.
  1491. //      ea      - linear address
  1492. //      nitems  - size of array in items
  1493. // This function will create an array of the items with the same type as the
  1494. // type of the item at 'ea'. If the byte at 'ea' is undefined, then this
  1495. // function will create an array of bytes.
  1496.  
  1497. success MakeArray       (long ea,long nitems);  // convert to an array
  1498.  
  1499.  
  1500. MakeStr
  1501.  
  1502.  
  1503. // Create a string.
  1504. // This function creates a string (the style is determinted by the value
  1505. // of GetLongPrm(INF_STRTYPE), see below).
  1506. //      ea - linear address
  1507. //      endea - ending address of the string (excluded)
  1508. //              if endea == BADADDR, then length of string will be calculated
  1509. //              the the kernel
  1510. // returns: 1-ok, 0-failure
  1511.  
  1512. success MakeStr         (long ea,long endea);   // convert to ASCII string
  1513.  
  1514.  
  1515. MakeByte
  1516.  
  1517.  
  1518. // Convert the current item to a byte
  1519. //      ea - linear address
  1520. // returns: 1-ok, 0-failure
  1521.  
  1522. success MakeByte        (long ea);              // convert to byte
  1523.  
  1524.  
  1525. MakeWord
  1526.  
  1527.  
  1528. // Convert the current item to a word (2 bytes)
  1529. //      ea - linear address
  1530. // returns: 1-ok, 0-failure
  1531.  
  1532. success MakeWord        (long ea);              // convert to word
  1533.  
  1534.  
  1535. MakeDword
  1536.  
  1537.  
  1538. // Convert the current item to a double word (4 bytes)
  1539. //      ea - linear address
  1540. // returns: 1-ok, 0-failure
  1541.  
  1542. success MakeDword       (long ea);              // convert to double-word
  1543.  
  1544.  
  1545. MakeQword
  1546.  
  1547.  
  1548. // Convert the current item to a quadro word (8 bytes)
  1549. //      ea - linear address
  1550. // returns: 1-ok, 0-failure
  1551.  
  1552. success MakeQword       (long ea);              // convert to quadro-word
  1553.  
  1554.  
  1555.  
  1556. MakeFloat
  1557.  
  1558.  
  1559. // Convert the current item to a floating point (4 bytes)
  1560. //      ea - linear address
  1561. // returns: 1-ok, 0-failure
  1562.  
  1563. success MakeFloat       (long ea);              // convert to float
  1564.  
  1565.  
  1566. MakeDouble
  1567.  
  1568.  
  1569. // Convert the current item to a double floating point (8 bytes)
  1570. //      ea - linear address
  1571. // returns: 1-ok, 0-failure
  1572.  
  1573. success MakeDouble      (long ea);              // convert to double
  1574.  
  1575.  
  1576.  
  1577. MakePackReal
  1578.  
  1579.  
  1580. // Convert the current item to a packed real (10 or 12 bytes)
  1581. //      ea - linear address
  1582. // returns: 1-ok, 0-failure
  1583.  
  1584. success MakePackReal    (long ea);              // convert to packed real
  1585.  
  1586.  
  1587. MakeTbyte
  1588.  
  1589.  
  1590. // Convert the current item to a tbyte (10 or 12 bytes)
  1591. //      ea - linear address
  1592. // returns: 1-ok, 0-failure
  1593.  
  1594. success MakeTbyte       (long ea);              // convert to 10 bytes (tbyte)
  1595.  
  1596.  
  1597.  
  1598. MakeStruct
  1599.  
  1600.  
  1601. // Convert the current item to a structure instance
  1602. //      ea      - linear address
  1603. //      strname - name of a structure type
  1604. // returns: 1-ok, 0-failure
  1605.  
  1606. success MakeStruct      (long ea,char strname); // convert to structure instance
  1607.  
  1608.  
  1609. MakeLocal
  1610.  
  1611.  
  1612. // Create a local variable
  1613. //      start,end - range of addresses for the local variable
  1614. //                  The current version doesn't use 'end' address
  1615. //                  and creates a stack variable for the whole function
  1616. //                  If there is no function at 'start' then this function
  1617. //                  will fail.
  1618. //      location  - variable location in the form "[bp+xx]" where xx is
  1619. //                  a hexadecimal offset.
  1620. //      name      - name of the local variable
  1621. // returns: 1-ok, 0-failure
  1622.  
  1623. success MakeLocal(long start,long end,char location,char name);
  1624.  
  1625.  
  1626.  
  1627. MakeUnkn
  1628.  
  1629.  
  1630. // Convert the current item to an explored item
  1631. //      ea     - linear address
  1632. //      expand - 0: just undefine the current item
  1633. //               1: undefine other instructions if the removal of the
  1634. //                  current instruction removes all references to them.
  1635. //                  (note: functions will not be undefined even if they
  1636. //                         have no references to them)
  1637. // returns: 1-ok, 0-failure
  1638.  
  1639. void    MakeUnkn        (long ea,long expand);  // convert to 'unknown'
  1640.                                                 // expand!=0 => undefine consequent
  1641.                                                 // instructions too
  1642.  
  1643.  
  1644. OpBinary
  1645.  
  1646.  
  1647. // Convert an operand of the item (instruction or data) to a binary number
  1648. //      ea - linear address
  1649. /       n  - number of operand
  1650. //              0 - the first operand
  1651. //              1 - the second, third and all other operands
  1652. //              -1 - all operands
  1653. // Note: the data items use only the type of the first operand
  1654. // Returns: 1-ok, 0-failure
  1655.  
  1656. success OpBinary        (long ea,int n);        // make operand binary
  1657.                                                 // n=0 - first operand
  1658.                                                 // n=1 - second, third etc. operands
  1659.                                                 // n=-1 - all operands
  1660.  
  1661. // Convert an operand of the item (instruction or data) to an octal number
  1662. // (see explanation of OpBinary functions)
  1663.  
  1664. success OpOctal         (long ea,int n);
  1665.  
  1666. // Convert operand to decimal,hex,char (see OpBinary() for explanations)
  1667.  
  1668. success OpDecimal       (long ea,int n);
  1669. success OpHex           (long ea,int n);
  1670. success OpChr           (long ea,int n);
  1671.  
  1672.  
  1673.  
  1674. OpOff
  1675.  
  1676.  
  1677. // Convert operand to an offset
  1678. // (for the explanations of 'ea' and 'n' please see OpBinary())
  1679. //      base - base of the offset as a linear address
  1680. //             If base == BADADDR then the current operand becomes non-offset
  1681. // Example:
  1682. //  seg000:2000 dw      1234h
  1683. // and there is a segment at paragraph 0x1000 and there is a data item
  1684. // within the segment at 0x1234:
  1685. //  seg000:1234 MyString        db 'Hello, world!',0
  1686. // Then you need to specify a linear address of the segment base to
  1687. // create a proper offset:
  1688. //      OpOffset(["seg000",0x2000],0,0x10000);
  1689. // and you will have:
  1690. //  seg000:2000 dw      offset MyString
  1691. // Motorola 680x0 processor have a concept of "outer offsets".
  1692. // If you want to create an outer offset, you need to combine number
  1693. // of the operand with the following bit:
  1694. #define OPND_OUTER      0x80                    // outer offset base
  1695. //  Please note that the outer offsets are meaningful only for
  1696. // Motorla 680x0.
  1697.  
  1698. success OpOff           (long ea,int n,long base);
  1699.  
  1700.  
  1701. OpSeg
  1702.  
  1703.  
  1704. // Convert operand to a segment expression
  1705. // (for the explanations of 'ea' and 'n' please see OpBinary())
  1706.  
  1707. success OpSeg           (long ea,int n);
  1708.  
  1709.  
  1710. OpNumber
  1711.  
  1712.  
  1713. // Convert operand to a number (with default number base, radix)
  1714. // (for the explanations of 'ea' and 'n' please see OpBinary())
  1715.  
  1716. success OpNumber        (long ea,int n);
  1717.  
  1718.  
  1719. OpAlt
  1720.  
  1721.  
  1722. // Specify operand represenation manually.
  1723. // (for the explanations of 'ea' and 'n' please see OpBinary())
  1724. //      str - a string represenation of the operand
  1725. // IDA will not check the specified operand, it will simply display
  1726. // it instead of the orginal representation of the operand.
  1727.  
  1728. success OpAlt           (long ea,long n,char str);// manually enter n-th operand
  1729.  
  1730.  
  1731. OpSign
  1732.  
  1733.  
  1734. // Change sign of the operand.
  1735. // (for the explanations of 'ea' and 'n' please see OpBinary())
  1736.  
  1737. success OpSign          (long ea,int n);        // change operand sign
  1738.  
  1739.  
  1740. OpEnum
  1741.  
  1742.  
  1743. // Convert operand to a symbolic constant
  1744. // (for the explanations of 'ea' and 'n' please see OpBinary())
  1745. //      enum - name of enumration type
  1746.  
  1747. success OpEnum          (long ea,int n,char enum);// make operand a enum
  1748.  
  1749.  
  1750. OpStroff
  1751.  
  1752.  
  1753. // Convert operand to an offset in a structure
  1754. // (for the explanations of 'ea' and 'n' please see OpBinary())
  1755. //      strid - id of a structure type
  1756.  
  1757. success OpStroff        (long ea,int n,long strid);// make operand a struct offset
  1758.  
  1759.  
  1760. OpStkvar
  1761.  
  1762.  
  1763. // Convert operand to a stack variable
  1764. // (for the explanations of 'ea' and 'n' please see OpBinary())
  1765.  
  1766. success OpStkvar        (long ea,int n);        // make operand a stack variable
  1767.  
  1768.  
  1769. MakeVar
  1770.  
  1771.  
  1772. // Mark the location as "variable"
  1773. // Note: All that IDA does is to mark the location as "variable". Nothing else,
  1774. // no additional analysis is performed.
  1775. // This function may disappear in the future.
  1776.  
  1777. void    MakeVar         (long ea);              // the location is 'variable'
  1778.  
  1779.  
  1780. ExtLinA
  1781.  
  1782.  
  1783. // Specify an additional line to display before the generated ones.
  1784. //      ea   - linear address
  1785. //      n    - number of anterior additioal line (0..500)
  1786. //      line - the line to display
  1787. // IDA displays additional lines from number 0 up to the first unexisting
  1788. // additional line. So, if you specify additional line #150 and there is no
  1789. // additional line #149, your line will not be displayed.
  1790.  
  1791. void    ExtLinA         (long ea,long n,char line); // insert an additional line before the generated ones
  1792.  
  1793.  
  1794. ExtLinB
  1795.  
  1796.  
  1797. // Specify an additional line to display after the generated ones.
  1798. //      ea   - linear address
  1799. //      n    - number of posterior additioal line (0..500)
  1800. //      line - the line to display
  1801. // IDA displays additional lines from number 0 up to the first unexisting
  1802. // additional line. So, if you specify additional line #150 and there is no
  1803. // additional line #149, your line will not be displayed.
  1804.  
  1805. void    ExtLinB         (long ea,long n,char line); // insert an additional line after the generated ones
  1806.  
  1807.  
  1808. DelExtLnA
  1809.  
  1810.  
  1811. // Delete an additional anterior line
  1812. //      ea   - linear address
  1813. //      n    - number of anterior additioal line (0..500)
  1814.  
  1815. void    DelExtLnA       (long ea,long n);       // delete an additional line before the generated ones
  1816.  
  1817.  
  1818. DelExtLnB
  1819.  
  1820.  
  1821. // Delete an additional posterior line
  1822. //      ea   - linear address
  1823. //      n    - number of posterior additioal line (0..500)
  1824.  
  1825. void    DelExtLnB       (long ea,long n);       // delete an additional line aftr  the generated ones
  1826.  
  1827.  
  1828. JmpTable
  1829.  
  1830.  
  1831. // Create a jump table (obsolete)
  1832. //      jumpea  - address on instruction that uses the jump table
  1833. //      tableea - address of jump table
  1834. //      nitems  - number of items in the jump table
  1835. //      is32bit - 0: table entry is 16 bit
  1836. //                1: table entry is 32 bit
  1837.  
  1838. success JmpTable        (long jmpea,long tableea,long nitems,long is32bit);     // define a jump table
  1839.  
  1840.  
  1841. PatchByte
  1842.  
  1843.  
  1844. // Change value of a program byte
  1845. //      ea    - linear address
  1846. //      value - new value of the byte
  1847.  
  1848. void    PatchByte       (long ea,long value);   // change a byte
  1849.  
  1850.  
  1851. PatchWord
  1852.  
  1853.  
  1854. // Change value of a program word (2 bytes)
  1855. //      ea    - linear address
  1856. //      value - new value of the word
  1857.  
  1858. void    PatchWord       (long ea,long value);   // change a word (2 bytes)
  1859.  
  1860.  
  1861. PatchDword
  1862.  
  1863.  
  1864. // Change value of a double word
  1865. //      ea    - linear address
  1866. //      value - new value of the double word
  1867.  
  1868. void    PatchDword      (long ea,long value);   // change a dword (4 bytes)
  1869.  
  1870.  
  1871. SetFlags
  1872.  
  1873.  
  1874. // Set new value of flags
  1875. // This function should not used be used directly if possible.
  1876. // It changes properties of a program byte and if misused, may lead to
  1877. // very-very strange results.
  1878.  
  1879. void    SetFlags        (long ea,long flags);   // change internal flags for ea
  1880.  
  1881.  
  1882. SetReg
  1883.  
  1884.  
  1885. // Set value of a segment register.
  1886. //      ea - linear address
  1887. //      reg - name of a register, like "cs", "ds", "es", etc.
  1888. //      value - new value of the segment register.
  1889. // IDA keeps tracks of all the points where segment register change their
  1890. // values. This function allows you to specify the correct value of a segment
  1891. // register if IDA is not able to find the corrent value.
  1892.  
  1893. success SetReg          (long ea,char reg,long value); // set value of segment register
  1894.  
  1895.  
  1896. AutoMark
  1897.  
  1898.  
  1899. // Plan to perform an action in the future.
  1900. // This function will put your request to a special autoanalysis queue.
  1901. // Later IDA will retrieve the request from the queue and process
  1902. // it. There are several autoanalysis queue types. IDA will process all
  1903. // queries from the first queue and then switch to the second queue, etc.
  1904.  
  1905. void    AutoMark        (long ea,long queuetype); // plan address to analyse
  1906. void    AutoMark2       (long start,long end,long queuetype);
  1907.                                                   // plan range of addresses
  1908.  
  1909. #define AU_UNK  10      // make unknown
  1910. #define AU_CODE 20      // convert to instruction
  1911. #define AU_PROC 30      // make function
  1912. #define AU_USED 40      // reanalyse
  1913. #define AU_LIBF 60      // apply a flirt signature (the current signature!)
  1914. #define AU_FINAL 200    // coagulate unexplored items
  1915.  
  1916.  
  1917. Write
  1918.  
  1919.  
  1920. void    WriteMap        (char file);            // produce a .map file
  1921. void    WriteTxt        (char file,long ea1,long ea2); // produce an .asm file
  1922. void    WriteExe        (char file);            // produce an executable file
  1923.  
  1924.  
  1925. GetFlags
  1926.  
  1927.  
  1928. // Get internal flags
  1929. //      ea - linear address
  1930. // returns: 32-bit value of internal flags. See start of IDC.IDC file
  1931. // for explanations.
  1932.  
  1933. long    GetFlags        (long ea);              // get internal flags for ea
  1934.  
  1935.  
  1936. Byte
  1937.  
  1938.  
  1939. // Get value of program byte
  1940. //      ea - linear address
  1941. // returns: value of byte. If byte has not a value then returns 0xFF
  1942.  
  1943. long    Byte            (long ea);              // get a byte at ea
  1944.  
  1945.  
  1946. Word
  1947.  
  1948.  
  1949. // Get value of program word (2 bytes)
  1950. //      ea - linear address
  1951. // returns: value of word. If word has not a value then returns 0xFF
  1952.  
  1953. long    Word            (long ea);              // get a word (2 bytes) at ea
  1954.  
  1955.  
  1956. Dword
  1957.  
  1958.  
  1959. // Get value of program double word (4 bytes)
  1960. //      ea - linear address
  1961. // returns: value of double word. If double word has not a value
  1962. // then returns 0xFF
  1963.  
  1964. long    Dword           (long ea);              // get a double-word (4 bytes) at ea
  1965.  
  1966.  
  1967. LocByName
  1968.  
  1969.  
  1970. // Get linear address of a name
  1971. //      name - name of program byte
  1972. // returns: address of the name
  1973. //          BADADDR - no such name
  1974.  
  1975. long    LocByName       (char name);            // BADADDR - no such name
  1976.  
  1977.  
  1978. SegByBase
  1979.  
  1980.  
  1981. // Get segment by segment base
  1982. //      base - segment base paragraph or selector
  1983. // returns: linear address of the start of the segment
  1984. //          BADADDR - no such segment
  1985.  
  1986. long    SegByBase       (long base);            // BADADDR - no such segment
  1987.  
  1988.  
  1989. ScreenEA
  1990.  
  1991.  
  1992. // Get linear address of cursor
  1993.  
  1994. long    ScreenEA        ();                     // the current screen ea
  1995.  
  1996.  
  1997.  
  1998. SelStart
  1999.  
  2000.  
  2001. // Get start address of the selected area
  2002. // returns BADADDR - the user has not selected an area
  2003.  
  2004. long    SelStart        ();                     // the selected area start ea
  2005.                                                 // BADADDR - no selected area
  2006.  
  2007.  
  2008. SelEnd
  2009.  
  2010.  
  2011. // Get end address of the selected area
  2012. // returns BADADDR - the user has not selected an area
  2013.  
  2014. long    SelEnd          ();                     // the selected area end ea
  2015.                                                 // BADADDR - no selected area
  2016.  
  2017.  
  2018. GetReg
  2019.  
  2020.  
  2021. // Get value of segment register at the specified address
  2022. //      ea - linear address
  2023. //      reg - name of segment register
  2024. // returns: value of segment register. The segment registers in 32bit program
  2025. // usually contain selectors, so to get paragraph pointed by the segment
  2026. // register you need to call AskSelector() function.
  2027.  
  2028. long    GetReg          (long ea,char reg);     // get segment register value
  2029.                                                 // BADADDR - undefined or error
  2030.                                                 // (selector, use AskSelector() to
  2031.                                                 //  get its mapping)
  2032.  
  2033.  
  2034. NextAddr
  2035.  
  2036.  
  2037. // Get next addresss in the program
  2038. //      ea - linear address
  2039. // returns: BADADDR - the specified address in the last used address
  2040.  
  2041. long    NextAddr        (long ea);              // returns next defined address
  2042.                                                 // BADADDR if no such address exists
  2043.  
  2044.  
  2045. PrevAddr
  2046.  
  2047.  
  2048. // Get previous addresss in the program
  2049. //      ea - linear address
  2050. // returns: BADADDR - the specified address in the first address
  2051.  
  2052. long    PrevAddr        (long ea);              // returns prev defined address
  2053.                                                 // BADADDR if no such address exists
  2054.  
  2055.  
  2056. NextHead
  2057.  
  2058.  
  2059. // Get next defined item (instruction or data) in the program
  2060. //      ea - linear address
  2061. // returns: BADADDR - no (more) defined items
  2062.  
  2063. long    NextHead        (long ea);              // returns next defined item address
  2064.                                                 // BADADDR if no such address exists
  2065.  
  2066.  
  2067. PrevHead
  2068.  
  2069.  
  2070. // Get previous defined item (instruction or data) in the program
  2071. //      ea - linear address
  2072. // returns: BADADDR - no (more) defined items
  2073.  
  2074. long    PrevHead        (long ea);              // returns prev defined item address
  2075.                                                 // BADADDR if no such address exists
  2076.  
  2077.  
  2078. NextNotTail
  2079.  
  2080.  
  2081. // Get next not-tail address in the program
  2082. // This function searches for the next displayable address in the program.
  2083. // The tail bytes of instructions and data are not displayable.
  2084. //      ea - linear address
  2085. // returns: BADADDR - no (more) not-tail addresses
  2086.  
  2087. long    NextNotTail     (long ea);              // returns next not tail address
  2088.                                                 // BADADDR if no such address exists
  2089.  
  2090.  
  2091. PrevNotTail
  2092.  
  2093.  
  2094. // Get previous not-tail address in the program
  2095. // This function searches for the previous displayable address in the program.
  2096. // The tail bytes of instructions and data are not displayable.
  2097. //      ea - linear address
  2098. // returns: BADADDR - no (more) not-tail addresses
  2099.  
  2100. long    PrevNotTail     (long ea);              // returns prev not tail address
  2101.                                                 // BADADDR if no such address exists
  2102.  
  2103.  
  2104.  
  2105. ItemEnd
  2106.  
  2107.  
  2108. // Get address of the end of the item (instruction or data)
  2109. //      ea - linear address
  2110. // returns: address past end of the item at 'ea'
  2111.  
  2112. long    ItemEnd         (long ea);              // returns address past end of
  2113.                                                 // the item
  2114.  
  2115.  
  2116. ItemSize
  2117.  
  2118.  
  2119. // Get size of instruction or data item in bytes
  2120. //      ea - linear address
  2121. // returns: 1..n
  2122.  
  2123. long    ItemSize        (long ea);              // returns item size, min answer=1
  2124.  
  2125.  
  2126. Name
  2127.  
  2128.  
  2129. // Get visible name of program byte
  2130. // This function returns name of byte as it is displayed on the screen.
  2131. // If a name contains illegal characters, IDA replaces them by the substitution
  2132. // character during displaying. See IDA.CFG for the definition of the
  2133. // substitution character.
  2134. //      ea - linear address
  2135. // returns: "" - byte has no name
  2136.  
  2137. char    Name            (long ea);              // get visible name of the byte
  2138.  
  2139.  
  2140. GetTrueName
  2141.  
  2142.  
  2143. // Get true name of program byte
  2144. // This function returns name of byte as is without any replacements.
  2145. //      ea - linear address
  2146. // returns: "" - byte has no name
  2147.  
  2148. char    GetTrueName     (long ea);              // get true name of the byte
  2149.  
  2150.  
  2151. GetMnem
  2152.  
  2153.  
  2154. // Get mnemonics of instruction
  2155. //      ea - linear address of instruction
  2156. // returns: "" - no instruction at the specified location
  2157. // note: this function may not return exactly the same mnemonics
  2158. // as you see on the screen.
  2159.  
  2160. char    GetMnem         (long ea);              // get instruction name
  2161.  
  2162.  
  2163. GetOpnd
  2164.  
  2165.  
  2166. // Get operand of an instruction
  2167. //      ea - linear address of instruction
  2168. //      n  - number of operand:
  2169. //              0 - the first operand
  2170. //              1 - the second operand
  2171. // returns: the current text representation of operand
  2172.  
  2173. char    GetOpnd         (long ea,long n);       // get instruction operand
  2174.                                                 // n=0 - first operand
  2175.  
  2176.  
  2177. GetOpType
  2178.  
  2179.  
  2180. // Get type of instruction operand
  2181. //      ea - linear address of instruction
  2182. //      n  - number of operand:
  2183. //              0 - the first operand
  2184. //              1 - the second operand
  2185. // returns:
  2186. //      -1      bad operand number passed
  2187. //      0       None
  2188. //      1       General Register (al,ax,es,ds...)
  2189. //      2       Memory Reference
  2190. //      3       Base + Index
  2191. //      4       Base + Index + Displacement
  2192. //      5       Immediate
  2193. //      6       Immediate Far Address
  2194. //      7       Immediate Near Address
  2195. //      8       FPP register
  2196. //      9       386 control register
  2197. //      10      386 debug register
  2198. //      11      386 trace register
  2199. //      12      Condition (for Z80)
  2200. //      13      bit (8051)
  2201. //      14      bitnot (8051)
  2202.  
  2203. long    GetOpType       (long ea,long n);       // get operand type
  2204.  
  2205.  
  2206. GetOperandValue
  2207.  
  2208.  
  2209. // Get number used in the operand
  2210. // This function returns an immediate number used in the operand
  2211. //      ea - linear address of instruction
  2212. //      n  - number of operand:
  2213. //              0 - the first operand
  2214. //              1 - the second operand
  2215. // If the operand doesn't contain a number, it returns -1.
  2216.  
  2217. long    GetOperandValue (long ea,long n);       // get instruction operand value
  2218.  
  2219.  
  2220. LineA
  2221.  
  2222.  
  2223. // Get anterior comment line
  2224. //      ea - linear address
  2225. //      num - number of anterior line (0..100)
  2226.  
  2227. char    LineA           (long ea,long num);     // get additional line before generated ones
  2228.  
  2229.  
  2230. LineB
  2231.  
  2232.  
  2233. // Get posterior comment line
  2234. //      ea - linear address
  2235. //      num - number of posterior line (0..100)
  2236.  
  2237. char    LineB           (long ea,long num);     // get additional line after generated ones
  2238.  
  2239.  
  2240. Comment
  2241.  
  2242.  
  2243. // Get regular indented comment
  2244. //      ea - linear address
  2245.  
  2246. char    Comment         (long ea);              // get comment
  2247.  
  2248.  
  2249. RptCmt
  2250.  
  2251.  
  2252. // Get repeatable indented comment
  2253. //      ea - linear address
  2254.  
  2255. char    RptCmt          (long ea);              // get repeatable comment
  2256.  
  2257.  
  2258. AltOp
  2259.  
  2260.  
  2261. // Get manually entered operand string
  2262. //      ea - linear address
  2263. //      n  - number of operand:
  2264. //              0 - the first operand
  2265. //              1 - the second operand
  2266.  
  2267. char    AltOp           (long ea,long n);       // get manually entered operand
  2268.  
  2269.  
  2270. Find
  2271.  
  2272.  
  2273. //
  2274. //      The following functions search for the specified byte
  2275. //              ea - address to start from
  2276. //              flag |=1 - search forward
  2277. //              flag |=2 - search case-sensitive (only for FindText)
  2278. //      return BADADDR - not found
  2279. //
  2280. long    FindVoid        (long ea,long flag);
  2281. long    FindCode        (long ea,long flag);
  2282. long    FindData        (long ea,long flag);
  2283. long    FindProc        (long ea,long flag);
  2284. long    FindUnexplored  (long ea,long flag);
  2285. long    FindExplored    (long ea,long flag);
  2286. long    FindImmediate   (long ea,long flag,long value);
  2287. long    FindText        (long ea,long flag,long y,long x,char str);
  2288.                 // y - number of text line at ea to start from (0..100)
  2289.                 // x - x coordinate in this line
  2290. long    FindBinary      (long ea,long flag,char str);
  2291.                 // str - a string as a user enters it for Search Text in Core
  2292.                 //      example:  "41 42" - find 2 bytes 41h,42h
  2293.                 // The default radix depends on the current IDP module
  2294.                 // (radix for ibm pc is 16)
  2295.  
  2296.  
  2297.  
  2298. Prm
  2299.  
  2300.  
  2301. // The following functions allow you to set/get common parameters.
  2302.  
  2303. long    GetLongPrm (long offset);
  2304. long    GetShortPrm(long offset);
  2305. long    GetCharPrm (long offset);
  2306. success SetLongPrm (long offset,long value);
  2307. success SetShortPrm(long offset,long value);
  2308. success SetCharPrm (long offset,long value);
  2309.  
  2310. // 'offset' may be one of the following:
  2311.  
  2312. INF_VERSION     // short; Version of database
  2313. INF_PROCNAME    // char[8]; Name of current processor
  2314. INF_LFLAGS      // char;  IDP-dependent flags
  2315.   LFLG_PC_FPP   //          decode floating point processor
  2316.                 //          instructions?
  2317.   LFLG_PC_FLAT  //          Flat model?
  2318. INF_DEMNAMES    // char;  display demangled names as:
  2319.   DEMNAM_CMNT   //          comments
  2320.   DEMNAM_NAME   //          regular names
  2321.   DEMNAM_NONE   //          don't display
  2322. INF_FILETYPE    // short; type of input file (see core.hpp)
  2323.   FT_EXE        //          MS DOS EXE File
  2324.   FT_COM        //          MS DOS COM File
  2325.   FT_BIN        //          Binary File
  2326.   FT_DRV        //          MS DOS Driver
  2327.   FT_WIN        //          New Executable (NE)
  2328.   FT_HEX        //          Intel Hex Object File
  2329.   FT_MEX        //          MOS Technology Hex Object File
  2330.   FT_LX         //          Linear Executable (LX)
  2331.   FT_LE         //          Linear Executable (LE)
  2332.   FT_NLM        //          Netware Loadable Module (NLM)
  2333.   FT_COFF       //          Common Object File Format (COFF)
  2334.   FT_PE         //          Portable Executable (PE)
  2335.   FT_USER       //          file is loaded using IDP loader function
  2336.   FT_OMF        //          Object Module Format
  2337.   FT_SREC       //          R-records
  2338.   FT_ZIP        //          ZIP file
  2339.   FT_OMFLIB     //          Library of OMF Modules
  2340.   FT_AR         //          ar library
  2341.   FT_LOADER     //          file is loaded using LOADER DLL
  2342.   FT_ELF        //          Executable and Linkable Format (ELF)
  2343.   FT_W32RUN     //          Watcom DOS32 Extender (W32RUN)
  2344.   FT_AOUT       //          Linux a.out (AOUT)
  2345. INF_OSTYPE      // short; OS type the program is for
  2346.   OSTYPE_MSDOS
  2347.   OSTYPE_WIN
  2348.   OSTYPE_OS2
  2349.   OSTYPE_NETW
  2350. INF_APPTYPE     // short; Application type
  2351.   APPT_CONSOLE  //          console
  2352.   APPT_GRAPHIC  //          graphics
  2353.   APPT_PROGRAM  //          EXE
  2354.   APPT_LIBRARY  //          DLL
  2355.   APPT_DRIVER   //          DRIVER
  2356.   APPT_1THREAD  //          Singlethread
  2357.   APPT_MTHREAD  //          Multithread
  2358.   APPT_16BIT    //          16 bit application
  2359.   APPT_32BIT    //          32 bit application
  2360. INF_START_SP    // long;  SP register value at the start of
  2361.                 //        program execution
  2362. INF_START_AF    // short; Analysis flags:
  2363.   AF_FIXUP      //          Create offsets and segments using fixup info
  2364.   AF_MARKCODE   //          Mark typical code sequences as code
  2365.   AF_UNK        //          Delete instructions with no xrefs
  2366.   AF_CODE       //          Trace execution flow
  2367.   AF_PROC       //          Create functions if call is present
  2368.   AF_USED       //          Analyse and create all xrefs
  2369.   AF_FLIRT      //          Use flirt signatures
  2370.   AF_PROCPTR    //          Create function if data xref data->code32 exists
  2371.   AF_JFUNC      //          Rename jump functions as j_...
  2372.   AF_NULLSUB    //          Rename empty functions as nullsub_...
  2373.   AF_LVAR       //          Create stack variables
  2374.   AF_TRACE      //          Trace stack pointer
  2375.   AF_ASCII      //          Create ascii string if data xref exists
  2376.   AF_IMMOFF     //          Convert 32bit instruction operand to offset
  2377.   AF_DREFOFF    //          Create offset if data xref to seg32 exists
  2378.   AF_FINAL      //          Final pass of analysis
  2379. INF_START_IP    // long;  IP register value at the start of
  2380.                 //        program execution
  2381. INF_BEGIN_EA    // long;  Linear address of program entry point
  2382. INF_MIN_EA      // long;  The lowest address used
  2383.                 //        in the program
  2384. INF_MAX_EA      // long;  The highest address used
  2385.                 //        in the program - 1
  2386. INF_LOW_OFF     // long;  low limit of voids
  2387. INF_HIGH_OFF    // long;  high limit of voids
  2388. INF_MAXREF      // long;  max xref depth
  2389. INF_ASCII_BREAK // char;  ASCII line break symbol
  2390. INF_INDENT      // char;  Indention for instructions
  2391. INF_COMMENT     // char;  Indention for comments
  2392. INF_XREFNUM     // char;  Number of references to generate
  2393.                 //        0 - xrefs won't be generated at all
  2394. INF_ENTAB       // char;  Use '\t' chars in the output file?
  2395. INF_VOIDS       // char;  Display void marks?
  2396. INF_SHOWAUTO    // char;  Display autoanalysis indicator?
  2397. INF_AUTO        // char;  Autoanalysis is enabled?
  2398. INF_BORDER      // char;  Generate borders?
  2399. INF_NULL        // char;  Generate empty lines?
  2400. INF_SHOWPREF    // char;  Show line prefixes?
  2401. INF_PREFSEG     // char;  line prefixes with segment name?
  2402. INF_ASMTYPE     // char;  target assembler number (0..n)
  2403. INF_BASEADDR    // long;  base paragraph of the program
  2404. INF_XREFS       // char;  xrefs representation:
  2405.   SW_SEGXRF     //          show segments in xrefs?
  2406.   SW_XRFMRK     //          show xref type marks?
  2407.   SW_XRFFNC     //          show function offsets?
  2408.   SW_XRFVAL     //          show xref values? (otherwise-"...")
  2409. INF_BINPREF     // short; # of instruction bytes to show
  2410.                 //          in line prefix
  2411. INF_CMTFLAG     // char;  comments:
  2412.   SW_RPTCMT     //          show repeatable comments?
  2413.   SW_ALLCMT     //          comment all lines?
  2414.   SW_NOCMT      //          no comments at all
  2415.   SW_LINNUM     //          show source line numbers
  2416. INF_NAMETYPE    // char;  dummy names represenation type
  2417.   NM_REL_OFF
  2418.   NM_PTR_OFF
  2419.   NM_NAM_OFF
  2420.   NM_REL_EA
  2421.   NM_PTR_EA
  2422.   NM_NAM_EA
  2423.   NM_EA
  2424.   NM_EA4
  2425.   NM_EA8
  2426.   NM_SHORT
  2427.   NM_SERIAL
  2428. INF_SHOWBADS    // char;  show bad instructions?
  2429.                 //        an instruction is bad if it appears
  2430.                 //        in the ash.badworks array
  2431.  
  2432. INF_PREFFLAG    // char;  line prefix type:
  2433.   PREF_SEGADR   //          show segment addresses?
  2434.   PREF_FNCOFF   //          function offsets?
  2435.  
  2436. INF_PACKBASE    // char;  pack database?
  2437.  
  2438. INF_ASCIIFLAGS  // uchar; ascii flags
  2439.   ASCF_GEN      //          generate ASCII names?
  2440.   ASCF_AUTO     //          ASCII names have 'autogenerated' bit?
  2441.   ASCF_SERIAL   //          generate serial names?
  2442.  
  2443. INF_LISTNAMES   // uchar; What names should be included in the list?
  2444.   LN_NORMAL     //          normal names
  2445.   LN_PUBLIC     //          public names
  2446.   LN_AUTO       //          autogenerated names
  2447.   LN_WEAK       //          weak names
  2448.  
  2449. INF_START_SS    // long;
  2450. INF_START_CS    // long;
  2451. INF_STRTYPE     // ulong; current ascii string type
  2452.   ASCSTR_TERMCHR//          Character-terminated ASCII string
  2453.                 //          The termination characters are kept in
  2454.                 //          the next bytes of string type
  2455.   STRTERM1(strtype) ((strtype>>8)&0xFF)
  2456.   STRTERM2(strtype) ((strtype>>16)&0xFF)
  2457.                 //          if the second termination character is
  2458.                 //          '\0', then it doesn't exist.
  2459.   ASCSTR_PASCAL //          Pascal-style ASCII string (length byte)
  2460.   ASCSTR_LEN2   //          Pascal-style, length has 2 bytes
  2461.   ASCSTR_UNICODE//          Unicode string
  2462. INF_AF2         // ushort;Analysis flags 2
  2463.   AF2_JUMPTBL   //          Locate and create jump tables
  2464. -------------------------------------------------
  2465.  
  2466.  
  2467. SetPrcsr
  2468.  
  2469.  
  2470. // Change current processor
  2471. //      processor - name of processor in short form.
  2472. //                  run 'ida ?' to get list of allowed processor types
  2473.  
  2474. success SetPrcsr        (char processor);       // set processor type
  2475.  
  2476.  
  2477. Direction
  2478.  
  2479.  
  2480. // Set current search direction
  2481. //      direction: 1 - down
  2482. //                -1 - up
  2483. // returns old value of direction flag
  2484.  
  2485. long    Direction       (long direction);
  2486.  
  2487.  
  2488. Batch
  2489.  
  2490.  
  2491. // Enable/disable batch mode of operation
  2492. //      batch:  0 - ida will display dialog boxes and wait for the user input
  2493. //              1 - ida will not display dialog boxes, warnings, etc.
  2494. // returns: old balue of batch flag
  2495.  
  2496. long    Batch           (long batch);           // enable/disable batch mode
  2497.                                                 // returns old value
  2498.  
  2499.  
  2500. Asks
  2501.  
  2502.  
  2503. char    AskStr          (char defval,char prompt); // ask a string
  2504. char    AskFile         (char mask,char prompt);   // ask a file name
  2505. long    AskAddr         (long defval,char prompt); // BADADDR - no or bad input
  2506. long    AskSeg          (long defval,char prompt); // BADADDR - no or bad input
  2507. char    AskIdent        (char defval,char prompt);
  2508. long    AskYN           (long defval,char prompt); // -1:cancel,0-no,1-ok
  2509. void    Message         (char format,...); // show a message in msg window
  2510. void    Warning         (char format,...); // show a warning a dialog box
  2511. void    Fatal           (char format,...); // exit IDA immediately
  2512.  
  2513.  
  2514. AskSelector
  2515.  
  2516.  
  2517. ***********************************************
  2518. ** get a selector value
  2519.         arguments:      sel - the selector
  2520.         returns:        selector value if found
  2521.                         otherwise the input value (sel)
  2522.         note:           selector values are always in paragraphs
  2523.  
  2524. long    AskSelector     (long sel);     // returns paragraph
  2525.  
  2526.  
  2527. FindSelector
  2528.  
  2529.  
  2530. ***********************************************
  2531. ** find a selector which has the specifed value
  2532.         arguments:      val - value to search for
  2533.         returns:        selector if found
  2534.                         otherwise the input value (val)
  2535.         note:           selector values are always in paragraphs
  2536.  
  2537. long    FindSelector    (long val);
  2538.  
  2539.  
  2540. SetSelector
  2541.  
  2542.  
  2543. ***********************************************
  2544. ** set a selector value
  2545.         arguments:      sel - the selector, should be
  2546.                         less than 0xFFFF
  2547.                         val - new value of selector
  2548.         returns:        nothing
  2549.         note:           ida supports up to 64 selectors.
  2550.                         if 'sel' == 'val' then the
  2551.                         selector is destroyed because
  2552.                         it has no importance
  2553.  
  2554. void    SetSelector     (long sel,long value);
  2555.  
  2556.  
  2557. DelSelector
  2558.  
  2559.  
  2560. ***********************************************
  2561. ** delete a selector
  2562.         arguments:      sel - the selector to delete
  2563.         returns:        nothing
  2564.         note:           if the selector is found, it will
  2565.                         be deleted
  2566.  
  2567. void    DelSelector     (long sel);
  2568.  
  2569.  
  2570. FirstSeg
  2571.  
  2572.  
  2573. // Get first segment
  2574. // returns: linear address of the start of the first segment
  2575. // BADADDR - no segments are defined
  2576.  
  2577. long    FirstSeg        ();             // returns start of the first
  2578.                                         // segment, BADADDR - no segments
  2579.  
  2580.  
  2581. NextSeg
  2582.  
  2583.  
  2584. // Get next segment
  2585. //      ea - linear address
  2586. // returns: start of the next segment
  2587. //          BADADDR - no next segment
  2588.  
  2589. long    NextSeg         (long ea);      // returns start of the next
  2590.                                         // segment, BADADDR - no more segs
  2591.  
  2592.  
  2593.  
  2594. SegStart
  2595.  
  2596.  
  2597. // Get start address of a segment
  2598. //      ea - any address in the segment
  2599. // returns: start of segment
  2600. //          BADADDR - the specified address doesn't belong to any segment
  2601.  
  2602. long    SegStart        (long ea);      // returns start of the segment
  2603.                                         // BADADDR if bad address passed
  2604.  
  2605.  
  2606. SegEnd
  2607.  
  2608.  
  2609. // Get end address of a segment
  2610. //      ea - any address in the segment
  2611. // returns: end of segment (an address past end of the segment)
  2612. //          BADADDR - the specified address doesn't belong to any segment
  2613.  
  2614. long    SegEnd          (long ea);      // return end of the segment
  2615.                                         // this address doesn't belong
  2616.                                         // to the segment
  2617.                                         // BADADDR if bad address passed
  2618.  
  2619.  
  2620. SegName
  2621.  
  2622.  
  2623. // Get name of a segment
  2624. //      ea - any address in the segment
  2625. // returns: "" - no segment at the specified address
  2626.  
  2627. char    SegName         (long ea);              // returns name of the segment
  2628.                                                 // "" if bad address passed
  2629.  
  2630.  
  2631.  
  2632. SegCreate
  2633.  
  2634.  
  2635. // Create a new segment
  2636. //      startea  - linear address of the start of the segment
  2637. //      endea    - linear address of the end of the segment
  2638. //                 this address will not belong to the segment
  2639. //                 'endea' should be higher than 'startea'
  2640. //      base     - base paragraph or selector of the segment.
  2641. //                 a paragraph is 16byte memory chunk.
  2642. //                 If a selector value is specified, the selector should be
  2643. //                 already defined.
  2644. //      use32    - 0: 16bit segment, 1: 32bit segment
  2645. //      align    - segment alignment. see below for alignment values
  2646. //      comb     - segment combination. see below for combination values.
  2647. // returns: 0-failed, 1-ok
  2648.  
  2649. success SegCreate(long startea,long endea,long base,
  2650.                                            long use32,long align,long comb);
  2651.  
  2652.  
  2653.  
  2654. SegDelete
  2655.  
  2656.  
  2657. // Delete a segment
  2658. //   ea      - any address in the segment
  2659. //   disable - 1: discard all bytes of the segment from the disassembled text
  2660. //             0: retain byte values
  2661.  
  2662. success SegDelete       (long ea,long disable);
  2663.  
  2664.  
  2665.  
  2666. SegBounds
  2667.  
  2668.  
  2669. // Change segment boundaries
  2670. //   ea      - any address in the segment
  2671. //   startea - new start address of the segment
  2672. //   endea   - new end address of the segment
  2673. //   disable - discard bytes that go out of the segment
  2674.  
  2675. success SegBounds       (long ea,long startea,long endea,long disable);
  2676.  
  2677.  
  2678.  
  2679. SegRename
  2680.  
  2681.  
  2682. // Change name of the segment
  2683. //   ea      - any address in the segment
  2684. //   name    - new name of the segment
  2685.  
  2686. success SegRename       (long ea,char name);
  2687.  
  2688.  
  2689. SegClass
  2690.  
  2691.  
  2692. // Change class of the segment
  2693. //   ea      - any address in the segment
  2694. //   class   - new class of the segment
  2695.  
  2696. success SegClass        (long ea,char class);
  2697.  
  2698.  
  2699. SegAlign
  2700.  
  2701.  
  2702. // Change alignment of the segment
  2703. //   ea      - any address in the segment
  2704. //   align   - new alignment of the segment
  2705.  
  2706. success SegAlign        (long ea,long alignment);
  2707.  
  2708. #define saAbs      0    // Absolute segment.
  2709. #define saRelByte  1    // Relocatable, byte aligned.
  2710. #define saRelWord  2    // Relocatable, word (2-byte, 16-bit) aligned.
  2711. #define saRelPara  3    // Relocatable, paragraph (16-byte) aligned.
  2712. #define saRelPage  4    // Relocatable, aligned on 256-byte boundary (a "page"
  2713.                         // in the original Intel specification).
  2714. #define saRelDble  5    // Relocatable, aligned on a double word (4-byte)
  2715.                         // boundary. This value is used by the PharLap OMF for
  2716.                         // the same alignment.
  2717. #define saRel4K    6    // This value is used by the PharLap OMF for page (4K)
  2718.                         // alignment. It is not supported by LINK.
  2719. #define saGroup    7    // Segment group
  2720. #define saRel32Bytes 8  // 32 bytes
  2721. #define saRel64Bytes 9  // 64 bytes
  2722. #define saRelQword 10   // 8 bytes
  2723.  
  2724.  
  2725. SegComb
  2726.  
  2727.  
  2728. // Change combination of the segment
  2729. //   ea      - any address in the segment
  2730. //   comb    - new combination of the segment
  2731.  
  2732. success SegComb         (long segea,long comb);
  2733.  
  2734. #define scPriv     0    // Private. Do not combine with any other program
  2735.                         // segment.
  2736. #define scPub      2    // Public. Combine by appending at an offset that meets
  2737.                         // the alignment requirement.
  2738. #define scPub2     4    // As defined by Microsoft, same as C=2 (public).
  2739. #define scStack    5    // Stack. Combine as for C=2. This combine type forces
  2740.                         // byte alignment.
  2741. #define scCommon   6    // Common. Combine by overlay using maximum size.
  2742. #define scPub3     7    // As defined by Microsoft, same as C=2 (public).
  2743.  
  2744.  
  2745. SegAddrng
  2746.  
  2747.  
  2748. // Change segment addressing
  2749. //   ea      - any address in the segment
  2750. //   use32   - 0: 16bit, 1: 32bit
  2751.  
  2752. success SegAddrng       (long ea,long use32);
  2753.  
  2754.  
  2755. SegByName
  2756.  
  2757.  
  2758. // Get segment by name
  2759. //      segname - name of segment
  2760. // returns: segment base address or BADADDR
  2761.  
  2762. long    SegByName       (char segname);         // returns segment base
  2763.  
  2764.  
  2765. SegDefReg
  2766.  
  2767.  
  2768. // Set default segment register value for a segment
  2769. //   ea      - any address in the segment
  2770. //   reg     - name of segment register
  2771. //   value   - default value of segment register. -1-undefined.
  2772.  
  2773. success SegDefReg       (long ea,char reg,long value);
  2774.  
  2775.  
  2776. SetSegmentType
  2777.  
  2778.  
  2779. ***********************************************
  2780. ** set segment type
  2781.         arguments:      segea - any address within segment
  2782.                         type  - new segment type:
  2783. #define SEG_NORM        0
  2784. #define SEG_XTRN        1       // * segment with 'extern' definitions
  2785.                                 //   no instructions are allowed
  2786. #define SEG_CODE        2       // pure code segment
  2787. #define SEG_DATA        3       // pure data segment
  2788. #define SEG_IMP         4       // implementation segment
  2789. #define SEG_GRP         6       // * group of segments
  2790.                                 //   no instructions are allowed
  2791. #define SEG_NULL        7       // zero-length segment
  2792. #define SEG_UNDF        8       // undefined segment type
  2793. #define SEG_BSS         9       // uninitialized segment
  2794. #define SEG_ABSSYM     10       // * segment with definitions of absolute symbols
  2795.                                 //   no instructions are allowed
  2796. #define SEG_COMM       11       // * segment with communal definitions
  2797.                                 //   no instructions are allowed
  2798.  
  2799.         returns:        !=0 - ok
  2800.  
  2801. success SetSegmentType  (long segea,long type);
  2802.  
  2803.  
  2804. GetSegmentAttr
  2805.  
  2806.  
  2807. ***********************************************
  2808. ** get segment attribute
  2809.         arguments:      segea - any address within segment
  2810.  
  2811. long    GetSegmentAttr  (long segea,long attr);
  2812.  
  2813. #define  SEGATTR_ALIGN  20      // alignment
  2814. #define  SEGATTR_COMB   21      // combination
  2815. #define  SEGATTR_PERM   22      // permissions
  2816. #define  SEGATTR_USE32  23      // use32 (32-bit segment?)
  2817. #define  SEGATTR_FLAGS  24      // segment flags
  2818. #define  SEGATTR_SEL    26      // segment selector
  2819. #define  SEGATTR_DEF_ES 28      // default ES value
  2820. #define  SEGATTR_DEF_CS 30      // default CS value
  2821. #define  SEGATTR_DEF_SS 32      // default SS value
  2822. #define  SEGATTR_DEF_DS 34      // default DS value
  2823. #define  SEGATTR_DEF_FS 36      // default FS value
  2824. #define  SEGATTR_DEF_GS 38      // default GS value
  2825. #define  SEGATTR_TYPE   40      // segment type
  2826.  
  2827.  
  2828.  
  2829. Xrefs
  2830.  
  2831.  
  2832. //      Flow types:
  2833. #define fl_CF   16              // Call Far
  2834. #define fl_CN   17              // Call Near
  2835. #define fl_JF   18              // Jump Far
  2836. #define fl_JN   19              // Jump Near
  2837. #define fl_US   20              // User specified
  2838. #define fl_F    21              // Ordinary flow
  2839.                                         // Mark exec flow 'from' 'to'
  2840. void    AddCodeXref(long From,long To,long flowtype);
  2841. long    DelCodeXref(long From,long To,int undef);// Unmark exec flow 'from' 'to'
  2842.                                         // undef - make 'To' undefined if no
  2843.                                         //        more references to it
  2844.                                         // returns 1 - planned to be
  2845.                                         // made undefined
  2846.  
  2847. // The following functions include the ordinary flows:
  2848. long    Rfirst  (long From);            // Get first xref from 'From'
  2849. long    Rnext   (long From,long current);// Get next xref from
  2850. long    RfirstB (long To);              // Get first xref to 'To'
  2851. long    RnextB  (long To,long current); // Get next xref to 'To'
  2852.  
  2853. // The following functions don't take into account the ordinary flows:
  2854. long    Rfirst0 (long From);
  2855. long    Rnext0  (long From,long current);
  2856. long    RfirstB0(long To);
  2857. long    RnextB0 (long To,long current);
  2858.  
  2859. //      Data reference types:
  2860. #define dr_O    1                       // Offset
  2861. #define dr_W    2                       // Write
  2862. #define dr_R    3                       // Read
  2863. #define dr_T    4                       // Text (names in manual operands)
  2864.  
  2865. void    add_dref(long From,long To,long drefType);      // Create Data Ref
  2866. void    del_dref(long From,long To);    // Unmark Data Ref
  2867.  
  2868. long    Dfirst  (long From);            // Get first refered address
  2869. long    Dnext   (long From,long current);
  2870. long    DfirstB (long To);              // Get first referee address
  2871. long    DnextB  (long To,long current);
  2872.  
  2873. long    XrefType(void);                 // returns type of the last xref
  2874.                                         // obtained by [RD]first/next[B0]
  2875.                                         // functions. Return values
  2876.                                         // are fl_... or dr_...
  2877.  
  2878. // set number of displayed xrefs
  2879. #define XrefShow(x)             SetCharPrm(INF_XREFNUM,x)
  2880.  
  2881.  
  2882. fopen
  2883.  
  2884.  
  2885. ***********************************************
  2886. ** open a file
  2887.         arguments: similiar to C fopen()
  2888.         returns:        0 -error
  2889.                         otherwise a file handle
  2890.  
  2891. long    fopen           (char file,char mode);
  2892.  
  2893.  
  2894. fclose
  2895.  
  2896.  
  2897. ***********************************************
  2898. ** close a file
  2899.         arguments:      file handle
  2900.         returns:        nothing
  2901.  
  2902. void    fclose          (long handle);
  2903.  
  2904.  
  2905. filelength
  2906.  
  2907.  
  2908. ***********************************************
  2909. ** get file length
  2910.         arguments:      file handle
  2911.         returns:        -1 - error
  2912.                         otherwise file length in bytes
  2913.  
  2914. long    filelength      (long handle);
  2915.  
  2916.  
  2917. fseek
  2918.  
  2919.  
  2920. ***********************************************
  2921. ** set cursor position in the file
  2922.         arguments:      handle  - file handle
  2923.                         offset  - offset from origin
  2924.                         origin  - 0 = from start of file
  2925.                                   1 = from current cursor position
  2926.                                   2 = from end of file
  2927.         returns:        0 - ok
  2928.                         otherwise error
  2929.  
  2930. long    fseek           (long handle,long offset,long origin);
  2931.  
  2932.  
  2933. ftell
  2934.  
  2935.  
  2936. ***********************************************
  2937. ** get cursor position in the file
  2938.         arguments:      file handle
  2939.         returns:        -1 - error
  2940.                         otherwise current cursor position
  2941.  
  2942. long    ftell           (long handle);
  2943.  
  2944.  
  2945. loadfile
  2946.  
  2947.  
  2948. ***********************************************
  2949. ** load file into IDA database
  2950.         arguments:      handle  - file handle
  2951.                         pos     - position in the file
  2952.                         ea      - linear address to load
  2953.                         size    - number of bytes to load
  2954.         returns:        0 - error
  2955.                         1 - ok
  2956.  
  2957. success loadfile        (long handle,long pos,long ea,long size);
  2958.  
  2959.  
  2960. savefile
  2961.  
  2962.  
  2963. ***********************************************
  2964. ** save from IDA database to file
  2965.         arguments:      handle  - file handle
  2966.                         pos     - position in the file
  2967.                         ea      - linear address to save from
  2968.                         size    - number of bytes to save
  2969.         returns:        0 - error
  2970.                         1 - ok
  2971.  
  2972. success savefile        (long handle,long pos,long ea,long size);
  2973.  
  2974.  
  2975. fgetc
  2976.  
  2977.  
  2978. ***********************************************
  2979. ** read one byte from file
  2980.         arguments:      handle  - file handle
  2981.         returns:        -1 - error
  2982.                         otherwise a byte read.
  2983.  
  2984. long    fgetc           (long handle);
  2985.  
  2986.  
  2987. fputc
  2988.  
  2989.  
  2990. ***********************************************
  2991. ** write one byte to file
  2992.         arguments:      handle  - file handle
  2993.                         byte    - byte to write
  2994.         returns:        0 - ok
  2995.                         -1 - error
  2996.  
  2997. long    fputc           (long byte,long handle);
  2998.  
  2999.  
  3000. fprintf
  3001.  
  3002.  
  3003. ***********************************************
  3004. ** fprintf
  3005.         arguments:      handle  - file handle
  3006.                         format  - format string
  3007.         returns:        0 - ok
  3008.                         -1 - error
  3009.  
  3010. long    fprintf         (long handle,char format,...);
  3011.  
  3012.  
  3013. readshort
  3014.  
  3015.  
  3016. ***********************************************
  3017. ** read 2 bytes from file
  3018.         arguments:      handle  - file hanlde
  3019.                         mostfirst 0 - least significant byte is first (intel)
  3020.                                   1 - most  significant byte is first
  3021.         returns:        -1 - error
  3022.                         otherwise: a 16-bit value
  3023.  
  3024. long    readshort       (long handle,long mostfirst);
  3025.  
  3026.  
  3027. readlong
  3028.  
  3029.  
  3030. ***********************************************
  3031. ** read 4 bytes from file
  3032.         arguments:      handle  - file hanlde
  3033.                         mostfirst 0 - least significant byte is first (intel)
  3034.                                   1 - most  significant byte is first
  3035.         returns:        a 32-bit value
  3036.  
  3037. long    readlong        (long handle,long mostfirst);
  3038.  
  3039.  
  3040. writeshort
  3041.  
  3042.  
  3043. ***********************************************
  3044. ** write 2 bytes to file
  3045.         arguments:      handle  - file hanlde
  3046.                         word    - a 16-bit value to write
  3047.                         mostfirst 0 - least significant byte is first (intel)
  3048.                                   1 - most  significant byte is first
  3049.         returns:        0 - ok
  3050.  
  3051. long    writeshort      (long handle,long word,long mostfirst);
  3052.  
  3053.  
  3054. writelong
  3055.  
  3056.  
  3057. ***********************************************
  3058. ** write 4 bytes to file
  3059.         arguments:      handle  - file hanlde
  3060.                         dword   - a 32-bit value to write
  3061.                         mostfirst 0 - least significant byte is first (intel)
  3062.                                   1 - most  significant byte is first
  3063.         returns:        0 - ok
  3064.  
  3065. long    writelong       (long handle,long dword,long mostfirst);
  3066.  
  3067.  
  3068. readstr
  3069.  
  3070.  
  3071. ***********************************************
  3072. ** read a string from file
  3073.         arguments:      handle  - file hanlde
  3074.         returns:        a string
  3075.                         on EOF, returns -1
  3076.  
  3077. char    readstr         (long handle);
  3078.  
  3079.  
  3080. writestr
  3081.  
  3082.  
  3083. ***********************************************
  3084. ** write a string to file
  3085.         arguments:      handle  - file hanlde
  3086.                         str     - string to write
  3087.         returns:        0 - ok
  3088.  
  3089. long    writestr        (long handle,char str);
  3090.  
  3091.  
  3092. MakeFunction
  3093.  
  3094.  
  3095. ***********************************************
  3096. ** create a function
  3097.         arguments:      start,end - function bounds
  3098.         returns:        !=0 - ok
  3099.  
  3100. success MakeFunction(long start,long end);
  3101.  
  3102.  
  3103. DelFunction
  3104.  
  3105.  
  3106. ***********************************************
  3107. ** delete a function
  3108.         arguments:      ea - any address belonging to the function
  3109.         returns:        !=0 - ok
  3110.  
  3111. success DelFunction(long ea);
  3112.  
  3113.  
  3114. SetFunctionEnd
  3115.  
  3116.  
  3117. ***********************************************
  3118. ** change function end address
  3119.         arguments:      ea - any address belonging to the function
  3120.                         end - new function end address
  3121.         returns:        !=0 - ok
  3122.  
  3123. success SetFunctionEnd(long ea,long end);
  3124.  
  3125.  
  3126. NextFunction
  3127.  
  3128.  
  3129. ***********************************************
  3130. ** find next function
  3131.         arguments:      ea - any address belonging to the function
  3132.         returns:        -1 - no more functions
  3133.                         otherwise returns the next function start address
  3134.  
  3135. long NextFunction(long ea);
  3136.  
  3137.  
  3138. PrevFunction
  3139.  
  3140.  
  3141. ***********************************************
  3142. ** find previous function
  3143.         arguments:      ea - any address belonging to the function
  3144.         returns:        -1 - no more functions
  3145.                         otherwise returns the previous function start address
  3146.  
  3147. long PrevFunction(long ea)
  3148.  
  3149.  
  3150. GetFunctionFlags
  3151.  
  3152.  
  3153. ***********************************************
  3154. ** retrieve function flags
  3155.         arguments:      ea - any address belonging to the function
  3156.         returns:        -1 - function doesn't exist
  3157.                         otherwise returns the flags:
  3158. #define FUNC_NORET      0x00000001L     // function doesn't return
  3159. #define FUNC_FAR        0x00000002L     // far function
  3160. #define FUNC_LIB        0x00000004L     // library function
  3161. #define FUNC_STATIC     0x00000008L     // static function
  3162.  
  3163. long GetFunctionFlags(long ea);
  3164.  
  3165.  
  3166. SetFunctionFlags
  3167.  
  3168.  
  3169. ***********************************************
  3170. ** change function flags
  3171.         arguments:      ea - any address belonging to the function
  3172.                         flags - see GetFunctionFlags() for explanations
  3173.         returns:        !=0 - ok
  3174.  
  3175. success SetFunctionFlags(long ea,long flags);
  3176.  
  3177.  
  3178. GetFunctionName
  3179.  
  3180.  
  3181. ***********************************************
  3182. ** retrieve function name
  3183.         arguments:      ea - any address belonging to the function
  3184.         returns:        null string - function doesn't exist
  3185.                         otherwise returns function name
  3186.  
  3187. char GetFunctionName(long ea);
  3188.  
  3189.  
  3190. ChooseFunction
  3191.  
  3192.  
  3193. ***********************************************
  3194. ** ask the user to select a function
  3195.         arguments:      title - title of the dialog box
  3196.         returns:        -1 - user refused to select a function
  3197.                         otherwise returns the selected function start address
  3198.  
  3199. long ChooseFunction(char title);
  3200.  
  3201.  
  3202. GetFuncOffset
  3203.  
  3204.  
  3205. ***********************************************
  3206. ** convert address to 'funcname+offset' string
  3207.         arguments:      ea - address to convert
  3208.         returns:        if the address belongs to a function then
  3209.                           return a string formed as 'name+offset'
  3210.                           where 'name' is a function name
  3211.                           'offset' is offset within the function
  3212.                         else
  3213.                           return null string
  3214.  
  3215. char GetFuncOffset(long ea);
  3216.  
  3217.  
  3218. FindFuncEnd
  3219.  
  3220.  
  3221. ***********************************************
  3222. ** Determine a new function boundaries
  3223. **
  3224.         arguments:      ea  - starting address of a new function
  3225.         returns:        if a function already exists, then return
  3226.                         its end address.
  3227.                         if a function end cannot be determined,
  3228.                         the return BADADDR
  3229.                         otherwise return the end address of the new function
  3230.  
  3231. long FindFuncEnd(long ea);
  3232.  
  3233. GetFrame
  3234.  
  3235.  
  3236. ***********************************************
  3237. ** Get ID of function frame structure
  3238. **
  3239.         arguments:      ea - any address belonging to the function
  3240.         returns:        ID of function frame or -1
  3241.                         In order to access stack variables you need to use
  3242.                         structure member manipulaion functions with the
  3243.                         obtained ID.
  3244.                         If the function does't exist, return -1
  3245.  
  3246. long GetFrame(long ea);
  3247.  
  3248. GetFrameLvarSize
  3249.  
  3250.  
  3251. ***********************************************
  3252. ** Get size of local variables in function frame
  3253. **
  3254.         arguments:      ea - any address belonging to the function
  3255.         returns:        Size of local variables in bytes.
  3256.                         If the function doesn't have a frame, return 0
  3257.                         If the function does't exist, return -1
  3258.  
  3259. long GetFrameLvarSize(long ea);
  3260.  
  3261. GetFrameRegsSize
  3262.  
  3263.  
  3264. ***********************************************
  3265. ** Get size of saved registers in function frame
  3266. **
  3267.         arguments:      ea - any address belonging to the function
  3268.         returns:        Size of saved registers in bytes.
  3269.                         If the function doesn't have a frame, return 0
  3270.                         This value is used as offset for BP
  3271.                         (if FUNC_FRAME is set)
  3272.                         If the function does't exist, return -1
  3273.  
  3274. long GetFrameRegsSize(long ea);
  3275.  
  3276. GetFrameArgsSize
  3277.  
  3278.  
  3279. ***********************************************
  3280. ** Get size of arguments in function frame
  3281. **
  3282.         arguments:      ea - any address belonging to the function
  3283.         returns:        Size of function arguments in bytes.
  3284.                         If the function doesn't have a frame, return 0
  3285.                         If the function does't exist, return -1
  3286.  
  3287. long GetFrameArgsSize(long ea);
  3288.  
  3289. GetFrameSize
  3290.  
  3291.  
  3292. ***********************************************
  3293. ** Get full size of function frame
  3294. **
  3295.         arguments:      ea - any address belonging to the function
  3296.         returns:        Size of function frame in bytes.
  3297.                         This function takes into account size of local
  3298.                         variables + size of saved registers + size of
  3299.                         return address + size of function arguments
  3300.                         If the function doesn't have a frame, return size of
  3301.                         function return address in the stack.
  3302.                         If the function does't exist, return 0
  3303.  
  3304. long GetFrameSize(long ea);
  3305.  
  3306. MakeFrame
  3307.  
  3308.  
  3309. ***********************************************
  3310. ** Make function frame
  3311. **
  3312.         arguments:      ea      - any address belonging to the function
  3313.                         lvsize  - size of function local variables
  3314.                         frregs  - size of saved registers
  3315.                         argsize - size of function arguments
  3316.         returns:        ID of function frame or -1
  3317.                         If the function did not have a frame, the frame
  3318.                         will be created. Otherwise the frame will be
  3319.                         modified
  3320.  
  3321. long MakeFrame(long ea,long lvsize,long frregs,long argsize);
  3322.  
  3323. GetSpd
  3324.  
  3325.  
  3326. ***********************************************
  3327. ** Get current delta for the stack pointer
  3328. **
  3329.         arguments:      ea      - address of the instruction
  3330.         returns:        The difference between the original SP upon
  3331.                         entering the function and SP for
  3332.                         the specified address
  3333.  
  3334. long GetSpd(long ea);
  3335.  
  3336. GetSpDiff
  3337.  
  3338.  
  3339. ***********************************************
  3340. ** Get modification of SP made by the current instruction
  3341. **
  3342.         arguments:      ea      - address of the instruction
  3343.         returns:        Get modification of SP made at the specified location
  3344.                         If the specified location doesn't contain a SP
  3345.                         change point, return 0
  3346.                         Otherwise return delta of SP modification
  3347.  
  3348. long GetSpDiff(long ea);
  3349.  
  3350. SetSpDiff
  3351.  
  3352.  
  3353. ***********************************************
  3354. ** Setup modification of SP made by the current instruction
  3355. **
  3356.         arguments:      ea      - address of the instruction
  3357.                         delta   - the difference made by the current
  3358.                                   instruction.
  3359.         returns:        1-ok, 0-failed
  3360.  
  3361. success SetSpDiff(long ea,long delta);
  3362.  
  3363.  
  3364. GetEntryPointQty
  3365.  
  3366.  
  3367. ***********************************************
  3368. ** retrieve number of entry points
  3369.         arguments:      none
  3370.         returns:        number of entry points
  3371.  
  3372. long GetEntryPointQty(void);
  3373.  
  3374.  
  3375. AddEntryPoint
  3376.  
  3377.  
  3378. ***********************************************
  3379. ** add entry point
  3380.         arguments:      ordinal  - entry point number
  3381.                                    if entry point doesn't have an ordinal
  3382.                                    number, 'ordinal' should be equal to 'ea'
  3383.                         ea       - address of the entry point
  3384.                         name     - name of the entry point. If null string,
  3385.                                    the entry point won't be renamed.
  3386.                         makecode - if 1 then this entry point is a start
  3387.                                    of a function. Otherwise it denotes data
  3388.                                    bytes.
  3389.         returns:        0 - entry point with the specifed ordinal already
  3390.                                 exists
  3391.                         1 - ok
  3392.  
  3393. success AddEntryPoint(long ordinal,long ea,char name,long makecode);
  3394.  
  3395.  
  3396. GetEntryOrdinal
  3397.  
  3398.  
  3399. ***********************************************
  3400. ** retrieve entry point ordinal number
  3401.         arguments:      index - 0..GetEntryPointQty()-1
  3402.         returns:        0 if entry point doesn't exist
  3403.                         otherwise entry point ordinal
  3404.  
  3405. long GetEntryOrdinal(long index);
  3406.  
  3407.  
  3408. GetEntryPoint
  3409.  
  3410.  
  3411. ***********************************************
  3412. ** retrieve entry point address
  3413.         arguments:      ordinal - entry point number
  3414.                                   it is returned by GetEntryPointOrdinal()
  3415.         returns:        -1 if entry point doesn't exist
  3416.                         otherwise entry point address.
  3417.                         If entry point address is equal to its ordinal
  3418.                         number, then the entry point has no ordinal.
  3419.  
  3420. long GetEntryPoint(long ordinal);
  3421.  
  3422.  
  3423. RenameEntryPoint
  3424.  
  3425.  
  3426. ***********************************************
  3427. ** rename entry point
  3428.         arguments:      ordinal - entry point number
  3429.                         name    - new name
  3430.         returns:        !=0 - ok
  3431.  
  3432. success RenameEntryPoint(long ordinal,char name);
  3433.  
  3434.  
  3435.  
  3436. GetNextFixupEA
  3437.  
  3438.  
  3439. ***********************************************
  3440. ** find next address with fixup information
  3441.         arguments:      ea - current address
  3442.         returns:        -1 - no more fixups
  3443.                         otherwise returns the next address with
  3444.                                                 fixup information
  3445.  
  3446. long GetNextFixupEA(long ea);
  3447.  
  3448.  
  3449. GetPrevFixupEA
  3450.  
  3451.  
  3452. ***********************************************
  3453. ** find previous address with fixup information
  3454.         arguments:      ea - current address
  3455.         returns:        -1 - no more fixups
  3456.                         otherwise returns the previous address with
  3457.                                                 fixup information
  3458.  
  3459. long GetPrevFixupEA(long ea);
  3460.  
  3461.  
  3462. GetFixupTgtType
  3463.  
  3464.  
  3465. ***********************************************
  3466. ** get fixup target type
  3467.         arguments:      ea - address to get information about
  3468.         returns:        -1 - no fixup at the specified address
  3469.                         otherwise returns fixup target type:
  3470. #define FIXUP_MASK      0x7     // mask for fixup types:
  3471. #define FIXUP_BYTE      0       //   Low-order byte (8-bit displacement or
  3472.                                 //   low byte of 16-bit offset).
  3473. #define FIXUP_OFF16     1       //   16-bit offset.
  3474. #define FIXUP_SEG16     2       //   16-bit base--logical segment base
  3475.                                 //   (selector).
  3476. #define FIXUP_PTR32     3       //   32-bit long pointer (16-bit base:16-bit
  3477.                                 //   offset).
  3478. #define FIXUP_OFF32     4       //   32-bit offset.
  3479. #define FIXUP_PTR48     5       //   48-bit pointer (16-bit base:32-bit offset)
  3480. #define FIXUP_HI8       6       //   high 8 bits of 16bit offset
  3481. #define FIXUP_REL       0x08    // fixup is relative to linear address
  3482.                                 // specified in...?
  3483. #define FIXUP_SELFREL   0x10    // self-relative?
  3484. #define FIXUP_EXTDEF    0x20    // target is a location (otherwise - segment)
  3485. #define FIXUP_UNUSED    0x40    // fixup is ignored by IDA
  3486.  
  3487. long GetFixupTgtType(long ea);
  3488.  
  3489.  
  3490. GetFixupTgtSel
  3491.  
  3492.  
  3493. ***********************************************
  3494. ** get fixup target selector
  3495.         arguments:      ea - address to get information about
  3496.         returns:        -1 - no fixup at the specified address
  3497.                         otherwise returns fixup target selector
  3498.  
  3499. long GetFixupTgtSel(long ea);
  3500.  
  3501.  
  3502. GetFixupTgtOff
  3503.  
  3504.  
  3505. ***********************************************
  3506. ** get fixup target offset
  3507.         arguments:      ea - address to get information about
  3508.         returns:        -1 - no fixup at the specified address
  3509.                         otherwise returns fixup target offset
  3510.  
  3511. long GetFixupTgtOff(long ea);
  3512.  
  3513.  
  3514. GetFixupTgtDispl
  3515.  
  3516.  
  3517. ***********************************************
  3518. ** get fixup target displacement
  3519.         arguments:      ea - address to get information about
  3520.         returns:        -1 - no fixup at the specified address
  3521.                         otherwise returns fixup target displacement
  3522.  
  3523. long GetFixupTgtDispl(long ea);
  3524.  
  3525.  
  3526. SetFixup
  3527.  
  3528.  
  3529. ***********************************************
  3530. ** set fixup information
  3531.         arguments:      ea        - address to set fixup information about
  3532.                         type      - fixup type. see GetFixupTgtType()
  3533.                                     for possible fixup types.
  3534.                         targetsel - target selector
  3535.                         targetoff - target offset
  3536.                         displ     - displacement
  3537.         returns:        none
  3538.  
  3539. void SetFixup(long ea,long type,long targetsel,long targetoff,long displ);
  3540.  
  3541.  
  3542. DelFixup
  3543.  
  3544.  
  3545. ***********************************************
  3546. ** delete fixup information
  3547.         arguments:      ea - address to delete fixup information about
  3548.         returns:        none
  3549.  
  3550. void DelFixup(long ea);
  3551.  
  3552.  
  3553. MarkPosition
  3554.  
  3555.  
  3556. ***********************************************
  3557. ** mark position
  3558.         arguments:      ea      - address to mark
  3559.                         lnnum   - number of generated line for the 'ea'
  3560.                         x       - x coordinate of cursor
  3561.                         y       - y coordinate of cursor
  3562.                         slot    - slot number: 1..20
  3563.                                   if the specifed value is not within the
  3564.                                   range, IDA will ask the user to select slot.
  3565.                         comment - description of the mark.
  3566.                                   Should be not empty.
  3567.         returns:        none
  3568.  
  3569. void MarkPosition(long ea,long lnnum,long x,long y,long slot,char comment);
  3570.  
  3571.  
  3572. GetMarkedPos
  3573.  
  3574.  
  3575. ***********************************************
  3576. ** get marked position
  3577.         arguments:      slot    - slot number: 1..20
  3578.                                   if the specifed value is <= 0
  3579.                                   range, IDA will ask the user to select slot.
  3580.         returns:        -1 - the slot doesn't contain a marked address
  3581.                         otherwise returns the marked address
  3582.  
  3583. long GetMarkedPos(long slot);
  3584.  
  3585.  
  3586. GetMarkComment
  3587.  
  3588.  
  3589. ***********************************************
  3590. ** get marked position comment
  3591.         arguments:      slot    - slot number: 1..20
  3592.         returns:        null string if the slot doesn't contain
  3593.                                         a marked address
  3594.                         otherwise returns the marked address comment
  3595.  
  3596. char GetMarkComment(long slot);
  3597.  
  3598.  
  3599. GetStrucQty
  3600.  
  3601.  
  3602. ***********************************************
  3603. ** get number of defined structure types
  3604.         arguments:      none
  3605.         returns:        number of structure types
  3606.  
  3607. long GetStrucQty(void);
  3608.  
  3609.  
  3610. GetFirstStrucIdx
  3611.  
  3612.  
  3613. ***********************************************
  3614. ** get index of first structure type
  3615.         arguments:      none
  3616.         returns:        -1 if no structure type is defined
  3617.                         index of first structure type.
  3618.                         Each structure type has an index and ID.
  3619.                         INDEX determines position of structure definition
  3620.                          in the list of structure definitions. Index 1
  3621.                          is listed first, after index 2 and so on.
  3622.                          The index of a structure type can be changed any
  3623.                          time, leading to movement of the structure definition
  3624.                          in the list of structure definitions.
  3625.                         ID uniquely denotes a structure type. A structure
  3626.                          gets a unique ID at the creation time and this ID
  3627.                          can't be changed. Even when the structure type gets
  3628.                          deleted, its ID won't be resued in the future.
  3629.  
  3630. long GetFirstStrucIdx(void);
  3631.  
  3632.  
  3633. GetLastStrucIdx
  3634.  
  3635.  
  3636. ***********************************************
  3637. ** get index of last structure type
  3638.         arguments:      none
  3639.         returns:        -1 if no structure type is defined
  3640.                         index of last structure type.
  3641.                         See GetFirstStrucIdx() for the explanation of
  3642.                         structure indices and IDs.
  3643.  
  3644. long GetLastStrucIdx(void);
  3645.  
  3646.  
  3647. GetNextStrucIdx
  3648.  
  3649.  
  3650. ***********************************************
  3651. ** get index of next structure type
  3652.         arguments:      current structure index
  3653.         returns:        -1 if no (more) structure type is defined
  3654.                         index of the next structure type.
  3655.                         See GetFirstStrucIdx() for the explanation of
  3656.                         structure indices and IDs.
  3657.  
  3658. long GetNextStrucIdx(long index);
  3659.  
  3660.  
  3661. GetPrevStrucIdx
  3662.  
  3663.  
  3664. ***********************************************
  3665. ** get index of previous structure type
  3666.         arguments:      current structure index
  3667.         returns:        -1 if no (more) structure type is defined
  3668.                         index of the presiouvs structure type.
  3669.                         See GetFirstStrucIdx() for the explanation of
  3670.                         structure indices and IDs.
  3671.  
  3672. long GetPrevStrucIdx(long index);
  3673.  
  3674.  
  3675. GetStrucIdx
  3676.  
  3677.  
  3678. ***********************************************
  3679. ** get structure index by structure ID
  3680.         arguments:      structure ID
  3681.         returns:        -1 if bad structure ID is passed
  3682.                         otherwise returns structure index.
  3683.                         See GetFirstStrucIdx() for the explanation of
  3684.                         structure indices and IDs.
  3685.  
  3686. long GetStrucIdx(long id);
  3687.  
  3688.  
  3689. GetStrucId
  3690.  
  3691.  
  3692. ***********************************************
  3693. ** get structure ID by structure index
  3694.         arguments:      structure index
  3695.         returns:        -1 if bad structure index is passed
  3696.                         otherwise returns structure ID.
  3697.                         See GetFirstStrucIdx() for the explanation of
  3698.                         structure indices and IDs.
  3699.  
  3700. long GetStrucId(long index);
  3701.  
  3702.  
  3703. GetStrucIdByName
  3704.  
  3705.  
  3706. ***********************************************
  3707. ** get structure ID by structure name
  3708.         arguments:      structure type name
  3709.         returns:        -1 if bad structure type name is passed
  3710.                         otherwise returns structure ID.
  3711.  
  3712. long GetStrucIdByName(char name);
  3713.  
  3714.  
  3715. GetStrucName
  3716.  
  3717.  
  3718. ***********************************************
  3719. ** get structure type name
  3720.         arguments:      structure type ID
  3721.         returns:        -1 if bad structure type ID is passed
  3722.                         otherwise returns structure type name.
  3723.  
  3724. char GetStrucName(long id);
  3725.  
  3726.  
  3727. GetStrucComment
  3728.  
  3729.  
  3730. ***********************************************
  3731. ** get structure type comment
  3732.         arguments:      id         - structure type ID
  3733.                         repeatable - 1: get repeatable comment
  3734.                                      0: get regular comment
  3735.         returns:        null string if bad structure type ID is passed
  3736.                         otherwise returns comment.
  3737.  
  3738. char GetStrucComment(long id,long repeatable);
  3739.  
  3740.  
  3741. GetStrucSize
  3742.  
  3743.  
  3744. ***********************************************
  3745. ** get size of a structure
  3746.         arguments:      id         - structure type ID
  3747.         returns:        -1 if bad structure type ID is passed
  3748.                         otherwise returns size of structure in bytes.
  3749.  
  3750. long GetStrucSize(long id);
  3751.  
  3752.  
  3753. GetMemberQty
  3754.  
  3755.  
  3756. ***********************************************
  3757. ** get number of members of a structure
  3758.         arguments:      id         - structure type ID
  3759.         returns:        -1 if bad structure type ID is passed
  3760.                         otherwise returns number of members.
  3761.  
  3762. long GetMemberQty(long id);
  3763.  
  3764.  
  3765. GetStrucPrevOff
  3766.  
  3767.  
  3768. ***********************************************
  3769. ** get previous offset in a structure
  3770.         arguments:      id     - structure type ID
  3771.                         offset - current offset
  3772.         returns:        -1 if bad structure type ID is passed
  3773.                            or no (more) offsets in the structure
  3774.                         otherwise returns previous offset in a structure.
  3775.                         NOTE: IDA allows 'holes' between members of a
  3776.                               structure. It treats these 'holes'
  3777.                               as unnamed arrays of bytes.
  3778.                         This function returns a member offset or a hole offset.
  3779.                         It will return size of the structure if input
  3780.                         'offset' is bigger than the structure size.
  3781.  
  3782. long GetStrucPrevOff(long id,long offset);
  3783.  
  3784.  
  3785. GetStrucNextOff
  3786.  
  3787.  
  3788. ***********************************************
  3789. ** get next offset in a structure
  3790.         arguments:      id     - structure type ID
  3791.                         offset - current offset
  3792.         returns:        -1 if bad structure type ID is passed
  3793.                            or no (more) offsets in the structure
  3794.                         otherwise returns next offset in a structure.
  3795.                         NOTE: IDA allows 'holes' between members of a
  3796.                               structure. It treats these 'holes'
  3797.                               as unnamed arrays of bytes.
  3798.                         This function returns a member offset or a hole offset.
  3799.                         It will return size of the structure if input
  3800.                         'offset' belongs to the last member of the structure.
  3801.  
  3802. long GetStrucNextOff(long id,long offset);
  3803.  
  3804.  
  3805. GetFirstMember
  3806.  
  3807.  
  3808. ***********************************************
  3809. ** get offset of the first member of a structure
  3810.         arguments:      id            - structure type ID
  3811.         returns:        -1 if bad structure type ID is passed
  3812.                            or structure has no members
  3813.                         otherwise returns offset of the first member.
  3814.                         NOTE: IDA allows 'holes' between members of a
  3815.                               structure. It treats these 'holes'
  3816.                               as unnamed arrays of bytes.
  3817.  
  3818. long GetFirstMember(long id);
  3819.  
  3820.  
  3821. GetLastMember
  3822.  
  3823.  
  3824. ***********************************************
  3825. ** get offset of the last member of a structure
  3826.         arguments:      id            - structure type ID
  3827.         returns:        -1 if bad structure type ID is passed
  3828.                            or structure has no members
  3829.                         otherwise returns offset of the last member.
  3830.                         NOTE: IDA allows 'holes' between members of a
  3831.                               structure. It treats these 'holes'
  3832.                               as unnamed arrays of bytes.
  3833.  
  3834. long GetLastMember(long id);
  3835.  
  3836.  
  3837. GetMemberOffset
  3838.  
  3839.  
  3840. ***********************************************
  3841. ** get offset of a member of a structure by the member name
  3842.         arguments:      id            - structure type ID
  3843.                         member_name   - name of structure member
  3844.         returns:        -1 if bad structure type ID is passed
  3845.                            or no such member in the structure
  3846.                         otherwise returns offset of the specified member.
  3847.  
  3848. long GetMemberOffset(long id,char member_name);
  3849.  
  3850.  
  3851. GetMemberName
  3852.  
  3853.  
  3854. ***********************************************
  3855. ** get name of a member of a structure
  3856.         arguments:      id            - structure type ID
  3857.                         member_offset - member offset. The offset can be
  3858.                                         any offset in the member. For example,
  3859.                                         is a member is 4 bytes long and starts
  3860.                                         at offset 2, then 2,3,4,5 denote
  3861.                                         the same structure member.
  3862.         returns:        -1 if bad structure type ID is passed
  3863.                            or no such member in the structure
  3864.                         otherwise returns name of the specified member.
  3865.  
  3866. char GetMemberName(long id,long member_offset);
  3867.  
  3868.  
  3869. GetMemberComment
  3870.  
  3871.  
  3872. ***********************************************
  3873. ** get comment of a member
  3874.         arguments:      id            - structure type ID
  3875.                         member_offset - member offset. The offset can be
  3876.                                         any offset in the member. For example,
  3877.                                         is a member is 4 bytes long and starts
  3878.                                         at offset 2, then 2,3,4,5 denote
  3879.                                         the same structure member.
  3880.                         repeatable - 1: get repeatable comment
  3881.                                      0: get regular comment
  3882.         returns:        null string if bad structure type ID is passed
  3883.                            or no such member in the structure
  3884.                         otherwise returns comment of the specified member.
  3885.  
  3886. char GetMemberComment(long id,long member_offset,long repeatable);
  3887.  
  3888.  
  3889. GetMemberSize
  3890.  
  3891.  
  3892. ***********************************************
  3893. ** get size of a member
  3894.         arguments:      id            - structure type ID
  3895.                         member_offset - member offset. The offset can be
  3896.                                         any offset in the member. For example,
  3897.                                         is a member is 4 bytes long and starts
  3898.                                         at offset 2, then 2,3,4,5 denote
  3899.                                         the same structure member.
  3900.         returns:        -1 if bad structure type ID is passed
  3901.                            or no such member in the structure
  3902.                         otherwise returns size of the specified
  3903.                                           member in bytes.
  3904.  
  3905. long GetMemberSize(long id,long member_offset);
  3906.  
  3907.  
  3908. GetMemberFlag
  3909.  
  3910.  
  3911. ***********************************************
  3912. ** get type of a member
  3913.         arguments:      id            - structure type ID
  3914.                         member_offset - member offset. The offset can be
  3915.                                         any offset in the member. For example,
  3916.                                         is a member is 4 bytes long and starts
  3917.                                         at offset 2, then 2,3,4,5 denote
  3918.                                         the same structure member.
  3919.         returns:        -1 if bad structure type ID is passed
  3920.                            or no such member in the structure
  3921.                         otherwise returns type of the member, see bit
  3922.                         definitions above. If the member type is a structure
  3923.                         then function GetMemberStrid() should be used to
  3924.                         get the structure type id.
  3925.  
  3926. long GetMemberFlag(long id,long member_offset);
  3927.  
  3928.  
  3929. GetMemberStrId
  3930.  
  3931.  
  3932. ***********************************************
  3933. ** get structure id of a member
  3934.         arguments:      id            - structure type ID
  3935.                         member_offset - member offset. The offset can be
  3936.                                         any offset in the member. For example,
  3937.                                         is a member is 4 bytes long and starts
  3938.                                         at offset 2, then 2,3,4,5 denote
  3939.                                         the same structure member.
  3940.         returns:        -1 if bad structure type ID is passed
  3941.                            or no such member in the structure
  3942.                         otherwise returns structure id of the member.
  3943.                         If the current member is not a structure, returns -1.
  3944.  
  3945. long GetMemberStrId(long id,long member_offset);
  3946.  
  3947.  
  3948. AddStruc
  3949.  
  3950.  
  3951. ***********************************************
  3952. ** define a new structure type
  3953.         arguments:      index         - index of new structure type
  3954.                         If another structure has the specified index,
  3955.                         then index of that structure and all other
  3956.                         structures will be increentedfreeing the specifed
  3957.                         index. If index is == -1, then the biggest index
  3958.                         number will be used.
  3959.                         See GetFirstStrucIdx() for the explanation of
  3960.                         structure indices and IDs.
  3961.  
  3962.                         name - name of the new structure type.
  3963.  
  3964.         returns:        -1 if can't define structure type because of
  3965.                         bad structure name: the name is ill-formed or is
  3966.                         already used in the program.
  3967.                         otherwise returns ID of the new structure type
  3968.  
  3969. long AddStruc(long index,char name);
  3970.  
  3971.  
  3972. DelStruc
  3973.  
  3974.  
  3975. ***********************************************
  3976. ** delete a structure type
  3977.         arguments:      id            - structure type ID
  3978.         returns:        0 if bad structure type ID is passed
  3979.                         1 otherwise the structure type is deleted. All data
  3980.                         and other structure types referencing to the
  3981.                         deleted structure type will be displayed as array
  3982.                         of bytes.
  3983.  
  3984. success DelStruc(long id);
  3985.  
  3986.  
  3987. SetStrucIdx
  3988.  
  3989.  
  3990. ***********************************************
  3991. ** change structure index
  3992.         arguments:      id      - structure type ID
  3993.                         index   - new index of the structure
  3994.                         See GetFirstStrucIdx() for the explanation of
  3995.                         structure indices and IDs.
  3996.         returns:        !=0 - ok
  3997.  
  3998. long SetStrucIdx(long id,long index);
  3999.  
  4000.  
  4001. SetStrucName
  4002.  
  4003.  
  4004. ***********************************************
  4005. ** change structure name
  4006.         arguments:      id      - structure type ID
  4007.                         name    - new name of the structure
  4008.         returns:        !=0 - ok
  4009.  
  4010. long SetStrucName(long id,char name);
  4011.  
  4012.  
  4013. SetStrucComment
  4014.  
  4015.  
  4016. ***********************************************
  4017. ** change structure comment
  4018.         arguments:      id      - structure type ID
  4019.                         comment - new comment of the structure
  4020.                         repeatable - 1: change repeatable comment
  4021.                                      0: change regular comment
  4022.         returns:        !=0 - ok
  4023.  
  4024. long SetStrucComment(long id,char comment,long repeatable);
  4025.  
  4026.  
  4027. AddStrucMember
  4028.  
  4029.  
  4030. ***********************************************
  4031. ** add structure member
  4032.         arguments:      id      - structure type ID
  4033.                         name    - name of the new member
  4034.                         offset  - offset of the new member
  4035.                         flag    - type of the new member. Should be one of
  4036.                                   FF_BYTE..FF_PACKREAL (see above)
  4037.                                   combined with FF_DATA
  4038.                         typeid  - structure id if 'flag' == FF_STRU
  4039.                                   Denotes type of the member is the member
  4040.                                   itself is a structure. Otherwise should be
  4041.                                   -1.
  4042.                                   if isOff0(flag) then typeid specifies
  4043.                                   the offset base.
  4044.                                   if isASCII(flag) then typeid specifies
  4045.                                   the string type (ASCSTR_...).
  4046.                         nitems  - number of items in the new member
  4047.         returns:        0 - ok, otherwise error code:
  4048. #define STRUC_ERROR_MEMBER_NAME   1     // already have member with this name (bad name)
  4049. #define STRUC_ERROR_MEMBER_OFFSET 2     // already have member at this offset
  4050. #define STRUC_ERROR_MEMBER_SIZE   3     // bad number of items or bad sizeof(type)
  4051.  
  4052. long AddStrucMember(long id,char name,long offset,long flag,
  4053.                     long typeid,long nitems);
  4054.  
  4055.  
  4056. DelStrucMember
  4057.  
  4058.  
  4059. ***********************************************
  4060. ** delete structure member
  4061.         arguments:      id            - structure type ID
  4062.                         member_offset - offset of the member
  4063.         returns:        !=0 - ok.
  4064.                         NOTE: IDA allows 'holes' between members of a
  4065.                               structure. It treats these 'holes'
  4066.                               as unnamed arrays of bytes.
  4067.  
  4068. long DelStrucMember(long id,long member_offset);
  4069.  
  4070.  
  4071. SetMemberName
  4072.  
  4073.  
  4074. ***********************************************
  4075. ** change structure member name
  4076.         arguments:      id            - structure type ID
  4077.                         member_offset - offset of the member
  4078.                         name          - new name of the member
  4079.         returns:        !=0 - ok.
  4080.  
  4081. long SetMemberName(long id,long member_offset,char name);
  4082.  
  4083.  
  4084. SetMemberType
  4085.  
  4086.  
  4087. ***********************************************
  4088. ** change structure member type
  4089.         arguments:      id            - structure type ID
  4090.                         member_offset - offset of the member
  4091.                         flag    - new type of the member. Should be one of
  4092.                                   FF_BYTE..FF_PACKREAL (see above)
  4093.                                   combined with FF_DATA
  4094.                         typeid  - structure id if 'flag' == FF_STRU
  4095.                                   Denotes type of the member is the member
  4096.                                   itself is a structure. Otherwise should be
  4097.                                   -1.
  4098.                                   if isOff0(flag) then typeid specifies
  4099.                                   the offset base.
  4100.                                   if isASCII(flag) then typeid specifies
  4101.                                   the string type (ASCSTR_...).
  4102.                         nitems  - number of items in the member
  4103.         returns:        !=0 - ok.
  4104.  
  4105. long SetMemberType(long id,long member_offset,long flag,long typeid,long nitems);
  4106.  
  4107.  
  4108. SetMemberComment
  4109.  
  4110.  
  4111. ***********************************************
  4112. ** change structure member comment
  4113.         arguments:      id      - structure type ID
  4114.                         member_offset - offset of the member
  4115.                         comment - new comment of the structure member
  4116.                         repeatable - 1: change repeatable comment
  4117.                                      0: change regular comment
  4118.         returns:        !=0 - ok
  4119.  
  4120. long SetMemberComment(long id,long member_offset,char comment,long repeatable);
  4121.  
  4122.  
  4123. GetEnumQty
  4124.  
  4125.  
  4126. ***********************************************
  4127. ** get number of enum types
  4128.         arguments:      none
  4129.         returns:        number of enumerations
  4130.  
  4131. long GetEnumQty(void);
  4132.  
  4133.  
  4134. GetnEnum
  4135.  
  4136.  
  4137. ***********************************************
  4138. ** get ID of the specified enum by its serial number
  4139.         arguments:      idx - number of enum (0..GetEnumQty()-1)
  4140.         returns:        ID of enum or -1 if error
  4141.  
  4142. long GetnEnum(long idx);
  4143.  
  4144.  
  4145. GetEnumIdx
  4146.  
  4147.  
  4148. ***********************************************
  4149. ** get serial number of enum by its ID
  4150.         arguments:      enum_id - ID of enum
  4151.         returns:        (0..GetEnumQty()-1) or -1 if error
  4152.  
  4153. long GetEnumIdx(long enum_id);
  4154.  
  4155.  
  4156. GetEnum
  4157.  
  4158.  
  4159. ***********************************************
  4160. ** get enum ID by the name of enum
  4161.         arguments:      name - name of enum
  4162.         returns:        ID of enum or -1 if no such enum exists
  4163.  
  4164. long GetEnum(char name);
  4165.  
  4166.  
  4167. GetEnumName
  4168.  
  4169.  
  4170. ***********************************************
  4171. ** get name of enum
  4172.         arguments:      enum_id - ID of enum
  4173.         returns:        name of enum or empty string
  4174.  
  4175. char GetEnumName(long enum_id);
  4176.  
  4177.  
  4178. GetEnumCmt
  4179.  
  4180.  
  4181. ***********************************************
  4182. ** get comment of enum
  4183.         arguments:      enum_id - ID of enum
  4184.                         repeatable - 0:get regular comment
  4185.                                      1:get repeatable comment
  4186.         returns:        comment of enum
  4187.  
  4188. char GetEnumCmt(long enum_id,long repeatable);
  4189.  
  4190.  
  4191. GetEnumSize
  4192.  
  4193.  
  4194. ***********************************************
  4195. ** get size of enum
  4196.         arguments:      enum_id - ID of enum
  4197.         returns:        number of constants in the enum
  4198.                         Returns 0 if enum_id is bad.
  4199.  
  4200. long GetEnumSize(long enum_id);
  4201.  
  4202.  
  4203. GetEnumFlag
  4204.  
  4205.  
  4206. ***********************************************
  4207. ** get flag of enum
  4208.         arguments:      enum_id - ID of enum
  4209.         returns:        flags of enum. These flags determine representation
  4210.                         of numeric constants (binary,octal,decimal,hex)
  4211.                         in the enum definition. See start of this file for
  4212.                         more information about flags.
  4213.                         Returns 0 if enum_id is bad.
  4214.  
  4215. long GetEnumFlag(long enum_id);
  4216.  
  4217.  
  4218. GetConstByName
  4219.  
  4220.  
  4221. ***********************************************
  4222. ** get member of enum - a symbolic constant ID
  4223.         arguments:      name - name of symbolic constant
  4224.         returns:        ID of constant or -1
  4225.  
  4226. long GetConstByName(char name);
  4227.  
  4228.  
  4229. GetConstValue
  4230.  
  4231.  
  4232. ***********************************************
  4233. ** get value of symbolic constant
  4234.         arguments:      const_id - id of symbolic constant
  4235.         returns:        value of constant or 0
  4236.  
  4237. long GetConstValue(long const_id);
  4238.  
  4239.  
  4240. GetConstEnum
  4241.  
  4242.  
  4243. ***********************************************
  4244. ** get id of enum by id of constant
  4245.         arguments:      const_id - id of symbolic constant
  4246.         returns:        id of enum the constant belongs to.
  4247.                         -1 if const_id is bad.
  4248.  
  4249. long GetConstEnum(long const_id);
  4250.  
  4251.  
  4252. GetConst
  4253.  
  4254. ***********************************************
  4255. ** get id of constant
  4256.         arguments:      enum_id - id of enum
  4257.                         value   - value of constant
  4258.         returns:        id of constant or -1 if error
  4259.  
  4260. long GetConst(long enum_id,long value);
  4261.  
  4262.  
  4263. GetFirstConst
  4264.  
  4265.  
  4266. ***********************************************
  4267. ** get first constant in the enum
  4268.         arguments:      enum_id - id of enum
  4269.         returns:        value of constant or -1 no constants are defined
  4270.                         All constants are sorted by their values
  4271.                         as unsigned longs.
  4272.  
  4273. long GetFirstConst(long enum_id);
  4274.  
  4275.  
  4276. GetLastConst
  4277.  
  4278.  
  4279. ***********************************************
  4280. ** get last constant in the enum
  4281.         arguments:      enum_id - id of enum
  4282.         returns:        value of constant or -1 no constants are defined
  4283.                         All constants are sorted by their values
  4284.                         as unsigned longs.
  4285.  
  4286. long GetLastConst(long enum_id);
  4287.  
  4288.  
  4289. GetNextConst
  4290.  
  4291.  
  4292. ***********************************************
  4293. ** get next constant in the enum
  4294.         arguments:      enum_id - id of enum
  4295.                         value   - value of the current constant
  4296.         returns:        value of a constant with value higher than the specified
  4297.                         value. -1 no such constants exist.
  4298.                         All constants are sorted by their values
  4299.                         as unsigned longs.
  4300.  
  4301. long GetNextConst(long enum_id,long value);
  4302.  
  4303.  
  4304. GetPrevConst
  4305.  
  4306.  
  4307. ***********************************************
  4308. ** get prev constant in the enum
  4309.         arguments:      enum_id - id of enum
  4310.                         value   - value of the current constant
  4311.         returns:        value of a constant with value lower than the specified
  4312.                         value. -1 no such constants exist.
  4313.                         All constants are sorted by their values
  4314.                         as unsigned longs.
  4315.  
  4316. long GetPrevConst(long enum_id,long value);
  4317.  
  4318.  
  4319. GetConstName
  4320.  
  4321.  
  4322. ***********************************************
  4323. ** get name of a constant
  4324.         arguments:      const_id - id of const
  4325.         returns:        name of constant
  4326.  
  4327. char GetConstName(long const_id);
  4328.  
  4329.  
  4330. GetConstCmt
  4331.  
  4332.  
  4333. ***********************************************
  4334. ** get comment of a constant
  4335.         arguments:      const_id - id of const
  4336.                         repeatable - 0:get regular comment
  4337.                                      1:get repeatable comment
  4338.         returns:        comment string
  4339.  
  4340. char GetConstCmt(long const_id,long repeatable);
  4341.  
  4342.  
  4343. AddEnum
  4344.  
  4345.  
  4346. ***********************************************
  4347. ** add a new enum type
  4348.         arguments:      idx - serial number of the new enum.
  4349.                               If another enum with the same serial number
  4350.                               exists, then all enums with serial
  4351.                               numbers >= the specified idx get their
  4352.                               serial numbers incremented (in other words,
  4353.                               the new enum is put in the middle of the list
  4354.                               of enums).
  4355.                               If idx >= GetEnumQty() then the new enum is
  4356.                               created at the end of the list of enums.
  4357.                         name - name of the enum.
  4358.                         flag - flags for representation of numeric constants
  4359.                                in the definition of enum.
  4360.         returns:        id of new enum or -1.
  4361.  
  4362. long AddEnum(long idx,char name,long flag);
  4363.  
  4364.  
  4365. DelEnum
  4366.  
  4367.  
  4368. ***********************************************
  4369. ** delete enum type
  4370.         arguments:      enum_id - id of enum
  4371.  
  4372. void DelEnum(long enum_id);
  4373.  
  4374.  
  4375. SetEnumIdx
  4376.  
  4377.  
  4378. ***********************************************
  4379. ** give another serial number to a enum
  4380.         arguments:      enum_id - id of enum
  4381.                         idx     - new serial number.
  4382.                               If another enum with the same serial number
  4383.                               exists, then all enums with serial
  4384.                               numbers >= the specified idx get their
  4385.                               serial numbers incremented (in other words,
  4386.                               the new enum is put in the middle of the list
  4387.                               of enums).
  4388.                               If idx >= GetEnumQty() then the enum is
  4389.                               moved to the end of the list of enums.
  4390.         returns:        comment string
  4391.  
  4392. success SetEnumIdx(long enum_id,long idx);
  4393.  
  4394.  
  4395. SetEnumName
  4396.  
  4397.  
  4398. ***********************************************
  4399. ** rename enum
  4400.         arguments:      enum_id - id of enum
  4401.                         name    - new name of enum
  4402.         returns:        1-ok,0-failed
  4403.  
  4404. success SetEnumName(long enum_id,char name);
  4405.  
  4406.  
  4407. SetEnumCmt
  4408.  
  4409.  
  4410. ***********************************************
  4411. ** set comment of enum
  4412.         arguments:      enum_id - id of enum
  4413.                         cmt     - new comment for the enum
  4414.                         repeatable - 0:set regular comment
  4415.                                      1:set repeatable comment
  4416.         returns:        1-ok,0-failed
  4417.  
  4418. success SetEnumCmt(long enum_id,char cmt,long repeatable);
  4419.  
  4420.  
  4421. SetEnumFlag
  4422.  
  4423.  
  4424. ***********************************************
  4425. ** set flag of enum
  4426.         arguments:      enum_id - id of enum
  4427.                         flag - flags for representation of numeric constants
  4428.                                in the definition of enum.
  4429.         returns:        1-ok,0-failed
  4430.  
  4431. success SetEnumFlag(long enum_id,long flag);
  4432.  
  4433.  
  4434. AddConst
  4435.  
  4436.  
  4437. ***********************************************
  4438. ** add a member of enum - a symbolic constant
  4439.         arguments:      enum_id - id of enum
  4440.                         name    - name of symbolic constant. Must be unique
  4441.                                   in the program.
  4442.                         value   - value of symbolic constant.
  4443.         returns:        0-ok, otherwise error code:
  4444. #define CONST_ERROR_NAME  1     // already have member with this name (bad name)
  4445. #define CONST_ERROR_VALUE 2     // already have member with this value
  4446. #define CONST_ERROR_ENUM  3     // bad enum id
  4447.  
  4448. long AddConst(long enum_id,char name,long value);
  4449.  
  4450.  
  4451. DelConst
  4452.  
  4453.  
  4454. ***********************************************
  4455. ** delete a member of enum - a symbolic constant
  4456.         arguments:      enum_id - id of enum
  4457.                         value   - value of symbolic constant.
  4458.         returns:        1-ok,0-failed
  4459.  
  4460. success DelConst(long enum_id,long value);
  4461.  
  4462.  
  4463. SetConstName
  4464.  
  4465.  
  4466. ***********************************************
  4467. ** rename a member of enum - a symbolic constant
  4468.         arguments:      const_id - id of const
  4469.                         name     - new name of constant
  4470.         returns:        1-ok,0-failed
  4471.  
  4472. success SetConstName(long const_id,char name);
  4473.  
  4474.  
  4475. SetConstCmt
  4476.  
  4477.  
  4478. ***********************************************
  4479. ** set a comment of a symbolic constant
  4480.         arguments:      const_id - id of const
  4481.                         cmt     - new comment for the constant
  4482.                         repeatable - 0:set regular comment
  4483.                                      1:set repeatable comment
  4484.         returns:        1-ok,0-failed
  4485.  
  4486. success SetConstCmt(long const_id,char cmt,long repeatable);
  4487.  
  4488.  
  4489. CreateArray
  4490.  
  4491.  
  4492. The arrays are virtual. IDA allocates space for and keeps only the specified
  4493. elements of an array. Array index is 32-bit long. Actually, each array
  4494. may keep a set of strings and a set of long(32bit) values.
  4495.  
  4496. ***********************************************
  4497. ** create array
  4498.         arguments:      name - name of array. There are no restrictions
  4499.                                on the name (its length should be less than
  4500.                                120 characters, though)
  4501.         returns:        -1 - can't create array (it already exists)
  4502.                         otherwise returns id of the array
  4503.  
  4504. long CreateArray(char name);
  4505.  
  4506.  
  4507. GetArrayId
  4508.  
  4509.  
  4510. ***********************************************
  4511. ** get array id by its name
  4512.         arguments:      name - name of existing array.
  4513.         returns:        -1 - no such array
  4514.                         otherwise returns id of the array
  4515.  
  4516. long GetArrayId(char name);
  4517.  
  4518.  
  4519. RenameArray
  4520.  
  4521.  
  4522. ***********************************************
  4523. ** rename array
  4524.         arguments:      id      - array id returned by CreateArray() or
  4525.                                   GetArrayId()
  4526.                         newname - new name of array. There are no
  4527.                                   restrictions on the name (its length should
  4528.                                   be less than 120 characters, though)
  4529.         returns:        1-ok, 0-failed
  4530.  
  4531. success RenameArray(long id,char newname);
  4532.  
  4533.  
  4534. DeleteArray
  4535.  
  4536.  
  4537. ***********************************************
  4538. ** delete array
  4539.    This function deletes all elements of the array.
  4540.         arguments:      id      - array id
  4541.  
  4542. void DeleteArray(long id);
  4543.  
  4544.  
  4545. SetArrayLong
  4546.  
  4547.  
  4548. ***********************************************
  4549. ** set 32bit value of array element
  4550.         arguments:      id      - array id
  4551.                         idx     - index of an element
  4552.                         value   - 32bit value to store in the array
  4553.         returns:        1-ok, 0-failed
  4554.  
  4555. success SetArrayLong(long id,long idx,long value);
  4556.  
  4557.  
  4558. SetArrayString
  4559.  
  4560.  
  4561. ***********************************************
  4562. ** set string value of array element
  4563.         arguments:      id      - array id
  4564.                         idx     - index of an element
  4565.                         str     - string to store in array element
  4566.         returns:        1-ok, 0-failed
  4567.  
  4568. success SetArrayString(long id,long idx,char str);
  4569.  
  4570.  
  4571. GetArrayElement
  4572.  
  4573.  
  4574. ***********************************************
  4575. ** get value of array element
  4576.         arguments:      tag     - tag of array, specifies one of two
  4577.                                   array types:
  4578. #define AR_LONG 'A'     // array of longs
  4579. #define AR_STR  'S'     // array of strings
  4580.                         id      - array id
  4581.                         idx     - index of an element
  4582.         returns:        value of the specified array element.
  4583.                         note that this function may return char or long
  4584.                         result. Unexistent array elements give zero as
  4585.                         a result.
  4586.  
  4587. char or long GetArrayElement(long tag,long id,long idx);
  4588.  
  4589.  
  4590. DelArrayElement
  4591.  
  4592.  
  4593. ***********************************************
  4594. ** delete an array element
  4595.         arguments:      tag     - tag of array (AR_LONG or AR_STR)
  4596.                         id      - array id
  4597.                         idx     - index of an element
  4598.         returns:        1-ok, 0-failed
  4599.  
  4600. success DelArrayElement(long tag,long id,long idx);
  4601.  
  4602.  
  4603. GetFirstIndex
  4604.  
  4605.  
  4606. ***********************************************
  4607. ** get index of the first existing array element
  4608.         arguments:      tag     - tag of array (AR_LONG or AR_STR)
  4609.                         id      - array id
  4610.         returns:        -1 - array is empty
  4611.                         otherwise returns index of the first array element
  4612.  
  4613. long GetFirstIndex(long tag,long id);
  4614.  
  4615.  
  4616. GetLastIndex
  4617.  
  4618.  
  4619. ***********************************************
  4620. ** get index of the last existing array element
  4621.         arguments:      tag     - tag of array (AR_LONG or AR_STR)
  4622.                         id      - array id
  4623.         returns:        -1 - array is empty
  4624.                         otherwise returns index of the last array element
  4625.  
  4626. long GetLastIndex(long tag,long id);
  4627.  
  4628.  
  4629. GetNextIndex
  4630.  
  4631.  
  4632. ***********************************************
  4633. ** get index of the next existing array element
  4634.         arguments:      tag     - tag of array (AR_LONG or AR_STR)
  4635.                         id      - array id
  4636.                         idx     - index of the current element
  4637.         returns:        -1 - no more array elements
  4638.                         otherwise returns index of the next array element
  4639.  
  4640. long GetNextIndex(long tag,long id,long idx);
  4641.  
  4642.  
  4643.  
  4644. GetPrevIndex
  4645.  
  4646.  
  4647. ***********************************************
  4648. ** get index of the previous existing array element
  4649.         arguments:      tag     - tag of array (AR_LONG or AR_STR)
  4650.                         id      - array id
  4651.                         idx     - index of the current element
  4652.         returns:        -1 - no more array elements
  4653.                         otherwise returns index of the previous array element
  4654.  
  4655. long GetPrevIndex(long tag,long id,long idx);
  4656.  
  4657.  
  4658. AddSourceFile
  4659.  
  4660.  
  4661.   IDA can keep information about source files used to create the program.
  4662.   Each source file is represented by a range of addresses.
  4663.   A source file may contains several address ranges.
  4664.  
  4665. ***********************************************
  4666. ** Mark a range of address as belonging to a source file
  4667.    An address range may belong only to one source file.
  4668.    A source file may be represented by several address ranges.
  4669.         ea1     - linear address of start of the address range
  4670.         ea2     - linear address of end of the address range
  4671.         filename- name of source file.
  4672.    returns: 1-ok, 0-failed.
  4673.  
  4674. success AddSourceFile(long ea1,ulong ea2,char filename);
  4675.  
  4676.  
  4677. GetSourceFile
  4678.  
  4679.  
  4680. ***********************************************
  4681. ** Get name of source file occupying the given address
  4682.         ea - linear address
  4683.    returns: NULL - source file information is not found
  4684.             otherwise returns pointer to file name
  4685.  
  4686. char GetSourceFile(long ea);
  4687.  
  4688.  
  4689.  
  4690. DelSourceFile
  4691.  
  4692.  
  4693. ***********************************************
  4694. ** Delete information about the source file
  4695.         ea - linear address belonging to the source file
  4696.    returns: NULL - source file information is not found
  4697.             otherwise returns pointer to file name
  4698.  
  4699. success DelSourceFile(long ea);
  4700.  
  4701.  
  4702. SetLineNumber
  4703.  
  4704.  
  4705. ***********************************************
  4706. ** set source line number
  4707.         arguments:      ea      - linear address
  4708.                         lnnum   - number of line in the source file
  4709.         returns:        nothing
  4710.  
  4711. void SetLineNumber(long ea,long lnnum);
  4712.  
  4713.  
  4714. GetLineNumber
  4715.  
  4716.  
  4717. ***********************************************
  4718. ** get source line number
  4719.         arguments:      ea      - linear address
  4720.         returns:        number of line in the source file or -1
  4721.  
  4722. long GetLineNumber(long ea);
  4723.  
  4724.  
  4725.  
  4726. DelLineNumber
  4727.  
  4728.  
  4729. ***********************************************
  4730. ** delete information about source line number
  4731.         arguments:      ea      - linear address
  4732.         returns:        nothing
  4733.  
  4734. void DelLineNumber(long ea);
  4735.  
  4736.  
  4737. Conv
  4738.  
  4739.  
  4740.         Convenience function.
  4741.         See Set..() functions for bit definitions.
  4742.  
  4743. StringStp(x)            SetCharPrm(INF_ASCII_BREAK,x)
  4744. LowVoids(x)             SetLongPrm(INF_LOW_OFF,x)
  4745. HighVoids(x)            SetLongPrm(INF_HIGH_OFF,x)
  4746. TailDepth(x)            SetLongPrm(INF_MAXREF,x)
  4747. Analysis(x)             SetCharPrm(INF_AUTO,x)
  4748. Tabs(x)                 SetCharPrm(INF_ENTAB,x)
  4749. Comments(x)             SetCharPrm(INF_CMTFLAG,((x)
  4750.                                 ? (SW_ALLCMT|GetCharPrm(INF_CMTFLAG))
  4751.                                 : (~SW_ALLCMT&GetCharPrm(INF_CMTFLAG))))
  4752. Voids(x)                SetCharPrm(INF_VOIDS,x)
  4753. Indent(x)               SetCharPrm(INF_INDENT,x)
  4754. CmtIndent(x)            SetCharPrm(INF_COMMENT,x)
  4755. AutoShow(x)             SetCharPrm(INF_AUTOSHOW,x)
  4756. MinEA()                 GetLongPrm(INF_MIN_EA)
  4757. MaxEA()                 GetLongPrm(INF_MAX_EA)
  4758. BeginEA()               GetLongPrm(INF_BEGIN_EA)
  4759. set_start_cs(x)         SetLongPrm(INF_START_CS,x)
  4760. set_start_ip(x)         SetLongPrm(INF_START_IP,x)
  4761. For the list of built-in functions please click here.
  4762.  
  4763. IDC script sample
  4764. -----------------
  4765.  
  4766. This is a sample IDC script:
  4767. //
  4768. //      This file demonstrates how to copy blocks of memory
  4769. //      using IDC. To use it, press F2 and select this file.
  4770. //      Once loaded and compiled all IDC functions stay in memory
  4771. //      so afterwards you can copy blocks simply pressing Shift-F2
  4772. //      and entering something like:
  4773. //
  4774. //              memcpy(0x30000,0x20000,0x100);
  4775. //
  4776. //      This construction copies 0x100 bytes from 0x20000 to 0x30000.
  4777. //
  4778. //      Also, you can delete main() function below.
  4779. //      When you try to execute this file, you'll get an error:
  4780. //      can find function 'main', don't pay attention.
  4781. //      You will get memcpy() function in the memory.
  4782. //      In this case you should create a segment youself (if nesessary).
  4783. //
  4784.  
  4785. //------------------------------------------------------------------------
  4786. static memcpy(to,from,size) {
  4787.   auto i;
  4788.  
  4789.   for ( i=0; i < size; i=i+1 ) {
  4790.     PatchByte( to, Byte(from) );
  4791.     from = from + 1;
  4792.     to = to + 1;
  4793.   }
  4794. }
  4795.  
  4796. //------------------------------------------------------------------------
  4797. static main(void) {
  4798.   auto from,to,size;
  4799.  
  4800.   from = 0x10000;
  4801.   to = 0x20000;
  4802.   size = 0x100;
  4803.  
  4804.   if ( SegCreate(to,to+size,to>>4,0,1,2) )
  4805.     memcpy(to,from,size);
  4806. }
  4807.  
  4808. ===============================================================================
  4809.                        SECTION IV : IDA FAQ
  4810. ===============================================================================
  4811.  
  4812. How do I generate FLIRT signature from my own libraries ?
  4813.  
  4814.      The process is simple if you have installed the FLAIR tools. As an example, we'll use an file called api.lib.
  4815.      First a pattern file should be created. The command
  4816.  
  4817.      plb api(.lib) api(.pat)
  4818.  
  4819.      creates a pattern file whose format is described in our FLIRT paper. Have a look at this file with a text
  4820.      editor.Then we'll create a signature file with the command
  4821.  
  4822.      sigmake api(.pat) api(.sig)
  4823.  
  4824.      and copy the resulting api.sig file in the IDA Pro SIG subdirectory.
  4825.  
  4826. How do I apply my own SIGs to the disassembly ?
  4827.  
  4828.      Open the signature window through the View Menu. Press the INS key. Wait a few seconds until the list of
  4829.      available signatures is build. Move the cursor on the line containing your sig file and press the ENTER key.
  4830.  
  4831. How do I define high level structures ?
  4832.  
  4833.      See this short tutorial
  4834.  
  4835. How do I load debugging information, MAP or SYM files into IDA ?
  4836.  
  4837.      The following procedure may be used to load debugging information, MAP and SYM files into a
  4838.      disassembly. This procedure is a temprarory solution, as future versions of IDA will have a built-in support
  4839.      of debugging information.
  4840.  
  4841.      Convert debugging information into text using your favorite dumper. (Borland's TDUMP.EXE is a good choice
  4842.      when dealing with Borland and Microsoft debugging information). Load the text into a text editor and convert it
  4843.      into IDC script:
  4844.  
  4845.  
  4846.  
  4847.      static main() {
  4848.  
  4849.        MakeName(addr,name);
  4850.  
  4851.        ...........
  4852.  
  4853.      }
  4854.  
  4855.  
  4856.      where addr - address should be replaced be the address of the name and name is string constant. Example:
  4857.  
  4858.  
  4859.  
  4860.      static main() {
  4861.  
  4862.        MakeName(0x10000,"name1");
  4863.  
  4864.      }
  4865.  
  4866.  
  4867.      Launch IDA and execute the script by pressing F2 key. The names from the SYM file will appear in the
  4868.      disassembly.
  4869.  
  4870. How do I save a fragment of disassembly ?
  4871.  
  4872.      Select the area of the disassembly that you want to save and press ALT-F10.
  4873.  
  4874. ===============================================================================
  4875.                     SECTION V : SAMPLE OUTPUT FILE
  4876. ===============================================================================
  4877.  
  4878. Here is assembler listing of an object file:
  4879.  
  4880. ;
  4881. ; +-----------------------------------------------------------------+
  4882. ; | This file is generated by The Interactive Disassembler (IDA)    |
  4883. ; | Copyright (c) 1997 by DataRescue sprl, <ida@datarescue.com>     |
  4884. ; +-----------------------------------------------------------------+
  4885. ;
  4886. ;
  4887.  
  4888.  
  4889. ; Module name      : hello2.c
  4890. ; Translator       : Turbo Assembler  Version 3.1
  4891. ; Borland debuginfo: version 3.0
  4892. ; Borland flags    : Optimization 00000000
  4893.  
  4894.  
  4895. ; This file should be compiled with TASM /ml/m5
  4896. p386n
  4897.  
  4898. ; ---------------------------------------------------------------------------
  4899.  
  4900. ; Segment type: Group
  4901. DGROUP          group _BSS,_DATA
  4902.  
  4903. ; ---------------------------------------------------------------------------
  4904.  
  4905. ; Segment type: Externs
  4906. ; extn00
  4907.                 extrn _puts:far         ; CODE XREF: _main+22P
  4908. ; snprintf(unsigned int,signed charfar *,signed charfar *,...)
  4909.                 extrn @snprintf$quinzcnxzce:far ; CODE XREF: _main+14P
  4910.  
  4911. ; ---------------------------------------------------------------------------
  4912.  
  4913. ; Segment type: Pure code
  4914. HELLO2_TEXT     segment byte public 'CODE' use16
  4915.                 assume cs:HELLO2_TEXT
  4916.                 assume es:nothing, ss:nothing, ds:DGROUP, fs:nothing, gs:nothing
  4917.  
  4918. ;               S u b r o u t i n e
  4919. ; Attributes: bp-based frame
  4920.  
  4921. public _main
  4922. _main           proc far
  4923.  
  4924. var_100         = byte ptr -100h
  4925.  
  4926.                 push    bp
  4927.                 mov     bp, sp
  4928.                 sub     sp, 100h
  4929.                 push    ds
  4930.                 push    offset aHelloWorld
  4931.                 push    ss
  4932.                 lea     ax, [bp+var_100]
  4933.                 push    ax
  4934.                 push    100h
  4935.                 call    @snprintf$quinzcnxzce ; snprintf(uint,signed char *,signed char *,...)
  4936.                 add     sp, 0Ah
  4937.                 push    ss
  4938.                 lea     ax, [bp+var_100]
  4939.                 push    ax
  4940.                 call    _puts
  4941.                 add     sp, 4
  4942.                 xor     ax, ax
  4943.                 leave
  4944.                 retf
  4945. _main           endp
  4946.  
  4947. HELLO2_TEXT     ends
  4948.  
  4949. ; ---------------------------------------------------------------------------
  4950.  
  4951. ; Segment type: Pure data
  4952. _DATA           segment word public 'DATA' use16
  4953.                 assume cs:_DATA
  4954. aHelloWorld     db 'Hello, world!',0Ah,0 ; DATA XREF: _main+8o
  4955. _DATA           ends
  4956.  
  4957. ; ---------------------------------------------------------------------------
  4958.  
  4959. ; Segment type: Zero-length
  4960. _BSS            segment word public 'BSS' use16
  4961. _BSS            ends
  4962.  
  4963.  
  4964.                 end
  4965.  
  4966.  
  4967. <eof>
  4968.