Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ManagedPEBuilder.cs
Go to the documentation of this file.
5
7
9{
10 public const int ManagedResourcesDataAlignment = 8;
11
12 public const int MappedFieldDataAlignment = 8;
13
15
17
18 private readonly BlobBuilder _ilStream;
19
21
23
25
26 private readonly int _strongNameSignatureSize;
27
29
31
32 private readonly CorFlags _corFlags;
33
35
37
68
70 {
71 if (base.IsDeterministic)
72 {
74 debugDirectoryBuilder.AddReproducibleEntry();
76 }
77 return null;
78 }
79
81 {
82 ImmutableArray<Section>.Builder builder = ImmutableArray.CreateBuilder<Section>(3);
83 builder.Add(new Section(".text", SectionCharacteristics.ContainsCode | SectionCharacteristics.MemExecute | SectionCharacteristics.MemRead));
84 if (_nativeResourcesOpt != null)
85 {
86 builder.Add(new Section(".rsrc", SectionCharacteristics.ContainsInitializedData | SectionCharacteristics.MemRead));
87 }
88 if (base.Header.Machine == Machine.I386 || base.Header.Machine == Machine.Unknown)
89 {
90 builder.Add(new Section(".reloc", SectionCharacteristics.ContainsInitializedData | SectionCharacteristics.MemDiscardable | SectionCharacteristics.MemRead));
91 }
92 return builder.ToImmutable();
93 }
94
95 protected override BlobBuilder SerializeSection(string name, SectionLocation location)
96 {
97 return name switch
98 {
99 ".text" => SerializeTextSection(location),
102 _ => throw new ArgumentException(System.SR.Format(System.SR.UnknownSectionName, name), "name"),
103 };
104 }
105
107 {
112 int methodBodyStreamRva = location.RelativeVirtualAddress + managedTextSection.OffsetToILStream;
113 int mappedFieldDataStreamRva = location.RelativeVirtualAddress + managedTextSection.CalculateOffsetToMappedFieldDataStream();
117 if (_debugDirectoryBuilderOpt != null)
118 {
119 int num = managedTextSection.ComputeOffsetToDebugDirectory();
122 debugTable = new DirectoryEntry(location.RelativeVirtualAddress + num, _debugDirectoryBuilderOpt.TableSize);
123 }
124 else
125 {
126 blobBuilder3 = null;
127 debugTable = default(DirectoryEntry);
128 }
129 _lazyEntryPointAddress = managedTextSection.GetEntryPointAddress(location.RelativeVirtualAddress);
131 _peDirectoriesBuilder.AddressOfEntryPoint = _lazyEntryPointAddress;
132 _peDirectoriesBuilder.DebugTable = debugTable;
133 _peDirectoriesBuilder.ImportAddressTable = managedTextSection.GetImportAddressTableDirectoryEntry(location.RelativeVirtualAddress);
134 _peDirectoriesBuilder.ImportTable = managedTextSection.GetImportTableDirectoryEntry(location.RelativeVirtualAddress);
135 _peDirectoriesBuilder.CorHeaderTable = managedTextSection.GetCorHeaderDirectoryEntry(location.RelativeVirtualAddress);
136 return blobBuilder;
137 }
138
140 {
143 _peDirectoriesBuilder.ResourceTable = new DirectoryEntry(location.RelativeVirtualAddress, blobBuilder.Count);
144 return blobBuilder;
145 }
146
148 {
151 _peDirectoriesBuilder.BaseRelocationTable = new DirectoryEntry(location.RelativeVirtualAddress, blobBuilder.Count);
152 return blobBuilder;
153 }
154
156 {
157 builder.WriteUInt32((uint)(entryPointAddress + 2) / 4096u * 4096);
158 builder.WriteUInt32((machine == Machine.IA64) ? 14u : 12u);
159 uint num = (uint)(entryPointAddress + 2) % 4096u;
160 uint num2 = ((machine == Machine.Amd64 || machine == Machine.IA64 || machine == Machine.Arm64) ? 10u : 3u);
161 ushort value = (ushort)((num2 << 12) | num);
162 builder.WriteUInt16(value);
163 if (machine == Machine.IA64)
164 {
165 builder.WriteUInt32(num2 << 12);
166 }
167 builder.WriteUInt16(0);
168 }
169
170 protected internal override PEDirectoriesBuilder GetDirectories()
171 {
173 }
174
176 {
177 if (peImage == null)
178 {
179 Throw.ArgumentNull("peImage");
180 }
181 if (signatureProvider == null)
182 {
183 Throw.ArgumentNull("signatureProvider");
184 }
186 }
187}
void Add(TKey key, TValue value)
void Serialize(BlobBuilder builder, int methodBodyStreamRva, int mappedFieldDataStreamRva)
static int GetToken(this MetadataReader reader, EntityHandle handle)
void Serialize(BlobBuilder builder, SectionLocation sectionLocation, int sectionOffset)
override ImmutableArray< Section > CreateSections()
BlobBuilder SerializeTextSection(SectionLocation location)
ManagedPEBuilder(PEHeaderBuilder header, MetadataRootBuilder metadataRootBuilder, BlobBuilder ilStream, BlobBuilder? mappedFieldData=null, BlobBuilder? managedResources=null, ResourceSectionBuilder? nativeResources=null, DebugDirectoryBuilder? debugDirectoryBuilder=null, int strongNameSignatureSize=128, MethodDefinitionHandle entryPoint=default(MethodDefinitionHandle), CorFlags flags=CorFlags.ILOnly, Func< IEnumerable< Blob >, BlobContentId >? deterministicIdProvider=null)
override BlobBuilder SerializeSection(string name, SectionLocation location)
BlobBuilder SerializeResourceSection(SectionLocation location)
static void WriteRelocationSection(BlobBuilder builder, Machine machine, int entryPointAddress)
void Sign(BlobBuilder peImage, Func< IEnumerable< Blob >, byte[]> signatureProvider)
BlobBuilder SerializeRelocationSection(SectionLocation location)
void Serialize(BlobBuilder builder, SectionLocation location)
static void ArgumentNull(string parameterName)
Definition Throw.cs:110
static void ArgumentOutOfRange(string parameterName)
Definition Throw.cs:145
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string UnknownSectionName
Definition SR.cs:212
Definition SR.cs:7