/// <summary>
 /// Constructor
 /// </summary>
 /// <param name="module">Module</param>
 /// <param name="listener">Module writer listener</param>
 public NativeModuleWriterOptions(ModuleDefMD module, IModuleWriterListener listener)
     : base(module, listener)
 {
     // C++ .NET mixed mode assemblies sometimes/often call Module.ResolveMethod(),
     // so method metadata tokens must be preserved.
     MetaDataOptions.Flags |= MetaDataFlags.PreserveAllMethodRids;
 }
예제 #2
0
 public void Save(string newFilename, MetaDataFlags mdFlags, IModuleWriterListener writerListener)
 {
     if (module.IsILOnly)
     {
         var writerOptions = new ModuleWriterOptions(module, writerListener);
         writerOptions.MetaDataOptions.Flags |= mdFlags;
         writerOptions.Logger = Logger.Instance;
         if (Logger.Instance.ForcePDBGeneration)
         {
             writerOptions.WritePdb = true;
             module.CreatePdbState();
         }
         module.Write(newFilename, writerOptions);
     }
     else
     {
         var writerOptions = new NativeModuleWriterOptions(module, writerListener);
         writerOptions.MetaDataOptions.Flags |= mdFlags;
         writerOptions.Logger             = Logger.Instance;
         writerOptions.KeepExtraPEData    = true;
         writerOptions.KeepWin32Resources = true;
         if (Logger.Instance.ForcePDBGeneration)
         {
             writerOptions.WritePdb = true;
             module.CreatePdbState();
         }
         module.NativeWrite(newFilename, writerOptions);
     }
 }
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="module">Module</param>
		/// <param name="listener">Module writer listener</param>
		public NativeModuleWriterOptions(ModuleDefMD module, IModuleWriterListener listener)
			: base(module, listener) {

			// C++ .NET mixed mode assemblies sometimes/often call Module.ResolveMethod(),
			// so method metadata tokens must be preserved.
			MetaDataOptions.Flags |= MetaDataFlags.PreserveAllMethodRids;
		}
예제 #4
0
		public void Save(string newFilename, MetaDataFlags mdFlags, IModuleWriterListener writerListener) {
			if (module.IsILOnly) {
				var writerOptions = new ModuleWriterOptions(module, writerListener);
				writerOptions.MetaDataOptions.Flags |= mdFlags;
				writerOptions.Logger = Logger.Instance;
				module.Write(newFilename, writerOptions);
			}
			else {
				var writerOptions = new NativeModuleWriterOptions(module, writerListener);
				writerOptions.MetaDataOptions.Flags |= mdFlags;
				writerOptions.Logger = Logger.Instance;
				writerOptions.KeepExtraPEData = true;
				writerOptions.KeepWin32Resources = true;
				module.NativeWrite(newFilename, writerOptions);
			}
		}
 public void save(Stream memStream, MetaDataFlags mdFlags, IModuleWriterListener writerListener)
 {
     if (module.IsILOnly)
     {
         var writerOptions = new ModuleWriterOptions(module, writerListener);
         writerOptions.MetaDataOptions.Flags |= mdFlags;
         writerOptions.Logger = Logger.Instance;
         module.Write(memStream, writerOptions);
     }
     else
     {
         var writerOptions = new NativeModuleWriterOptions(module, writerListener);
         writerOptions.MetaDataOptions.Flags |= mdFlags;
         writerOptions.Logger             = Logger.Instance;
         writerOptions.KeepExtraPEData    = true;
         writerOptions.KeepWin32Resources = true;
         module.NativeWrite(memStream, writerOptions);
     }
 }
            public void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e)
            {
                var writer = (ModuleWriter)sender;

                if (commitListener != null)
                {
                    commitListener.OnWriterEvent(writer, e.WriterEvent);
                }

                if (e.WriterEvent == ModuleWriterEvent.MDBeginWriteMethodBodies && methods.ContainsKey(writer.Module))
                {
                    vr.ProcessMethods(writer.Module);

                    foreach (var repl in refRepl)
                    {
                        vr.Runtime.Descriptor.Data.ReplaceReference(repl.Key, repl.Value);
                    }

                    commitListener = vr.CommitModule((ModuleDefMD)module);
                }
            }
