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:
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
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>
28 using System
.Runtime
.InteropServices
;
30 using Mono
.PEToolkit
.Metadata
;
32 namespace Mono
.PEToolkit
{
35 public enum CorFlags
: uint {
37 /// COMIMAGE_FLAGS_ILONLY
42 /// COMIMAGE_FLAGS_32BITREQUIRED
44 REQUIRED_32BIT
= 0x00000002,
47 /// COMIMAGE_FLAGS_IL_LIBRARY
49 IL_LIBRARY
= 0x00000004,
52 /// COMIMAGE_FLAGS_TRACKDEBUGDATA
54 TRACKDEBUGDATA
= 0x00010000,
59 /// CLR 2.0 header structure.
60 /// IMAGE_COR20_HEADER
62 public class CorHeader
{
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
;
93 internal DataDir ipMap
;
109 public short MajorRuntimeVersion
{
118 public short MinorRuntimeVersion
{
127 public string RuntimeVersion
{
129 return String
.Format("{0}.{1}", runtimeMaj
, runtimeMin
);
133 public DataDir MetaData
{
142 public CorFlags Flags
{
151 public MDToken EntryPointToken
{
160 public DataDir Resources
{
169 public DataDir StrongNameSignature
{
178 public DataDir CodeManagerTable
{
187 public DataDir VTableFixups
{
196 public DataDir ExportAddressTableJumps
{
206 public DataDir EEInfoTable
{
215 public DataDir HelperTable
{
224 public DataDir DynamicInfo
{
233 public DataDir DelayLoadInfo
{
242 public DataDir ModuleImage
{
251 public DataDir ExternalFixups
{
260 public DataDir RidMap
{
269 public DataDir DebugMap
{
279 public DataDir IPMap
{
289 public void Read(BinaryReader reader
)
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
);
323 ipMap
= new DataDir (reader
);
326 public void Write (BinaryWriter writer
)
331 writer
.Write (runtimeMaj
);
332 writer
.Write (runtimeMin
);
334 // Symbol table and startup information.
336 writer
.Write ((uint)flags
);
337 writer
.Write (entryTok
);
339 // Binding information.
341 strongSig
.Write (writer
);
343 // Regular fixup and binding information.
344 codeManTab
.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
);
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
,
389 meta
, null, EntryPointToken
,
391 codeManTab
, vtab
, jumps
,
392 eeInfo
, helper
, dynInfo
, delayInfo
, modImg
, extFixups
,
393 ridMap
, dbgMap
, ipMap
, MajorRuntimeVersion
, MinorRuntimeVersion
400 /// <returns></returns>
401 public override string ToString() {
402 StringWriter sw
= new StringWriter();
404 return sw
.ToString();