1 | /*
|
---|
2 |
|
---|
3 | This file contains definitions used by the Hex-Rays decompiler output.
|
---|
4 | It has type definitions and convenience macros to make the
|
---|
5 | output more readable.
|
---|
6 |
|
---|
7 | Copyright (c) 2007 Hex-Rays sprl
|
---|
8 |
|
---|
9 | */
|
---|
10 |
|
---|
11 | #if defined(__GNUC__)
|
---|
12 | #define FMT_64 "ll"
|
---|
13 | typedef long long ll;
|
---|
14 | typedef unsigned long long ull;
|
---|
15 | #elif defined(_MSC_VER)
|
---|
16 | typedef __int64 ll;
|
---|
17 | typedef unsigned __int64 ull;
|
---|
18 | #define FMT_64 "I64"
|
---|
19 | #elif defined (__BORLANDC__)
|
---|
20 | typedef __int64 ll;
|
---|
21 | typedef unsigned __int64 ull;
|
---|
22 | #define FMT_64 "L"
|
---|
23 | #else
|
---|
24 | #error "unknown compiler"
|
---|
25 | #endif
|
---|
26 | typedef unsigned int uint;
|
---|
27 | typedef unsigned char uchar;
|
---|
28 | typedef unsigned short ushort;
|
---|
29 | typedef unsigned long ulong;
|
---|
30 |
|
---|
31 | // Partially defined types:
|
---|
32 | #define _BYTE char
|
---|
33 | #define _WORD short
|
---|
34 | #define _DWORD long
|
---|
35 | #define _QWORD ll
|
---|
36 | #define _LONGLONG __int128
|
---|
37 |
|
---|
38 | #ifndef _WINDOWS_
|
---|
39 | typedef char BYTE;
|
---|
40 | typedef short WORD;
|
---|
41 | typedef long DWORD;
|
---|
42 | typedef long LONG;
|
---|
43 | #endif
|
---|
44 | typedef ll QWORD;
|
---|
45 | #ifndef __cplusplus
|
---|
46 | //typedef int bool; // we want to use bool in our C programs
|
---|
47 | #endif
|
---|
48 |
|
---|
49 | // Some convenience macros to make partial accesses nicer
|
---|
50 | // first unsigned macros:
|
---|
51 | #define LOBYTE(x) (*((_BYTE*)&(x))) // low byte
|
---|
52 | #define LOWORD(x) (*((_WORD*)&(x))) // low word
|
---|
53 | #define LODWORD(x) (*((_DWORD*)&(x))) // low dword
|
---|
54 | #define HIBYTE(x) (*((_BYTE*)&(x)+1))
|
---|
55 | #define HIWORD(x) (*((_WORD*)&(x)+1))
|
---|
56 | #define HIDWORD(x) (*((_DWORD*)&(x)+1))
|
---|
57 | #define BYTEn(x, n) (*((_BYTE*)&(x)+n))
|
---|
58 | #define WORDn(x, n) (*((_WORD*)&(x)+n))
|
---|
59 | #define BYTE1(x) BYTEn(x, 1) // byte 1 (counting from 0)
|
---|
60 | #define BYTE2(x) BYTEn(x, 2)
|
---|
61 | #define BYTE3(x) BYTEn(x, 3)
|
---|
62 | #define BYTE4(x) BYTEn(x, 4)
|
---|
63 | #define BYTE5(x) BYTEn(x, 5)
|
---|
64 | #define BYTE6(x) BYTEn(x, 6)
|
---|
65 | #define BYTE7(x) BYTEn(x, 7)
|
---|
66 | #define BYTE8(x) BYTEn(x, 8)
|
---|
67 | #define BYTE9(x) BYTEn(x, 9)
|
---|
68 | #define BYTE10(x) BYTEn(x, 10)
|
---|
69 | #define BYTE11(x) BYTEn(x, 11)
|
---|
70 | #define BYTE12(x) BYTEn(x, 12)
|
---|
71 | #define BYTE13(x) BYTEn(x, 13)
|
---|
72 | #define BYTE14(x) BYTEn(x, 14)
|
---|
73 | #define BYTE15(x) BYTEn(x, 15)
|
---|
74 | #define WORD1(x) WORDn(x, 1)
|
---|
75 | #define WORD2(x) WORDn(x, 2) // third word of the object, unsigned
|
---|
76 | #define WORD3(x) WORDn(x, 3)
|
---|
77 | #define WORD4(x) WORDn(x, 4)
|
---|
78 | #define WORD5(x) WORDn(x, 5)
|
---|
79 | #define WORD6(x) WORDn(x, 6)
|
---|
80 | #define WORD7(x) WORDn(x, 7)
|
---|
81 |
|
---|
82 | // now signed macros (the same but with sign extension)
|
---|
83 | #define SLOBYTE(x) (*((char*)&(x)))
|
---|
84 | #define SLOWORD(x) (*((short*)&(x)))
|
---|
85 | #define SLODWORD(x) (*((long*)&(x)))
|
---|
86 | #define SHIBYTE(x) (*((char*)&(x)+1))
|
---|
87 | #define SHIWORD(x) (*((short*)&(x)+1))
|
---|
88 | #define SHIDWORD(x) (*((long*)&(x)+1))
|
---|
89 | #define SBYTEn(x, n) (*((char*)&(x)+n))
|
---|
90 | #define SWORDn(x, n) (*((short*)&(x)+n))
|
---|
91 | #define SBYTE1(x) SBYTEn(x, 1)
|
---|
92 | #define SBYTE2(x) SBYTEn(x, 2)
|
---|
93 | #define SBYTE3(x) SBYTEn(x, 3)
|
---|
94 | #define SBYTE4(x) SBYTEn(x, 4)
|
---|
95 | #define SBYTE5(x) SBYTEn(x, 5)
|
---|
96 | #define SBYTE6(x) SBYTEn(x, 6)
|
---|
97 | #define SBYTE7(x) SBYTEn(x, 7)
|
---|
98 | #define SBYTE8(x) SBYTEn(x, 8)
|
---|
99 | #define SBYTE9(x) SBYTEn(x, 9)
|
---|
100 | #define SBYTE10(x) SBYTEn(x, 10)
|
---|
101 | #define SBYTE11(x) SBYTEn(x, 11)
|
---|
102 | #define SBYTE12(x) SBYTEn(x, 12)
|
---|
103 | #define SBYTE13(x) SBYTEn(x, 13)
|
---|
104 | #define SBYTE14(x) SBYTEn(x, 14)
|
---|
105 | #define SBYTE15(x) SBYTEn(x, 15)
|
---|
106 | #define SWORD1(x) SWORDn(x, 1)
|
---|
107 | #define SWORD2(x) SWORDn(x, 2)
|
---|
108 | #define SWORD3(x) SWORDn(x, 3)
|
---|
109 | #define SWORD4(x) SWORDn(x, 4)
|
---|
110 | #define SWORD5(x) SWORDn(x, 5)
|
---|
111 | #define SWORD6(x) SWORDn(x, 6)
|
---|
112 | #define SWORD7(x) SWORDn(x, 7)
|
---|
113 |
|
---|
114 | // Macros to represent some assembly instructions
|
---|
115 | // Feel free to modify them
|
---|
116 |
|
---|
117 | #define __ROL__(x, y) __rotl__(x, y) // Rotate left
|
---|
118 | #define __ROR__(x, y) __rotr__(x, y) // Rotate right
|
---|
119 | #define __RCL__(x, y) invalid_operation // Rotate left thru carry
|
---|
120 | #define __RCR__(x, y) invalid_operation // Rotate right thru carry
|
---|
121 | #define __MKCADD__(x, y) invalid_operation // Generate carry flag for an addition
|
---|
122 | #define __MKOADD__(x, y) invalid_operation // Generate overflow flag for an addition
|
---|
123 | #define __MKCSHL__(x, y) invalid_operation // Generate carry flag for a shift left
|
---|
124 | #define __MKCSHR__(x, y) invalid_operation // Generate carry flag for a shift right
|
---|
125 | #define __MKCRCL__(x, y) invalid_operation // Generate carry flag for a RCL
|
---|
126 | #define __MKCRCR__(x, y) invalid_operation // Generate carry flag for a RCR
|
---|
127 | #define __SETO__(x, y) invalid_operation // Generate overflow flags for (x-y)
|
---|
128 |
|
---|
129 |
|
---|
130 | // In the decompilation listing there are some objects declarared as _UNKNOWN
|
---|
131 | // because we could not determine their types. Since the C compiler does not
|
---|
132 | // accept void item declarations, we replace them by anything of our choice,
|
---|
133 | // for example a char:
|
---|
134 |
|
---|
135 | #define _UNKNOWN char
|
---|
136 |
|
---|
137 | #ifdef _MSC_VER
|
---|
138 | #define snprintf _snprintf
|
---|
139 | #define vsnprintf _vsnprintf
|
---|
140 | #endif
|
---|