예제 #7
0
 public void Save(string newFilename, MetadataFlags mdFlags, IModuleWriterListener writerListener)
 {
     if (module.IsILOnly)
     {
         var writerOptions = new ModuleWriterOptions(module);
         writerOptions.WriterEvent           += (s, e) => writerListener?.OnWriterEvent(e.Writer, e.Event);
         writerOptions.MetadataOptions.Flags |= mdFlags;
         writerOptions.Logger = Logger.Instance;
         module.Write(newFilename, writerOptions);
     }
     else
     {
         var writerOptions = new NativeModuleWriterOptions(module, optimizeImageSize: true);
         writerOptions.WriterEvent           += (s, e) => writerListener?.OnWriterEvent(e.Writer, e.Event);
         writerOptions.MetadataOptions.Flags |= mdFlags;
         writerOptions.Logger             = Logger.Instance;
         writerOptions.KeepExtraPEData    = true;
         writerOptions.KeepWin32Resources = true;
         module.NativeWrite(newFilename, writerOptions);
     }
 }
예제 #8
0
            public void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e)
            {
                var writer = (ModuleWriter)sender;

                if (this.commitListener != null)
                {
                    this.commitListener.OnWriterEvent(writer, e.WriterEvent);
                }

                if (e.WriterEvent != ModuleWriterEvent.MDBeginWriteMethodBodies || !this.methods.ContainsKey(writer.Module))
                {
                    if (this.commitListener != null && e.WriterEvent == ModuleWriterEvent.End && this.vr.ExportDbgInfo)
                    {
                        string mapName = Path.ChangeExtension(writer.Module.Name, "map");
                        string mapPath = Path.GetFullPath(Path.Combine(this.ctx.OutputDirectory, mapName));
                        Directory.CreateDirectory(this.ctx.OutputDirectory);
                        File.WriteAllBytes(mapPath, this.vr.Runtime.DebugInfo);
                    }
                }
                else
                {
                    this.vr.ProcessMethods(writer.Module, (num, total) =>
                    {
                        this.ctx.Logger.Progress(num, total);
                        this.ctx.CheckCancellation();
                    });
                    this.ctx.Logger.EndProgress();

                    foreach (KeyValuePair <IMemberRef, IMemberRef> repl in this.refRepl)
                    {
                        this.vr.Runtime.Descriptor.Data.ReplaceReference(repl.Key, repl.Value);
                    }

                    this.commitListener = this.vr.CommitModule(this.ctx.CurrentModule, (num, total) =>
                    {
                        this.ctx.Logger.Progress(num, total);
                        this.ctx.CheckCancellation();
                    });
                }
            }
            public void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e)
            {
                var writer = (ModuleWriter)sender;

                if (commitListener != null)
                {
                    commitListener.OnWriterEvent(writer, e.WriterEvent);
                }

                if (e.WriterEvent == ModuleWriterEvent.MDBeginWriteMethodBodies && methods.ContainsKey(writer.Module))
                {
                    ctx.Logger.Debug("Virtualizing methods...");

                    vr.ProcessMethods(writer.Module, (num, total) =>
                    {
                        ctx.Logger.Progress(num, total);
                        ctx.CheckCancellation();
                    });
                    ctx.Logger.EndProgress();

                    foreach (var repl in refRepl)
                    {
                        vr.Runtime.Descriptor.Data.ReplaceReference(repl.Key, repl.Value);
                    }

                    commitListener = vr.CommitModule(ctx.CurrentModule, (num, total) =>
                    {
                        ctx.Logger.Progress(num, total);
                        ctx.CheckCancellation();
                    });
                }
                else if (commitListener != null && e.WriterEvent == ModuleWriterEvent.End && vr.ExportDbgInfo)
                {
                    var mapName = Path.ChangeExtension(writer.Module.Name, "map");
                    var mapPath = Path.GetFullPath(Path.Combine(ctx.OutputDirectory, mapName));
                    Directory.CreateDirectory(ctx.OutputDirectory);
                    File.WriteAllBytes(mapPath, vr.Runtime.DebugInfo);
                }
            }
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="module">The module</param>
		/// <param name="listener">Module writer listener</param>
		protected ModuleWriterOptionsBase(ModuleDef module, IModuleWriterListener listener) {
			this.listener = listener;
			ShareMethodBodies = true;
			MetaDataOptions.MetaDataHeaderOptions.VersionString = module.RuntimeVersion;
			ModuleKind = module.Kind;
			PEHeadersOptions.Machine = module.Machine;
			PEHeadersOptions.Characteristics = module.Characteristics;
			PEHeadersOptions.DllCharacteristics = module.DllCharacteristics;
			if (module.Kind == ModuleKind.Windows)
				PEHeadersOptions.Subsystem = Subsystem.WindowsGui;
			else
				PEHeadersOptions.Subsystem = Subsystem.WindowsCui;
			PEHeadersOptions.NumberOfRvaAndSizes = 0x10;
			Cor20HeaderOptions.Flags = module.Cor20HeaderFlags;

			if (module.Assembly != null && !PublicKeyBase.IsNullOrEmpty2(module.Assembly.PublicKey))
				Cor20HeaderOptions.Flags |= ComImageFlags.StrongNameSigned;

			if (module.Cor20HeaderRuntimeVersion != null) {
				Cor20HeaderOptions.MajorRuntimeVersion = (ushort)(module.Cor20HeaderRuntimeVersion.Value >> 16);
				Cor20HeaderOptions.MinorRuntimeVersion = (ushort)module.Cor20HeaderRuntimeVersion.Value;
			}
			else if (module.IsClr1x) {
				Cor20HeaderOptions.MajorRuntimeVersion = 2;
				Cor20HeaderOptions.MinorRuntimeVersion = 0;
			}
			else {
				Cor20HeaderOptions.MajorRuntimeVersion = 2;
				Cor20HeaderOptions.MinorRuntimeVersion = 5;
			}

			if (module.TablesHeaderVersion != null) {
				MetaDataOptions.TablesHeapOptions.MajorVersion = (byte)(module.TablesHeaderVersion.Value >> 8);
				MetaDataOptions.TablesHeapOptions.MinorVersion = (byte)module.TablesHeaderVersion.Value;
			}
			else if (module.IsClr1x) {
				// Generics aren't supported
				MetaDataOptions.TablesHeapOptions.MajorVersion = 1;
				MetaDataOptions.TablesHeapOptions.MinorVersion = 0;
			}
			else {
				// Generics are supported
				MetaDataOptions.TablesHeapOptions.MajorVersion = 2;
				MetaDataOptions.TablesHeapOptions.MinorVersion = 0;
			}

			// Some tools crash if #GUID is missing so always create it by default
			MetaDataOptions.Flags |= MetaDataFlags.AlwaysCreateGuidHeap;

			var modDefMD = module as ModuleDefMD;
			if (modDefMD != null) {
				var ntHeaders = modDefMD.MetaData.PEImage.ImageNTHeaders;
				PEHeadersOptions.TimeDateStamp = ntHeaders.FileHeader.TimeDateStamp;
				PEHeadersOptions.MajorLinkerVersion = ntHeaders.OptionalHeader.MajorLinkerVersion;
				PEHeadersOptions.MinorLinkerVersion = ntHeaders.OptionalHeader.MinorLinkerVersion;
				PEHeadersOptions.ImageBase = ntHeaders.OptionalHeader.ImageBase;
				AddCheckSum = ntHeaders.OptionalHeader.CheckSum != 0;
			}

			if (Is64Bit) {
				PEHeadersOptions.Characteristics &= ~Characteristics._32BitMachine;
				PEHeadersOptions.Characteristics |= Characteristics.LargeAddressAware;
			}
			else
				PEHeadersOptions.Characteristics |= Characteristics._32BitMachine;
		}
