private void Write(WriterContext ctxt) { // TextSection.PointerToRawData = Helpers.Align((uint)(376 + 40 * PEFileHeader.NumberOfSections), PEOptionalHeader.NTSpecificFields.SectionAlignment); TextSection.PointerToRawData = 0x200; PEOptionalHeader.StandardFields.EntryPointRVA = WriteEntryPoint(); RelocationTable.Blocks.Add (new FixupBlock { PageRVA = TextSection.PointerToRawData, Entries = { new FixupEntry { Offset = (ushort) (PEOptionalHeader.StandardFields.EntryPointRVA - TextSection.PointerToRawData), Type = ImageRelocation.IMAGE_REL_BASED_HIGHLOW } } }); MetadataTables.PersistIndexes(this); MetadataHeader.PersistIndexes(this); CLIHeader.PersistIndexes(this); ImportAddressTable.PersistIndexes(this); ImportLookupTable.PersistIndexes(this); ImportTable.PersistIndexes(this); DosHeader.PersistIndexes(this); PEFileHeader.PersistIndexes(this); PEOptionalHeader.PersistIndexes(this); RelocationTable.Write(RelocationSection.Writer); foreach (var sectionHeader in SectionHeaders) { sectionHeader.PersistIndexes(this); } PEOptionalHeader.DataDirectories.BaseRelocationTable = RelocationSection.PointerToRawData; InitializePEFile(); PersistIndexes(); var writer = new BlobWriter(); DosHeader.Write(writer); PEFileHeader.Write(writer); PEOptionalHeader.Write(writer); // TODO: precalc offsets in written section headers... // TODO: Write stream data foreach (var sectionHeader in SectionHeaders) { sectionHeader.Write(writer); } foreach (var sectionHeader in SectionHeaders) { writer.EnsureAtOffset(sectionHeader.PointerToRawData); sectionHeader.WriteData(this, writer); } return writer.GetBlob(); }