* MarshalTest.cs: Added test for bug #76123.
[mono.git] / mcs / class / Mono.PEToolkit / CorHeader.cs
1 \r
2 //\r
3 // Permission is hereby granted, free of charge, to any person obtaining\r
4 // a copy of this software and associated documentation files (the\r
5 // "Software"), to deal in the Software without restriction, including\r
6 // without limitation the rights to use, copy, modify, merge, publish,\r
7 // distribute, sublicense, and/or sell copies of the Software, and to\r
8 // permit persons to whom the Software is furnished to do so, subject to\r
9 // the following conditions:\r
10 // \r
11 // The above copyright notice and this permission notice shall be\r
12 // included in all copies or substantial portions of the Software.\r
13 // \r
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21 //\r
22 /*\r
23  * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>\r
24  */\r
25 \r
26 using System;\r
27 using System.IO;\r
28 using System.Runtime.InteropServices;\r
29 \r
30 using Mono.PEToolkit.Metadata;\r
31 \r
32 namespace Mono.PEToolkit {\r
33 \r
34         [Flags]\r
35         public enum CorFlags : uint {\r
36                 /// <summary>\r
37                 /// COMIMAGE_FLAGS_ILONLY\r
38                 /// </summary>\r
39                 ILONLY = 0x00000001,\r
40                 \r
41                 /// <summary>\r
42                 /// COMIMAGE_FLAGS_32BITREQUIRED\r
43                 /// </summary>\r
44                 REQUIRED_32BIT = 0x00000002,\r
45                 \r
46                 /// <summary>\r
47                 /// COMIMAGE_FLAGS_IL_LIBRARY\r
48                 /// </summary>\r
49                 IL_LIBRARY = 0x00000004,\r
50                 \r
51                 /// <summary>\r
52                 /// COMIMAGE_FLAGS_TRACKDEBUGDATA\r
53                 /// </summary>\r
54                 TRACKDEBUGDATA = 0x00010000,\r
55         }\r
56 \r
57 \r
58         /// <summary>\r
59         /// CLR 2.0 header structure.\r
60         /// IMAGE_COR20_HEADER\r
61         /// </summary>\r
62         public class CorHeader {\r
63                 // Header versioning\r
64                 internal uint cb;\r
65                 internal short runtimeMaj;\r
66                 internal short runtimeMin;\r
67 \r
68                 // Symbol table and startup information.\r
69                 internal DataDir meta;\r
70                 internal CorFlags flags;\r
71                 internal uint entryTok;\r
72 \r
73                 // Binding information.\r
74                 internal DataDir rsrc;\r
75                 internal DataDir strongSig;\r
76 \r
77                 // Regular fixup and binding information.\r
78                 internal DataDir codeManTab;\r
79                 internal DataDir vtab;\r
80                 internal DataDir jumps;\r
81 \r
82                 // Managed Native Code.\r
83                 internal DataDir eeInfo;\r
84                 internal DataDir helper;\r
85                 internal DataDir dynInfo;\r
86                 internal DataDir delayInfo;\r
87                 internal DataDir modImg;\r
88                 internal DataDir extFixups;\r
89                 internal DataDir ridMap;\r
90                 internal DataDir dbgMap;\r
91 \r
92                 // obsolete?\r
93                 internal DataDir ipMap;\r
94 \r
95 \r
96                 //\r
97                 // Accessors\r
98                 //\r
99 \r
100                 public uint Size {\r
101                         get {\r
102                                 return cb;\r
103                         }\r
104                         set {\r
105                                 cb = value;\r
106                         }\r
107                 }\r
108 \r
109                 public short MajorRuntimeVersion {\r
110                         get {\r
111                                 return runtimeMaj;\r
112                         }\r
113                         set {\r
114                                 runtimeMaj = value;\r
115                         }\r
116                 }\r
117 \r
118                 public short MinorRuntimeVersion {\r
119                         get {\r
120                                 return runtimeMin;\r
121                         }\r
122                         set {\r
123                                 runtimeMin = value;\r
124                         }\r
125                 }\r
126 \r
127                 public string RuntimeVersion {\r
128                         get {\r
129                                 return String.Format("{0}.{1}", runtimeMaj, runtimeMin);\r
130                         }\r
131                 }\r
132 \r
133                 public DataDir MetaData {\r
134                         get {\r
135                                 return meta;\r
136                         }\r
137                         set {\r
138                                 meta = value;\r
139                         }\r
140                 }\r
141                 \r
142                 public CorFlags Flags {\r
143                         get {\r
144                                 return flags;\r
145                         }\r
146                         set {\r
147                                 flags = value;\r
148                         }\r
149                 }\r
150                 \r
151                 public MDToken EntryPointToken {\r
152                         get {\r
153                                 return entryTok;\r
154                         }\r
155                         set {\r
156                                 entryTok = value;\r
157                         }\r
158                 }\r
159 \r
160                 public DataDir Resources {\r
161                         get {\r
162                                 return rsrc;\r
163                         }\r
164                         set {\r
165                                 rsrc = value;\r
166                         }\r
167                 }\r
168                 \r
169                 public DataDir StrongNameSignature {\r
170                         get {\r
171                                 return strongSig;\r
172                         }\r
173                         set {\r
174                                 strongSig = value;\r
175                         }\r
176                 }\r
177 \r
178                 public DataDir CodeManagerTable {\r
179                         get {\r
180                                 return codeManTab;\r
181                         }\r
182                         set {\r
183                                 codeManTab = value;\r
184                         }\r
185                 }\r
186                 \r
187                 public DataDir VTableFixups {\r
188                         get {\r
189                                 return vtab;\r
190                         }\r
191                         set {\r
192                                 vtab = value;\r
193                         }\r
194                 }\r
195                 \r
196                 public DataDir ExportAddressTableJumps {\r
197                         get {\r
198                                 return jumps;\r
199                         }\r
200                         set {\r
201                                 jumps = value;\r
202                         }\r
203                 }\r
204 \r
205 \r
206                 public DataDir EEInfoTable {\r
207                         get {\r
208                                 return eeInfo;\r
209                         }\r
210                         set {\r
211                                 eeInfo = value;\r
212                         }\r
213                 }\r
214 \r
215                 public DataDir HelperTable {\r
216                         get {\r
217                                 return helper;\r
218                         }\r
219                         set {\r
220                                 helper = value;\r
221                         }\r
222                 }\r
223                 \r
224                 public DataDir DynamicInfo {\r
225                         get {\r
226                                 return dynInfo;\r
227                         }\r
228                         set {\r
229                                 dynInfo = value;\r
230                         }\r
231                 }\r
232                 \r
233                 public DataDir DelayLoadInfo {\r
234                         get {\r
235                                 return delayInfo;\r
236                         }\r
237                         set {\r
238                                 delayInfo = value;\r
239                         }\r
240                 }\r
241                 \r
242                 public DataDir ModuleImage {\r
243                         get {\r
244                                 return modImg;\r
245                         }\r
246                         set {\r
247                                 modImg = value;\r
248                         }\r
249                 }\r
250                 \r
251                 public DataDir ExternalFixups {\r
252                         get {\r
253                                 return extFixups;\r
254                         }\r
255                         set {\r
256                                 extFixups = value;\r
257                         }\r
258                 }\r
259                 \r
260                 public DataDir RidMap {\r
261                         get {\r
262                                 return ridMap;\r
263                         }\r
264                         set {\r
265                                 ridMap = value;\r
266                         }\r
267                 }\r
268                 \r
269                 public DataDir DebugMap {\r
270                         get {\r
271                                 return dbgMap;\r
272                         }\r
273                         set {\r
274                                 dbgMap = value;\r
275                         }\r
276                 }\r
277 \r
278 \r
279                 public DataDir IPMap {\r
280                         get {\r
281                                 return ipMap;\r
282                         }\r
283                         set {\r
284                                 ipMap = value;\r
285                         }\r
286                 }\r
287 \r
288 \r
289                 public void Read(BinaryReader reader)\r
290                 {\r
291                         // Header versioning\r
292                         cb = reader.ReadUInt32 ();\r
293                         \r
294                         runtimeMaj = reader.ReadInt16 ();\r
295                         runtimeMin = reader.ReadInt16 ();\r
296         \r
297                         \r
298                         // Symbol table and startup information.\r
299                         meta = new DataDir (reader);\r
300                         flags = (CorFlags) reader.ReadUInt32 ();\r
301                         entryTok = reader.ReadUInt32 ();\r
302 \r
303                         // Binding information.\r
304                         rsrc  = new DataDir (reader);\r
305                         strongSig = new DataDir (reader);\r
306                 \r
307                         // Regular fixup and binding information.\r
308                         codeManTab = new DataDir (reader);\r
309                         vtab = new DataDir (reader);\r
310                         jumps = new DataDir (reader);\r
311 \r
312                         // Managed Native Code.\r
313                         eeInfo = new DataDir (reader);\r
314                         helper = new DataDir (reader);\r
315                         dynInfo = new DataDir (reader);\r
316                         delayInfo = new DataDir (reader);\r
317                         modImg = new DataDir (reader);\r
318                         extFixups = new DataDir (reader);\r
319                         ridMap = new DataDir (reader);\r
320                         dbgMap = new DataDir (reader);\r
321 \r
322                         // obsolete?\r
323                         ipMap = new DataDir (reader);\r
324                 }\r
325 \r
326                 public void Write (BinaryWriter writer)\r
327                 {\r
328                         // Header versioning\r
329                         writer.Write (cb);\r
330                         \r
331                         writer.Write (runtimeMaj);\r
332                         writer.Write (runtimeMin);\r
333                                 \r
334                         // Symbol table and startup information.\r
335                         meta.Write (writer);\r
336                         writer.Write ((uint)flags);\r
337                         writer.Write (entryTok);\r
338 \r
339                         // Binding information.\r
340                         rsrc.Write (writer);\r
341                         strongSig.Write (writer);\r
342                 \r
343                         // Regular fixup and binding information.\r
344                         codeManTab.Write (writer);\r
345                         vtab.Write (writer);\r
346                         jumps.Write (writer);\r
347 \r
348                         // Managed Native Code.\r
349                         eeInfo.Write (writer);\r
350                         helper.Write (writer);\r
351                         dynInfo.Write (writer);\r
352                         delayInfo.Write (writer);\r
353                         modImg.Write (writer);\r
354                         extFixups.Write (writer);\r
355                         ridMap.Write (writer);\r
356                         dbgMap.Write (writer);\r
357 \r
358                         // obsolete?\r
359                         ipMap.Write (writer);\r
360                 }\r
361 \r
362 \r
363                 public void Dump(TextWriter writer)\r
364                 {\r
365                         writer.WriteLine(String.Format (\r
366                                 "Header Size                : {0}"  + Environment.NewLine +\r
367                                 "Runtime Version            : {1}"  + Environment.NewLine +\r
368                                 "MetaData Root              : {2}"  + Environment.NewLine +\r
369                                 "Flags                      : {3}"  + Environment.NewLine +\r
370                                 "Entry Point Token          : {4}"  + Environment.NewLine +\r
371                                 "Resources                  : {5}"  + Environment.NewLine +\r
372                                 "Strong Name Signature      : {6}"  + Environment.NewLine +\r
373                                 "Code Manager Table         : {7}"  + Environment.NewLine +\r
374                                 "VTable Fixups              : {8}"  + Environment.NewLine +\r
375                                 "Export Address Table Jumps : {9}"  + Environment.NewLine +\r
376                                 "EE Info Table              : {10}"  + Environment.NewLine +\r
377                                 "Helper Table               : {11}"  + Environment.NewLine +\r
378                                 "Dynamic Info               : {12}"  + Environment.NewLine +\r
379                                 "Delay Load Info            : {13}"  + Environment.NewLine +\r
380                                 "Module Image               : {14}"  + Environment.NewLine +\r
381                                 "External Fixups            : {15}"  + Environment.NewLine +\r
382                                 "Rid Map                    : {16}"  + Environment.NewLine +\r
383                                 "Debug Map                  : {17}"  + Environment.NewLine +\r
384                                 "IP Map                     : {18}"  + Environment.NewLine +\r
385                                 "Runtime Major              : {19}"  + Environment.NewLine +\r
386                                 "Runtime Minor              : {20}" + Environment.NewLine,\r
387                                 cb,\r
388                                 RuntimeVersion,\r
389                                 meta, null, EntryPointToken,\r
390                                 rsrc, strongSig,\r
391                                 codeManTab, vtab, jumps,\r
392                                 eeInfo, helper, dynInfo, delayInfo, modImg, extFixups,\r
393                                 ridMap, dbgMap, ipMap, MajorRuntimeVersion, MinorRuntimeVersion\r
394                         ));\r
395                         \r
396                 }\r
397 \r
398                 /// <summary>\r
399                 /// </summary>\r
400                 /// <returns></returns>\r
401                 public override string ToString() {\r
402                         StringWriter sw = new StringWriter();\r
403                         Dump(sw);\r
404                         return sw.ToString();\r
405                 }\r
406 \r
407 \r
408         }\r
409 }\r