예제 #11
0
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="module">The module</param>
		/// <param name="listener">Module writer listener</param>
		public ModuleWriterOptions(ModuleDef module, IModuleWriterListener listener)
			: base(module, listener) {
		}
예제 #12
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="module">The module</param>
        /// <param name="listener">Module writer listener</param>
        protected ModuleWriterOptionsBase(ModuleDef module, IModuleWriterListener listener)
        {
            this.listener     = listener;
            ShareMethodBodies = true;
            MetaDataOptions.MetaDataHeaderOptions.VersionString = module.RuntimeVersion;
            ModuleKind = module.Kind;
            PEHeadersOptions.Machine            = module.Machine;
            PEHeadersOptions.Characteristics    = module.Characteristics;
            PEHeadersOptions.DllCharacteristics = module.DllCharacteristics;
            if (module.Kind == ModuleKind.Windows)
            {
                PEHeadersOptions.Subsystem = Subsystem.WindowsGui;
            }
            else
            {
                PEHeadersOptions.Subsystem = Subsystem.WindowsCui;
            }
            PEHeadersOptions.NumberOfRvaAndSizes = 0x10;
            Cor20HeaderOptions.Flags             = module.Cor20HeaderFlags;

            if (module.Assembly != null && !PublicKeyBase.IsNullOrEmpty2(module.Assembly.PublicKey))
            {
                Cor20HeaderOptions.Flags |= ComImageFlags.StrongNameSigned;
            }

            if (module.Cor20HeaderRuntimeVersion != null)
            {
                Cor20HeaderOptions.MajorRuntimeVersion = (ushort)(module.Cor20HeaderRuntimeVersion.Value >> 16);
                Cor20HeaderOptions.MinorRuntimeVersion = (ushort)module.Cor20HeaderRuntimeVersion.Value;
            }
            else if (module.IsClr1x)
            {
                Cor20HeaderOptions.MajorRuntimeVersion = 2;
                Cor20HeaderOptions.MinorRuntimeVersion = 0;
            }
            else
            {
                Cor20HeaderOptions.MajorRuntimeVersion = 2;
                Cor20HeaderOptions.MinorRuntimeVersion = 5;
            }

            if (module.TablesHeaderVersion != null)
            {
                MetaDataOptions.TablesHeapOptions.MajorVersion = (byte)(module.TablesHeaderVersion.Value >> 8);
                MetaDataOptions.TablesHeapOptions.MinorVersion = (byte)module.TablesHeaderVersion.Value;
            }
            else if (module.IsClr1x)
            {
                // Generics aren't supported
                MetaDataOptions.TablesHeapOptions.MajorVersion = 1;
                MetaDataOptions.TablesHeapOptions.MinorVersion = 0;
            }
            else
            {
                // Generics are supported
                MetaDataOptions.TablesHeapOptions.MajorVersion = 2;
                MetaDataOptions.TablesHeapOptions.MinorVersion = 0;
            }

            // Some tools crash if #GUID is missing so always create it by default
            MetaDataOptions.Flags |= MetaDataFlags.AlwaysCreateGuidHeap;

            var modDefMD = module as ModuleDefMD;

            if (modDefMD != null)
            {
                var ntHeaders = modDefMD.MetaData.PEImage.ImageNTHeaders;
                PEHeadersOptions.TimeDateStamp      = ntHeaders.FileHeader.TimeDateStamp;
                PEHeadersOptions.MajorLinkerVersion = ntHeaders.OptionalHeader.MajorLinkerVersion;
                PEHeadersOptions.MinorLinkerVersion = ntHeaders.OptionalHeader.MinorLinkerVersion;
                PEHeadersOptions.ImageBase          = ntHeaders.OptionalHeader.ImageBase;
                AddCheckSum = ntHeaders.OptionalHeader.CheckSum != 0;
            }

            if (Is64Bit)
            {
                PEHeadersOptions.Characteristics &= ~Characteristics._32BitMachine;
                PEHeadersOptions.Characteristics |= Characteristics.LargeAddressAware;
            }
            else
            {
                PEHeadersOptions.Characteristics |= Characteristics._32BitMachine;
            }
        }
