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 |