1 """Data types for various compilers.
2
3 Different models:
4 http://www.unix.org/version2/whatsnew/lp64_wp.html
5 http://en.wikipedia.org/wiki/64-bit_computing
6
7 Python standard types:
8 http://docs.python.org/2/library/struct.html#format-characters
9 """
10
11 from rekall import obj
12
13
14 LP64 = {
15 'bool' : obj.Curry(obj.Bool, type_name='bool', format_string='<c'),
16
17
18 'char' : obj.Curry(obj.NativeType, type_name='char', format_string='<c'),
19 'unsigned char' : obj.Curry(
20 obj.NativeType, type_name='unsigned char', format_string='<B'),
21
22 'signed byte' : obj.Curry(
23 obj.NativeType, type_name='signed byte', format_string='<b'),
24
25
26 'short' : obj.Curry(obj.NativeType, type_name='short', format_string='<h'),
27 'unsigned short' : obj.Curry(
28 obj.NativeType, type_name='unsigned short', format_string='<H'),
29
30
31 'int' : obj.Curry(obj.NativeType, type_name='int', format_string='<i'),
32 'unsigned int' : obj.Curry(
33 obj.NativeType, type_name='unsigned int', format_string='<I'),
34
35
36 'long': obj.Curry(obj.NativeType, type_name='long', format_string='<q'),
37 'unsigned long' : obj.Curry(
38 obj.NativeType, type_name='unsigned long', format_string='<Q'),
39
40 'long long': obj.Curry(
41 obj.NativeType, type_name='long long', format_string='<q'),
42
43 'unsigned long long' : obj.Curry(
44 obj.NativeType, type_name='unsigned long long', format_string='<Q'),
45
46
47 'address' : obj.Curry(
48 obj.NativeType, type_name='address', format_string='<Q'),
49
50 'unsigned be short' : obj.Curry(
51 obj.NativeType, type_name='unsigned be short', format_string='>H'),
52 'unsigned be int' : obj.Curry(
53 obj.NativeType, type_name='unsigned be int', format_string='>I'),
54 }
55
56
57
58 LLP64 = {
59 'bool' : obj.Curry(obj.Bool, type_name='bool', format_string='<c'),
60
61
62 'char' : obj.Curry(obj.NativeType, type_name='char', format_string='<c'),
63 'unsigned char' : obj.Curry(
64 obj.NativeType, type_name='unsigned char', format_string='<B'),
65
66 'signed byte' : obj.Curry(
67 obj.NativeType, type_name='signed byte', format_string='<b'),
68
69
70 'short' : obj.Curry(obj.NativeType, type_name='short', format_string='<h'),
71 'unsigned short' : obj.Curry(
72 obj.NativeType, type_name='unsigned short', format_string='<H'),
73
74
75 'int' : obj.Curry(obj.NativeType, type_name='int', format_string='<i'),
76 'unsigned int' : obj.Curry(
77 obj.NativeType, type_name='unsigned int', format_string='<I'),
78
79
80 'long': obj.Curry(obj.NativeType, type_name='long', format_string='<i'),
81 'unsigned long' : obj.Curry(
82 obj.NativeType, type_name='unsigned long', format_string='<I'),
83
84
85 'long long': obj.Curry(
86 obj.NativeType, type_name='long long', format_string='<q'),
87
88 'unsigned long long' : obj.Curry(
89 obj.NativeType, type_name='unsigned long long', format_string='<Q'),
90
91
92 'address' : obj.Curry(
93 obj.NativeType, type_name='address', format_string='<Q'),
94
95 'unsigned be short' : obj.Curry(
96 obj.NativeType, type_name='unsigned be short', format_string='>H'),
97 'unsigned be int' : obj.Curry(
98 obj.NativeType, type_name='unsigned be int', format_string='>I'),
99 }
100
101
102 ILP32 = {
103 'bool' : obj.Curry(obj.Bool, type_name='bool', format_string='<c'),
104
105
106 'char' : obj.Curry(obj.NativeType, type_name='char', format_string='<c'),
107 'unsigned char' : obj.Curry(
108 obj.NativeType, type_name='unsigned char', format_string='<B'),
109
110 'signed byte' : obj.Curry(
111 obj.NativeType, type_name='signed byte', format_string='<b'),
112
113
114 'short' : obj.Curry(obj.NativeType, type_name='short', format_string='<h'),
115 'unsigned short' : obj.Curry(
116 obj.NativeType, type_name='unsigned short', format_string='<H'),
117
118
119 'int' : obj.Curry(obj.NativeType, type_name='int', format_string='<i'),
120 'unsigned int' : obj.Curry(
121 obj.NativeType, type_name='unsigned int', format_string='<I'),
122
123
124 'long': obj.Curry(obj.NativeType, type_name='long', format_string='<i'),
125 'unsigned long' : obj.Curry(
126 obj.NativeType, type_name='unsigned long', format_string='<I'),
127
128
129 'long long': obj.Curry(
130 obj.NativeType, type_name='long long', format_string='<q'),
131
132 'unsigned long long' : obj.Curry(
133 obj.NativeType, type_name='unsigned long long', format_string='<Q'),
134
135
136 'address' : obj.Curry(
137 obj.NativeType, type_name='address', format_string='<I'),
138
139 'unsigned be short' : obj.Curry(
140 obj.NativeType, type_name='unsigned be short', format_string='>H'),
141 'unsigned be int' : obj.Curry(
142 obj.NativeType, type_name='unsigned be int', format_string='>I'),
143 }
144
145
146 BE32 = {
147 'bool' : obj.Curry(obj.Bool, type_name='bool', format_string='>c'),
148
149
150 'char' : obj.Curry(obj.NativeType, type_name='char', format_string='>c'),
151 'unsigned char' : obj.Curry(
152 obj.NativeType, type_name='unsigned char', format_string='>B'),
153
154 'signed byte' : obj.Curry(
155 obj.NativeType, type_name='signed byte', format_string='<b'),
156
157
158 'short' : obj.Curry(obj.NativeType, type_name='short', format_string='>h'),
159 'unsigned short' : obj.Curry(
160 obj.NativeType, type_name='unsigned short', format_string='>H'),
161
162
163 'int' : obj.Curry(obj.NativeType, type_name='int', format_string='>i'),
164 'unsigned int' : obj.Curry(
165 obj.NativeType, type_name='unsigned int', format_string='>I'),
166
167
168 'long': obj.Curry(obj.NativeType, type_name='long', format_string='>i'),
169 'unsigned long' : obj.Curry(
170 obj.NativeType, type_name='unsigned long', format_string='>I'),
171
172
173 'long long': obj.Curry(
174 obj.NativeType, type_name='long long', format_string='>q'),
175
176 'unsigned long long' : obj.Curry(
177 obj.NativeType, type_name='unsigned long long', format_string='>Q'),
178
179
180 'address' : obj.Curry(
181 obj.NativeType, type_name='address', format_string='>I'),
182
183 'unsigned be short' : obj.Curry(
184 obj.NativeType, type_name='unsigned be short', format_string='>H'),
185 'unsigned be int' : obj.Curry(
186 obj.NativeType, type_name='unsigned be int', format_string='>I'),
187 }
188
189
190 for model in [LP64, ILP32, LLP64, BE32]:
191 for old, new in [
192 ['char', 'signed char'],
193 ['unsigned char', 'byte'],
194
195 ['short', 'short int'],
196 ['unsigned short', 'unsigned short int'],
197
198 ['long', 'long int'],
199 ['unsigned long', 'unsigned long int'],
200 ['unsigned long', 'long unsigned int'],
201
202 ['long long', 'long long int'],
203 ['unsigned long long', 'unsigned long long int'],
204
205
206 ['unsigned long long', 'long long unsigned int'],
207 ['unsigned short', 'short unsigned int'],
208 ]:
209 model[new] = model[old]
210