private void UpdateOptionalHeader()
{
var header = Assembly.NtHeaders.OptionalHeader;
header.SizeOfCode = _textSectionBuilder.GetPhysicalLength();
header.SizeOfInitializedData = (_relocSectionBuilder != null ? _relocSectionBuilder.GetPhysicalLength() : 0) +
(_rsrcSectionBuilder != null ? _rsrcSectionBuilder.GetPhysicalLength() : 0);
header.BaseOfCode = _textSectionBuilder.Header.VirtualAddress;
if (_relocSectionBuilder != null)
header.BaseOfData = _relocSectionBuilder.Header.VirtualAddress;
var lastSection = Assembly.SectionHeaders[Assembly.SectionHeaders.Count - 1];
header.SizeOfImage = lastSection.VirtualAddress +
Align(lastSection.VirtualSize, Assembly.NtHeaders.OptionalHeader.SectionAlignment);
header.SizeOfHeaders = 0x200;
UpdateDataDirectories();
}