distorm.h
上传用户:kittypts
上传日期:2018-02-11
资源大小:241k
文件大小:4k
源码类别:

PlugIns编程

开发平台:

Visual C++

  1. /* diStorm64 1.7.28 */
  2. /*
  3. distorm.h
  4. Copyright (C) 2003-2008 Gil Dabah, http://ragestorm.net/distorm/
  5. This library is licensed under the BSD license. See the file COPYING.
  6. This file is used in win32proj and linuxproj.
  7. */
  8. /*
  9.  * 64 bit offsets support:
  10.  * If the diStorm library you use was compiled with 64 bits offsets,
  11.  * make sure you compile your own code with the following macro set:
  12.  * SUPPORT_64BIT_OFFSET
  13.  * Otherwise comment it out, or you will get a linker error of an unresolved symbol...
  14.  */
  15. // TINYC has a problem with some 64bits library functions, so pass.
  16. #ifndef __TINYC__
  17. #define SUPPORT_64BIT_OFFSET
  18. #endif
  19. /* If your compiler doesn't support stdint.h, define your own 64 bits type. */
  20. #ifdef SUPPORT_64BIT_OFFSET
  21. #ifdef _MSC_VER
  22. #define OFFSET_INTEGER unsigned __int64
  23. #else
  24. #include <stdint.h>
  25. #define OFFSET_INTEGER uint64_t
  26. #endif
  27. #else
  28. /* 32 bit offsets are used. */
  29. #define OFFSET_INTEGER unsigned long
  30. #endif
  31. /* Support C++ compilers */
  32. #ifdef __cplusplus
  33. extern "C" {
  34. #endif
  35. /* Decodes modes of the disassembler, 16 bits or 32 bits or 64 bits for AMD64, x86-64. */
  36. typedef enum {Decode16Bits = 0, Decode32Bits = 1, Decode64Bits = 2} _DecodeType;
  37. typedef OFFSET_INTEGER _OffsetType;
  38. /* Static size of strings. Do not change this value. */
  39. #define MAX_TEXT_SIZE (60)
  40. typedef struct {
  41. unsigned int length;
  42. unsigned char p[MAX_TEXT_SIZE]; /* p is a null terminated string. */
  43. } _WString;
  44. /* This structure holds all information the disassembler generates per instruction. */
  45. typedef struct {
  46. _WString mnemonic; /* Mnemonic of decoded instruction, prefixed if required by REP, LOCK etc. */
  47. _WString operands; /* Operands of the decoded instruction, up to 3 operands, comma-seperated. */
  48. _WString instructionHex; /* Hex dump - little endian, including prefixes. */
  49. unsigned int size; /* Size of decoded instruction. */
  50. _OffsetType offset; /* Start offset of the decoded instruction. */
  51. } _DecodedInst;
  52. /* Return code of the decoding function. */
  53. typedef enum {DECRES_NONE, DECRES_SUCCESS, DECRES_MEMORYERR, DECRES_INPUTERR} _DecodeResult;
  54. /* distorm_decode
  55.  * Input:
  56.  *         offset - Origin of the given code (virtual address that is), NOT an offset in code.
  57.  *         code - Pointer to the code buffer to be disassembled.
  58.  *         length - Amount of bytes that should be decoded from the code buffer.
  59.  *         dt - Decoding mode, 16 bits (Decode16Bits), 32 bits (Decode32Bits) or AMD64 (Decode64Bits).
  60.  *         result - Array of type _DecodeInst which will be used by this function in order to return the disassembled instructions.
  61.  *         maxInstructions - The maximum number of entries in the result array that you pass to this function, so it won't exceed its bound.
  62.  *         usedInstructionsCount - Number of the instruction that successfully were disassembled and written to the result array.
  63.  * Output: usedInstructionsCount will hold the number of entries used in the result array
  64.  *         and the result array itself will be filled with the disassembled instructions.
  65.  * Return: DECRES_SUCCESS on success (no more to disassemble), DECRES_INPUTERR on input error (null code buffer, invalid decoding mode, etc...),
  66.  *         DECRES_MEMORYERR when there are not enough entries to use in the result array, BUT YOU STILL have to check for usedInstructionsCount!
  67.  * Side-Effects: Even if the return code is DECRES_MEMORYERR, there might STILL be data in the
  68.  *               array you passed, this function will try to use as much entries as possible!
  69.  * Notes:  1)The minimal size of maxInstructions is 15.
  70.  *         2)You will have to synchronize the offset,code and length by yourself if you pass code fragments and not a complete code block!
  71.  */
  72. #ifdef SUPPORT_64BIT_OFFSET
  73. _DecodeResult distorm_decode64(_OffsetType codeOffset, const unsigned char* code, int codeLen, _DecodeType dt, _DecodedInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount);
  74. #define distorm_decode distorm_decode64
  75. #else
  76. _DecodeResult distorm_decode32(_OffsetType codeOffset, const unsigned char* code, int codeLen, _DecodeType dt, _DecodedInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount);
  77. #define distorm_decode distorm_decode32
  78. #endif
  79. /*
  80.  * distorm_version
  81.  * Input:
  82.  *        none
  83.  *
  84.  * Output: unsigned int - version of compiler library.
  85.  */
  86. unsigned int distorm_version();
  87. #ifdef __cplusplus
  88. } /* End Of Extern */
  89. #endif