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
11 // The above copyright notice and this permission notice shall be
\r
12 // included in all copies or substantial portions of the Software.
\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
23 * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
\r
28 using System.Runtime.InteropServices;
\r
30 using Mono.PEToolkit.Metadata;
\r
32 namespace Mono.PEToolkit {
\r
35 public enum CorFlags : uint {
\r
37 /// COMIMAGE_FLAGS_ILONLY
\r
39 ILONLY = 0x00000001,
\r
42 /// COMIMAGE_FLAGS_32BITREQUIRED
\r
44 REQUIRED_32BIT = 0x00000002,
\r
47 /// COMIMAGE_FLAGS_IL_LIBRARY
\r
49 IL_LIBRARY = 0x00000004,
\r
52 /// COMIMAGE_FLAGS_TRACKDEBUGDATA
\r
54 TRACKDEBUGDATA = 0x00010000,
\r
59 /// CLR 2.0 header structure.
\r
60 /// IMAGE_COR20_HEADER
\r
62 public class CorHeader {
\r
63 // Header versioning
\r
65 internal short runtimeMaj;
\r
66 internal short runtimeMin;
\r
68 // Symbol table and startup information.
\r
69 internal DataDir meta;
\r
70 internal CorFlags flags;
\r
71 internal uint entryTok;
\r
73 // Binding information.
\r
74 internal DataDir rsrc;
\r
75 internal DataDir strongSig;
\r
77 // Regular fixup and binding information.
\r
78 internal DataDir codeManTab;
\r
79 internal DataDir vtab;
\r
80 internal DataDir jumps;
\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
93 internal DataDir ipMap;
\r
109 public short MajorRuntimeVersion {
\r
114 runtimeMaj = value;
\r
118 public short MinorRuntimeVersion {
\r
123 runtimeMin = value;
\r
127 public string RuntimeVersion {
\r
129 return String.Format("{0}.{1}", runtimeMaj, runtimeMin);
\r
133 public DataDir MetaData {
\r
142 public CorFlags Flags {
\r
151 public MDToken EntryPointToken {
\r
160 public DataDir Resources {
\r
169 public DataDir StrongNameSignature {
\r
178 public DataDir CodeManagerTable {
\r
183 codeManTab = value;
\r
187 public DataDir VTableFixups {
\r
196 public DataDir ExportAddressTableJumps {
\r
206 public DataDir EEInfoTable {
\r
215 public DataDir HelperTable {
\r
224 public DataDir DynamicInfo {
\r
233 public DataDir DelayLoadInfo {
\r
242 public DataDir ModuleImage {
\r
251 public DataDir ExternalFixups {
\r
260 public DataDir RidMap {
\r
269 public DataDir DebugMap {
\r
279 public DataDir IPMap {
\r
289 public void Read(BinaryReader reader)
\r
291 // Header versioning
\r
292 cb = reader.ReadUInt32 ();
\r
294 runtimeMaj = reader.ReadInt16 ();
\r
295 runtimeMin = reader.ReadInt16 ();
\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
303 // Binding information.
\r
304 rsrc = new DataDir (reader);
\r
305 strongSig = new DataDir (reader);
\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
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
323 ipMap = new DataDir (reader);
\r
326 public void Write (BinaryWriter writer)
\r
328 // Header versioning
\r
331 writer.Write (runtimeMaj);
\r
332 writer.Write (runtimeMin);
\r
334 // Symbol table and startup information.
\r
335 meta.Write (writer);
\r
336 writer.Write ((uint)flags);
\r
337 writer.Write (entryTok);
\r
339 // Binding information.
\r
340 rsrc.Write (writer);
\r
341 strongSig.Write (writer);
\r
343 // Regular fixup and binding information.
\r
344 codeManTab.Write (writer);
\r
345 vtab.Write (writer);
\r
346 jumps.Write (writer);
\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
359 ipMap.Write (writer);
\r
363 public void Dump(TextWriter writer)
\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
389 meta, null, EntryPointToken,
\r
391 codeManTab, vtab, jumps,
\r
392 eeInfo, helper, dynInfo, delayInfo, modImg, extFixups,
\r
393 ridMap, dbgMap, ipMap, MajorRuntimeVersion, MinorRuntimeVersion
\r
400 /// <returns></returns>
\r
401 public override string ToString() {
\r
402 StringWriter sw = new StringWriter();
\r
404 return sw.ToString();
\r