| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | 
							- //
 
- // Author:
 
- //   Jb Evain (jbevain@gmail.com)
 
- //
 
- // Copyright (c) 2008 - 2015 Jb Evain
 
- // Copyright (c) 2008 - 2011 Novell, Inc.
 
- //
 
- // Licensed under the MIT/X11 license.
 
- //
 
- using System;
 
- using System.IO;
 
- using ILRuntime.Mono.Cecil.Cil;
 
- using ILRuntime.Mono.Cecil.Metadata;
 
- using ILRuntime.Mono.Collections.Generic;
 
- using RVA = System.UInt32;
 
- namespace ILRuntime.Mono.Cecil.PE {
 
- 	sealed class Image : IDisposable {
 
- 		public Disposable<Stream> Stream;
 
- 		public string FileName;
 
- 		public ModuleKind Kind;
 
- 		public string RuntimeVersion;
 
- 		public TargetArchitecture Architecture;
 
- 		public ModuleCharacteristics Characteristics;
 
- 		public ushort LinkerVersion;
 
- 		public ushort SubSystemMajor;
 
- 		public ushort SubSystemMinor;
 
- 		public ImageDebugHeader DebugHeader;
 
- 		public Section [] Sections;
 
- 		public Section MetadataSection;
 
- 		public uint EntryPointToken;
 
- 		public uint Timestamp;
 
- 		public ModuleAttributes Attributes;
 
- 		public DataDirectory Win32Resources;
 
- 		public DataDirectory Debug;
 
- 		public DataDirectory Resources;
 
- 		public DataDirectory StrongName;
 
- 		public StringHeap StringHeap;
 
- 		public BlobHeap BlobHeap;
 
- 		public UserStringHeap UserStringHeap;
 
- 		public GuidHeap GuidHeap;
 
- 		public TableHeap TableHeap;
 
- 		public PdbHeap PdbHeap;
 
- 		readonly int [] coded_index_sizes = new int [14];
 
- 		readonly Func<Table, int> counter;
 
- 		public Image ()
 
- 		{
 
- 			counter = GetTableLength;
 
- 		}
 
- 		public bool HasTable (Table table)
 
- 		{
 
- 			return GetTableLength (table) > 0;
 
- 		}
 
- 		public int GetTableLength (Table table)
 
- 		{
 
- 			return (int) TableHeap [table].Length;
 
- 		}
 
- 		public int GetTableIndexSize (Table table)
 
- 		{
 
- 			return GetTableLength (table) < 65536 ? 2 : 4;
 
- 		}
 
- 		public int GetCodedIndexSize (CodedIndex coded_index)
 
- 		{
 
- 			var index = (int) coded_index;
 
- 			var size = coded_index_sizes [index];
 
- 			if (size != 0)
 
- 				return size;
 
- 			return coded_index_sizes [index] = coded_index.GetSize (counter);
 
- 		}
 
- 		public uint ResolveVirtualAddress (RVA rva)
 
- 		{
 
- 			var section = GetSectionAtVirtualAddress (rva);
 
- 			if (section == null)
 
- 				throw new ArgumentOutOfRangeException ();
 
- 			return ResolveVirtualAddressInSection (rva, section);
 
- 		}
 
- 		public uint ResolveVirtualAddressInSection (RVA rva, Section section)
 
- 		{
 
- 			return rva + section.PointerToRawData - section.VirtualAddress;
 
- 		}
 
- 		public Section GetSection (string name)
 
- 		{
 
- 			var sections = this.Sections;
 
- 			for (int i = 0; i < sections.Length; i++) {
 
- 				var section = sections [i];
 
- 				if (section.Name == name)
 
- 					return section;
 
- 			}
 
- 			return null;
 
- 		}
 
- 		public Section GetSectionAtVirtualAddress (RVA rva)
 
- 		{
 
- 			var sections = this.Sections;
 
- 			for (int i = 0; i < sections.Length; i++) {
 
- 				var section = sections [i];
 
- 				if (rva >= section.VirtualAddress && rva < section.VirtualAddress + section.SizeOfRawData)
 
- 					return section;
 
- 			}
 
- 			return null;
 
- 		}
 
- 		BinaryStreamReader GetReaderAt (RVA rva)
 
- 		{
 
- 			var section = GetSectionAtVirtualAddress (rva);
 
- 			if (section == null)
 
- 				return null;
 
- 			var reader = new BinaryStreamReader (Stream.value);
 
- 			reader.MoveTo (ResolveVirtualAddressInSection (rva, section));
 
- 			return reader;
 
- 		}
 
- 		public TRet GetReaderAt<TItem, TRet> (RVA rva, TItem item, Func<TItem, BinaryStreamReader, TRet> read) where TRet : class
 
- 		{
 
- 			var position = Stream.value.Position;
 
- 			try {
 
- 				var reader = GetReaderAt (rva);
 
- 				if (reader == null)
 
- 					return null;
 
- 				return read (item, reader);
 
- 			} finally {
 
- 				Stream.value.Position = position;
 
- 			}
 
- 		}
 
- 		public bool HasDebugTables ()
 
- 		{
 
- 			return HasTable (Table.Document)
 
- 				|| HasTable (Table.MethodDebugInformation)
 
- 				|| HasTable (Table.LocalScope)
 
- 				|| HasTable (Table.LocalVariable)
 
- 				|| HasTable (Table.LocalConstant)
 
- 				|| HasTable (Table.StateMachineMethod)
 
- 				|| HasTable (Table.CustomDebugInformation);
 
- 		}
 
- 		public void Dispose ()
 
- 		{
 
- 			Stream.Dispose ();
 
- 		}
 
- 	}
 
- }
 
 
  |