예제 #13
0
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="module">The module</param>
 /// <param name="listener">Module writer listener</param>
 public ModuleWriterOptions(ModuleDef module, IModuleWriterListener listener)
     : base(module, listener)
 {
 }
예제 #14
0
        /// <summary>
        /// Writes the module to a <see cref="Stream"/>
        /// </summary>
        /// <param name="dest">Destination stream</param>
        public void Write(Stream dest)
        {
            if (TheOptions.StrongNameKey != null || TheOptions.StrongNamePublicKey != null)
                TheOptions.Cor20HeaderOptions.Flags |= ComImageFlags.StrongNameSigned;

            Listener = TheOptions.Listener ?? DummyModuleWriterListener.Instance;
            destStream = dest;
            destStreamBaseOffset = destStream.Position;
            Listener.OnWriterEvent(this, ModuleWriterEvent.Begin);
            var imageLength = WriteImpl();
            destStream.Position = destStreamBaseOffset + imageLength;
            Listener.OnWriterEvent(this, ModuleWriterEvent.End);
        }
예제 #15
0
 public PrintNewTokens(ModuleDef module, IModuleWriterListener otherListener)
 {
     this.module        = module;
     this.otherListener = otherListener;
 }
예제 #16
0
		public PrintNewTokens(ModuleDef module, IModuleWriterListener otherListener) {
			this.module = module;
			this.otherListener = otherListener;
		}