private Section CreateSection(string name, uint size, Section previous) { return(new Section { Name = name, VirtualAddress = (previous != null) ? (previous.VirtualAddress + ImageWriter.Align(previous.VirtualSize, 8192u)) : 8192u, VirtualSize = size, PointerToRawData = (previous != null) ? (previous.PointerToRawData + previous.SizeOfRawData) : ImageWriter.Align(this.GetHeaderSize(), 512u), SizeOfRawData = ImageWriter.Align(size, 512u) }); }
private void WriteOptionalHeaders() { WriteUInt16((ushort)(!pe64 ? 0x10b : 0x20b)); // Magic base.WriteByte(8); base.WriteByte(0); base.WriteUInt32(this.text.SizeOfRawData); base.WriteUInt32(((this.reloc != null) ? this.reloc.SizeOfRawData : 0u) + ((this.rsrc != null) ? this.rsrc.SizeOfRawData : 0u)); base.WriteUInt32(0u); Range range = this.text_map.GetRange(TextSegment.StartupStub); base.WriteUInt32((range.Length > 0u) ? range.Start : 0u); base.WriteUInt32(8192u); if (!this.pe64) { base.WriteUInt32(0u); base.WriteUInt32(4194304u); } else { base.WriteUInt64(4194304uL); } base.WriteUInt32(8192u); base.WriteUInt32(512u); base.WriteUInt16(4); base.WriteUInt16(0); base.WriteUInt16(0); base.WriteUInt16(0); base.WriteUInt16(4); base.WriteUInt16(0); base.WriteUInt32(0u); Section section = this.LastSection(); base.WriteUInt32(section.VirtualAddress + ImageWriter.Align(section.VirtualSize, 8192u)); base.WriteUInt32(this.text.PointerToRawData); base.WriteUInt32(0u); base.WriteUInt16(this.GetSubSystem()); base.WriteUInt16((ushort)this.module.Characteristics); if (!this.pe64) { base.WriteUInt32(1048576u); base.WriteUInt32(4096u); base.WriteUInt32(1048576u); base.WriteUInt32(4096u); } else { base.WriteUInt64(1048576uL); base.WriteUInt64(4096uL); base.WriteUInt64(1048576uL); base.WriteUInt64(4096uL); } base.WriteUInt32(0u); base.WriteUInt32(16u); this.WriteZeroDataDirectory(); base.WriteDataDirectory(this.text_map.GetDataDirectory(TextSegment.ImportDirectory)); if (this.rsrc != null) { base.WriteUInt32(this.rsrc.VirtualAddress); base.WriteUInt32(this.rsrc.VirtualSize); } else { this.WriteZeroDataDirectory(); } this.WriteZeroDataDirectory(); this.WriteZeroDataDirectory(); base.WriteUInt32((this.reloc != null) ? this.reloc.VirtualAddress : 0u); base.WriteUInt32((this.reloc != null) ? this.reloc.VirtualSize : 0u); if (this.text_map.GetLength(TextSegment.DebugDirectory) > 0) { base.WriteUInt32(this.text_map.GetRVA(TextSegment.DebugDirectory)); base.WriteUInt32(28u); } else { this.WriteZeroDataDirectory(); } this.WriteZeroDataDirectory(); this.WriteZeroDataDirectory(); this.WriteZeroDataDirectory(); this.WriteZeroDataDirectory(); this.WriteZeroDataDirectory(); base.WriteDataDirectory(this.text_map.GetDataDirectory(TextSegment.ImportAddressTable)); this.WriteZeroDataDirectory(); base.WriteDataDirectory(this.text_map.GetDataDirectory(TextSegment.CLIHeader)); this.WriteZeroDataDirectory(); }