/// <summary> /// Emit built sections into the R2R PE file. /// </summary> /// <param name="outputStream">Output stream for the final R2R PE file</param> public void Write(Stream outputStream) { BlobBuilder outputPeFile = new BlobBuilder(); Serialize(outputPeFile); CorHeaderBuilder corHeader = CorHeader; if (corHeader != null) { corHeader.Flags = (CorHeader.Flags & ~CorFlags.ILOnly) | CorFlags.ILLibrary; corHeader.MetadataDirectory = RelocateDirectoryEntry(corHeader.MetadataDirectory); corHeader.ResourcesDirectory = RelocateDirectoryEntry(corHeader.ResourcesDirectory); corHeader.StrongNameSignatureDirectory = RelocateDirectoryEntry(corHeader.StrongNameSignatureDirectory); corHeader.CodeManagerTableDirectory = RelocateDirectoryEntry(corHeader.CodeManagerTableDirectory); corHeader.VtableFixupsDirectory = RelocateDirectoryEntry(corHeader.VtableFixupsDirectory); corHeader.ExportAddressTableJumpsDirectory = RelocateDirectoryEntry(corHeader.ExportAddressTableJumpsDirectory); corHeader.ManagedNativeHeaderDirectory = RelocateDirectoryEntry(corHeader.ManagedNativeHeaderDirectory); _sectionBuilder.UpdateCorHeader(corHeader); } _sectionBuilder.RelocateOutputFile( outputPeFile, _peReader.PEHeaders.PEHeader.ImageBase, corHeader, CorHeaderFileOffset, outputStream); RelocateMetadataBlob(outputStream); _written = true; }
/// <summary> /// Emit built sections using the R2R PE writer. /// </summary> /// <param name="builder">Section builder to emit</param> /// <param name="machine">Target machine architecture</param> /// <param name="inputReader">Input MSIL reader</param> /// <param name="outputStream">Output stream for the final R2R PE file</param> public static void EmitR2R( this SectionBuilder builder, Machine machine, PEReader inputReader, Action <PEDirectoriesBuilder> directoriesUpdater, Stream outputStream) { R2RPEBuilder r2rBuilder = new R2RPEBuilder( machine: machine, peReader: inputReader, sectionNames: builder.GetSections(), sectionSerializer: builder.SerializeSection, directoriesUpdater: (PEDirectoriesBuilder directoriesBuilder) => { builder.UpdateDirectories(directoriesBuilder); if (directoriesUpdater != null) { directoriesUpdater(directoriesBuilder); } }); BlobBuilder outputPeFile = new BlobBuilder(); r2rBuilder.Serialize(outputPeFile); CorHeaderBuilder corHeader = r2rBuilder.CorHeader; if (corHeader != null) { corHeader.Flags = (r2rBuilder.CorHeader.Flags & ~CorFlags.ILOnly) | CorFlags.ILLibrary; corHeader.MetadataDirectory = r2rBuilder.RelocateDirectoryEntry(corHeader.MetadataDirectory); corHeader.ResourcesDirectory = r2rBuilder.RelocateDirectoryEntry(corHeader.ResourcesDirectory); corHeader.StrongNameSignatureDirectory = r2rBuilder.RelocateDirectoryEntry(corHeader.StrongNameSignatureDirectory); corHeader.CodeManagerTableDirectory = r2rBuilder.RelocateDirectoryEntry(corHeader.CodeManagerTableDirectory); corHeader.VtableFixupsDirectory = r2rBuilder.RelocateDirectoryEntry(corHeader.VtableFixupsDirectory); corHeader.ExportAddressTableJumpsDirectory = r2rBuilder.RelocateDirectoryEntry(corHeader.ExportAddressTableJumpsDirectory); corHeader.ManagedNativeHeaderDirectory = r2rBuilder.RelocateDirectoryEntry(corHeader.ManagedNativeHeaderDirectory); builder.UpdateCorHeader(corHeader); } builder.RelocateOutputFile( outputPeFile, inputReader.PEHeaders.PEHeader.ImageBase, corHeader, r2rBuilder.CorHeaderFileOffset, outputStream); r2rBuilder.RelocateMetadataBlob(outputStream); }