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