/// <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; }
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); } }
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); } }
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); } }
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; }
/// <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) { }
/// <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; } }
/// <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); }
public PrintNewTokens(ModuleDef module, IModuleWriterListener otherListener) { this.module = module; this.otherListener = otherListener; }