**** Merged from MCS ****
[mono-project.git] / mcs / class / Mono.PEToolkit / CorHeader.cs
blob82ee82ce2038f4691477f2239ae7ed87bf55b25b
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining
4 // a copy of this software and associated documentation files (the
5 // "Software"), to deal in the Software without restriction, including
6 // without limitation the rights to use, copy, modify, merge, publish,
7 // distribute, sublicense, and/or sell copies of the Software, and to
8 // permit persons to whom the Software is furnished to do so, subject to
9 // the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
26 using System;
27 using System.IO;
28 using System.Runtime.InteropServices;
30 using Mono.PEToolkit.Metadata;
32 namespace Mono.PEToolkit {
34 [Flags]
35 public enum CorFlags : uint {
36 /// <summary>
37 /// COMIMAGE_FLAGS_ILONLY
38 /// </summary>
39 ILONLY = 0x00000001,
41 /// <summary>
42 /// COMIMAGE_FLAGS_32BITREQUIRED
43 /// </summary>
44 REQUIRED_32BIT = 0x00000002,
46 /// <summary>
47 /// COMIMAGE_FLAGS_IL_LIBRARY
48 /// </summary>
49 IL_LIBRARY = 0x00000004,
51 /// <summary>
52 /// COMIMAGE_FLAGS_TRACKDEBUGDATA
53 /// </summary>
54 TRACKDEBUGDATA = 0x00010000,
58 /// <summary>
59 /// CLR 2.0 header structure.
60 /// IMAGE_COR20_HEADER
61 /// </summary>
62 public class CorHeader {
63 // Header versioning
64 internal uint cb;
65 internal short runtimeMaj;
66 internal short runtimeMin;
68 // Symbol table and startup information.
69 internal DataDir meta;
70 internal CorFlags flags;
71 internal uint entryTok;
73 // Binding information.
74 internal DataDir rsrc;
75 internal DataDir strongSig;
77 // Regular fixup and binding information.
78 internal DataDir codeManTab;
79 internal DataDir vtab;
80 internal DataDir jumps;
82 // Managed Native Code.
83 internal DataDir eeInfo;
84 internal DataDir helper;
85 internal DataDir dynInfo;
86 internal DataDir delayInfo;
87 internal DataDir modImg;
88 internal DataDir extFixups;
89 internal DataDir ridMap;
90 internal DataDir dbgMap;
92 // obsolete?
93 internal DataDir ipMap;
97 // Accessors
100 public uint Size {
101 get {
102 return cb;
104 set {
105 cb = value;
109 public short MajorRuntimeVersion {
110 get {
111 return runtimeMaj;
113 set {
114 runtimeMaj = value;
118 public short MinorRuntimeVersion {
119 get {
120 return runtimeMin;
122 set {
123 runtimeMin = value;
127 public string RuntimeVersion {
128 get {
129 return String.Format("{0}.{1}", runtimeMaj, runtimeMin);
133 public DataDir MetaData {
134 get {
135 return meta;
137 set {
138 meta = value;
142 public CorFlags Flags {
143 get {
144 return flags;
146 set {
147 flags = value;
151 public MDToken EntryPointToken {
152 get {
153 return entryTok;
155 set {
156 entryTok = value;
160 public DataDir Resources {
161 get {
162 return rsrc;
164 set {
165 rsrc = value;
169 public DataDir StrongNameSignature {
170 get {
171 return strongSig;
173 set {
174 strongSig = value;
178 public DataDir CodeManagerTable {
179 get {
180 return codeManTab;
182 set {
183 codeManTab = value;
187 public DataDir VTableFixups {
188 get {
189 return vtab;
191 set {
192 vtab = value;
196 public DataDir ExportAddressTableJumps {
197 get {
198 return jumps;
200 set {
201 jumps = value;
206 public DataDir EEInfoTable {
207 get {
208 return eeInfo;
210 set {
211 eeInfo = value;
215 public DataDir HelperTable {
216 get {
217 return helper;
219 set {
220 helper = value;
224 public DataDir DynamicInfo {
225 get {
226 return dynInfo;
228 set {
229 dynInfo = value;
233 public DataDir DelayLoadInfo {
234 get {
235 return delayInfo;
237 set {
238 delayInfo = value;
242 public DataDir ModuleImage {
243 get {
244 return modImg;
246 set {
247 modImg = value;
251 public DataDir ExternalFixups {
252 get {
253 return extFixups;
255 set {
256 extFixups = value;
260 public DataDir RidMap {
261 get {
262 return ridMap;
264 set {
265 ridMap = value;
269 public DataDir DebugMap {
270 get {
271 return dbgMap;
273 set {
274 dbgMap = value;
279 public DataDir IPMap {
280 get {
281 return ipMap;
283 set {
284 ipMap = value;
289 public void Read(BinaryReader reader)
291 // Header versioning
292 cb = reader.ReadUInt32 ();
294 runtimeMaj = reader.ReadInt16 ();
295 runtimeMin = reader.ReadInt16 ();
298 // Symbol table and startup information.
299 meta = new DataDir (reader);
300 flags = (CorFlags) reader.ReadUInt32 ();
301 entryTok = reader.ReadUInt32 ();
303 // Binding information.
304 rsrc = new DataDir (reader);
305 strongSig = new DataDir (reader);
307 // Regular fixup and binding information.
308 codeManTab = new DataDir (reader);
309 vtab = new DataDir (reader);
310 jumps = new DataDir (reader);
312 // Managed Native Code.
313 eeInfo = new DataDir (reader);
314 helper = new DataDir (reader);
315 dynInfo = new DataDir (reader);
316 delayInfo = new DataDir (reader);
317 modImg = new DataDir (reader);
318 extFixups = new DataDir (reader);
319 ridMap = new DataDir (reader);
320 dbgMap = new DataDir (reader);
322 // obsolete?
323 ipMap = new DataDir (reader);
326 public void Write (BinaryWriter writer)
328 // Header versioning
329 writer.Write (cb);
331 writer.Write (runtimeMaj);
332 writer.Write (runtimeMin);
334 // Symbol table and startup information.
335 meta.Write (writer);
336 writer.Write ((uint)flags);
337 writer.Write (entryTok);
339 // Binding information.
340 rsrc.Write (writer);
341 strongSig.Write (writer);
343 // Regular fixup and binding information.
344 codeManTab.Write (writer);
345 vtab.Write (writer);
346 jumps.Write (writer);
348 // Managed Native Code.
349 eeInfo.Write (writer);
350 helper.Write (writer);
351 dynInfo.Write (writer);
352 delayInfo.Write (writer);
353 modImg.Write (writer);
354 extFixups.Write (writer);
355 ridMap.Write (writer);
356 dbgMap.Write (writer);
358 // obsolete?
359 ipMap.Write (writer);
363 public void Dump(TextWriter writer)
365 writer.WriteLine(String.Format (
366 "Header Size : {0}" + Environment.NewLine +
367 "Runtime Version : {1}" + Environment.NewLine +
368 "MetaData Root : {2}" + Environment.NewLine +
369 "Flags : {3}" + Environment.NewLine +
370 "Entry Point Token : {4}" + Environment.NewLine +
371 "Resources : {5}" + Environment.NewLine +
372 "Strong Name Signature : {6}" + Environment.NewLine +
373 "Code Manager Table : {7}" + Environment.NewLine +
374 "VTable Fixups : {8}" + Environment.NewLine +
375 "Export Address Table Jumps : {9}" + Environment.NewLine +
376 "EE Info Table : {10}" + Environment.NewLine +
377 "Helper Table : {11}" + Environment.NewLine +
378 "Dynamic Info : {12}" + Environment.NewLine +
379 "Delay Load Info : {13}" + Environment.NewLine +
380 "Module Image : {14}" + Environment.NewLine +
381 "External Fixups : {15}" + Environment.NewLine +
382 "Rid Map : {16}" + Environment.NewLine +
383 "Debug Map : {17}" + Environment.NewLine +
384 "IP Map : {18}" + Environment.NewLine +
385 "Runtime Major : {19}" + Environment.NewLine +
386 "Runtime Minor : {20}" + Environment.NewLine,
388 RuntimeVersion,
389 meta, null, EntryPointToken,
390 rsrc, strongSig,
391 codeManTab, vtab, jumps,
392 eeInfo, helper, dynInfo, delayInfo, modImg, extFixups,
393 ridMap, dbgMap, ipMap, MajorRuntimeVersion, MinorRuntimeVersion
398 /// <summary>
399 /// </summary>
400 /// <returns></returns>
401 public override string ToString() {
402 StringWriter sw = new StringWriter();
403 Dump(sw);
404 return sw.ToString();