< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 78
Coverable lines: 78
Total lines: 118
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)0%10100%
CreateExecutableHeader()100%110%
CreateLibraryHeader()100%110%
ComputeSizeOfPEHeaders(...)100%110%

File(s)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/src/libraries/System.Reflection.Metadata/src/System/Reflection/PortableExecutable/PEHeaderBuilder.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Numerics;
 5
 6namespace System.Reflection.PortableExecutable
 7{
 8    public sealed class PEHeaderBuilder
 9    {
 10        // COFF:
 011        public Machine Machine { get; }
 012        public Characteristics ImageCharacteristics { get; }
 13
 14        // PE:
 015        public byte MajorLinkerVersion { get; }
 016        public byte MinorLinkerVersion { get; }
 17
 018        public ulong ImageBase { get; }
 019        public int SectionAlignment { get; }
 020        public int FileAlignment { get; }
 21
 022        public ushort MajorOperatingSystemVersion { get; }
 023        public ushort MinorOperatingSystemVersion { get; }
 24
 025        public ushort MajorImageVersion { get; }
 026        public ushort MinorImageVersion { get; }
 27
 028        public ushort MajorSubsystemVersion { get; }
 029        public ushort MinorSubsystemVersion { get; }
 30
 031        public Subsystem Subsystem { get; }
 032        public DllCharacteristics DllCharacteristics { get; }
 33
 034        public ulong SizeOfStackReserve { get; }
 035        public ulong SizeOfStackCommit { get; }
 036        public ulong SizeOfHeapReserve { get; }
 037        public ulong SizeOfHeapCommit { get; }
 38
 39        /// <summary>
 40        /// Creates PE header builder.
 41        /// </summary>
 42        /// <exception cref="ArgumentOutOfRangeException">
 43        /// <paramref name="fileAlignment"/> is not power of 2 between 512 and 64K, or
 44        /// <paramref name="sectionAlignment"/> not power of 2 or it's less than <paramref name="fileAlignment"/>.
 45        /// </exception>
 046        public PEHeaderBuilder(
 047            Machine machine = 0,
 048            int sectionAlignment = 0x2000,
 049            int fileAlignment = 0x200,
 050            ulong imageBase = 0x00400000,
 051            byte majorLinkerVersion = 0x30, // (what is ref.emit using?)
 052            byte minorLinkerVersion = 0,
 053            ushort majorOperatingSystemVersion = 4,
 054            ushort minorOperatingSystemVersion = 0,
 055            ushort majorImageVersion = 0,
 056            ushort minorImageVersion = 0,
 057            ushort majorSubsystemVersion = 4,
 058            ushort minorSubsystemVersion = 0,
 059            Subsystem subsystem = Subsystem.WindowsCui,
 060            DllCharacteristics dllCharacteristics = DllCharacteristics.DynamicBase | DllCharacteristics.NxCompatible | D
 061            Characteristics imageCharacteristics = Characteristics.Dll,
 062            ulong sizeOfStackReserve = 0x00100000,
 063            ulong sizeOfStackCommit = 0x1000,
 064            ulong sizeOfHeapReserve = 0x00100000,
 065            ulong sizeOfHeapCommit = 0x1000)
 066        {
 067            if (fileAlignment < 512 || fileAlignment > 64 * 1024 || BitOperations.PopCount((uint)fileAlignment) != 1)
 068            {
 069                Throw.ArgumentOutOfRange(nameof(fileAlignment));
 70            }
 71
 072            if (sectionAlignment < fileAlignment || BitOperations.PopCount((uint)sectionAlignment) != 1)
 073            {
 074                Throw.ArgumentOutOfRange(nameof(sectionAlignment));
 75            }
 76
 077            Machine = machine;
 078            SectionAlignment = sectionAlignment;
 079            FileAlignment = fileAlignment;
 080            ImageBase = imageBase;
 081            MajorLinkerVersion = majorLinkerVersion;
 082            MinorLinkerVersion = minorLinkerVersion;
 083            MajorOperatingSystemVersion = majorOperatingSystemVersion;
 084            MinorOperatingSystemVersion = minorOperatingSystemVersion;
 085            MajorImageVersion = majorImageVersion;
 086            MinorImageVersion = minorImageVersion;
 087            MajorSubsystemVersion = majorSubsystemVersion;
 088            MinorSubsystemVersion = minorSubsystemVersion;
 089            Subsystem = subsystem;
 090            DllCharacteristics = dllCharacteristics;
 091            ImageCharacteristics = imageCharacteristics;
 092            SizeOfStackReserve = sizeOfStackReserve;
 093            SizeOfStackCommit = sizeOfStackCommit;
 094            SizeOfHeapReserve = sizeOfHeapReserve;
 095            SizeOfHeapCommit = sizeOfHeapCommit;
 096        }
 97
 98        public static PEHeaderBuilder CreateExecutableHeader()
 099        {
 0100            return new PEHeaderBuilder(imageCharacteristics: Characteristics.ExecutableImage);
 0101        }
 102
 103        public static PEHeaderBuilder CreateLibraryHeader()
 0104        {
 0105            return new PEHeaderBuilder(imageCharacteristics: Characteristics.ExecutableImage | Characteristics.Dll);
 0106        }
 107
 0108        internal bool Is32Bit => Machine != Machine.Amd64 && Machine != Machine.IA64 && Machine != Machine.Arm64 && Mach
 109
 110        internal int ComputeSizeOfPEHeaders(int sectionCount) =>
 0111            PEBuilder.DosHeader.Length +
 0112            PEHeaders.PESignatureSize +
 0113            CoffHeader.Size +
 0114            PEHeader.Size(Is32Bit) +
 0115            SectionHeader.Size * sectionCount;
 116    }
 117}
 118