private ImmutableArray <SerializedSection> SerializeSections() { var sections = GetSections(); var result = ImmutableArray.CreateBuilder <SerializedSection>(sections.Length); int sizeOfPeHeaders = Header.ComputeSizeOfPEHeaders(sections.Length); var nextRva = BitArithmetic.Align(sizeOfPeHeaders, Header.SectionAlignment); var nextPointer = BitArithmetic.Align(sizeOfPeHeaders, Header.FileAlignment); foreach (var section in sections) { var builder = SerializeSection(section.Name, new SectionLocation(nextRva, nextPointer)); var serialized = new SerializedSection( builder, section.Name, section.Characteristics, relativeVirtualAddress: nextRva, sizeOfRawData: BitArithmetic.Align(builder.Count, Header.FileAlignment), pointerToRawData: nextPointer); result.Add(serialized); nextRva = BitArithmetic.Align(serialized.RelativeVirtualAddress + serialized.VirtualSize, Header.SectionAlignment); nextPointer = serialized.PointerToRawData + serialized.SizeOfRawData; } return(result.MoveToImmutable()); }
private static void WriteSectionHeader(BlobBuilder builder, SerializedSection serializedSection) { if (serializedSection.VirtualSize == 0) { return; } for (int j = 0, m = serializedSection.Name.Length; j < 8; j++) { if (j < m) { builder.WriteByte((byte)serializedSection.Name[j]); } else { builder.WriteByte(0); } } builder.WriteUInt32((uint)serializedSection.VirtualSize); builder.WriteUInt32((uint)serializedSection.RelativeVirtualAddress); builder.WriteUInt32((uint)serializedSection.SizeOfRawData); builder.WriteUInt32((uint)serializedSection.PointerToRawData); // PointerToRelocations (TODO: not supported): builder.WriteUInt32(0); // PointerToLinenumbers (TODO: not supported): builder.WriteUInt32(0); // NumberOfRelocations (TODO: not supported): builder.WriteUInt16(0); // NumberOfLinenumbers (TODO: not supported): builder.WriteUInt16(0); builder.WriteUInt32((uint)serializedSection.Characteristics); }
private static void WriteSectionHeader(BlobBuilder builder, Section section, SerializedSection serializedSection) { if (serializedSection.VirtualSize == 0) { return; } for (int j = 0, m = section.Name.Length; j < 8; j++) { if (j < m) { builder.WriteByte((byte)section.Name[j]); } else { builder.WriteByte(0); } } builder.WriteUInt32((uint)serializedSection.VirtualSize); builder.WriteUInt32((uint)serializedSection.RelativeVirtualAddress); builder.WriteUInt32((uint)serializedSection.SizeOfRawData); builder.WriteUInt32((uint)serializedSection.PointerToRawData); // PointerToRelocations (TODO: not supported): builder.WriteUInt32(0); // PointerToLinenumbers (TODO: not supported): builder.WriteUInt32(0); // NumberOfRelocations (TODO: not supported): builder.WriteUInt16(0); // NumberOfLinenumbers (TODO: not supported): builder.WriteUInt16(0); builder.WriteUInt32((uint)section.Characteristics); }
private ImmutableArray<SerializedSection> SerializeSections() { var result = ImmutableArray.CreateBuilder<SerializedSection>(_sections.Count); int sizeOfPeHeaders = ComputeSizeOfPeHeaders(_sections.Count, Is32Bit); var nextRva = BitArithmeticUtilities.Align(sizeOfPeHeaders, SectionAlignment); var nextPointer = BitArithmeticUtilities.Align(sizeOfPeHeaders, FileAlignment); foreach (var section in _sections) { var builder = section.Builder(new PESectionLocation(nextRva, nextPointer)); var serialized = new SerializedSection( builder, section.Name, section.Characteristics, relativeVirtualAddress: nextRva, sizeOfRawData: BitArithmeticUtilities.Align(builder.Count, FileAlignment), pointerToRawData: nextPointer); result.Add(serialized); nextRva = BitArithmeticUtilities.Align(serialized.RelativeVirtualAddress + serialized.VirtualSize, SectionAlignment); nextPointer = serialized.PointerToRawData + serialized.SizeOfRawData; } return result.MoveToImmutable(); }