Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ManagedTextSection.cs
Go to the documentation of this file.
3
5
6internal sealed class ManagedTextSection
7{
8 public const int ManagedResourcesDataAlignment = 8;
9
10 public const int MappedFieldDataAlignment = 8;
11
13
14 public Machine Machine { get; }
15
16 public int ILStreamSize { get; }
17
18 public int MetadataSize { get; }
19
20 public int ResourceDataSize { get; }
21
22 public int StrongNameSignatureSize { get; }
23
24 public int DebugDataSize { get; }
25
26 public int MappedFieldDataSize { get; }
27
28 internal bool RequiresStartupStub
29 {
30 get
31 {
32 if (Machine != Machine.I386)
33 {
34 return Machine == Machine.Unknown;
35 }
36 return true;
37 }
38 }
39
40 internal bool Requires64bits
41 {
42 get
43 {
44 if (Machine != Machine.Amd64 && Machine != Machine.IA64)
45 {
46 return Machine == Machine.Arm64;
47 }
48 return true;
49 }
50 }
51
52 public bool Is32Bit => !Requires64bits;
53
54 private string CorEntryPointName
55 {
56 get
57 {
59 {
60 return "_CorExeMain";
61 }
62 return "_CorDllMain";
63 }
64 }
65
67 {
68 get
69 {
71 {
72 return 0;
73 }
74 if (!Is32Bit)
75 {
76 return 16;
77 }
78 return 8;
79 }
80 }
81
82 private int SizeOfImportTable => 40 + (Is32Bit ? 12 : 16) + 2 + CorEntryPointName.Length + 1;
83
84 private static int SizeOfNameTable => "mscoree.dll".Length + 1 + 2;
85
87 {
88 get
89 {
90 if (!Is32Bit)
91 {
92 return 16;
93 }
94 return 8;
95 }
96 }
97
99
100 public ManagedTextSection(Characteristics imageCharacteristics, Machine machine, int ilStreamSize, int metadataSize, int resourceDataSize, int strongNameSignatureSize, int debugDataSize, int mappedFieldDataSize)
101 {
102 MetadataSize = metadataSize;
103 ResourceDataSize = resourceDataSize;
104 ILStreamSize = ilStreamSize;
105 MappedFieldDataSize = mappedFieldDataSize;
106 StrongNameSignatureSize = strongNameSignatureSize;
107 ImageCharacteristics = imageCharacteristics;
108 Machine = machine;
109 DebugDataSize = debugDataSize;
110 }
111
113 {
114 int num = ComputeOffsetToImportTable();
116 {
118 num = BitArithmetic.Align(num, Is32Bit ? 4 : 8);
120 }
121 return num;
122 }
123
128
133
135 {
137 }
138
143
144 public int GetEntryPointAddress(int rva)
145 {
147 {
148 return 0;
149 }
150 return rva + CalculateOffsetToMappedFieldDataStream() - (Is32Bit ? 6 : 10);
151 }
152
154 {
156 {
157 return default(DirectoryEntry);
158 }
160 }
161
163 {
165 {
166 return default(DirectoryEntry);
167 }
168 return new DirectoryEntry(rva + ComputeOffsetToImportTable(), (Is32Bit ? 66 : 70) + 13);
169 }
170
172 {
173 return new DirectoryEntry(rva + SizeOfImportAddressTable, 72);
174 }
175
176 public void Serialize(BlobBuilder builder, int relativeVirtualAddess, int entryPointTokenOrRelativeVirtualAddress, CorFlags corFlags, ulong baseAddress, BlobBuilder metadataBuilder, BlobBuilder ilBuilder, BlobBuilder? mappedFieldDataBuilderOpt, BlobBuilder? resourceBuilderOpt, BlobBuilder? debugDataBuilderOpt, out Blob strongNameSignature)
177 {
178 int relativeVirtualAddress = GetImportTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;
179 int relativeVirtualAddress2 = GetImportAddressTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;
181 {
182 WriteImportAddressTable(builder, relativeVirtualAddress);
183 }
184 WriteCorHeader(builder, relativeVirtualAddess, entryPointTokenOrRelativeVirtualAddress, corFlags);
185 ilBuilder.Align(4);
186 builder.LinkSuffix(ilBuilder);
187 builder.LinkSuffix(metadataBuilder);
188 if (resourceBuilderOpt != null)
189 {
190 builder.LinkSuffix(resourceBuilderOpt);
191 }
192 strongNameSignature = builder.ReserveBytes(StrongNameSignatureSize);
193 new BlobWriter(strongNameSignature).WriteBytes(0, StrongNameSignatureSize);
194 if (debugDataBuilderOpt != null)
195 {
196 builder.LinkSuffix(debugDataBuilderOpt);
197 }
199 {
200 WriteImportTable(builder, relativeVirtualAddress, relativeVirtualAddress2);
201 WriteNameTable(builder);
202 WriteRuntimeStartupStub(builder, relativeVirtualAddress2, baseAddress);
203 }
204 if (mappedFieldDataBuilderOpt != null)
205 {
206 builder.LinkSuffix(mappedFieldDataBuilderOpt);
207 }
208 }
209
210 private void WriteImportAddressTable(BlobBuilder builder, int importTableRva)
211 {
212 int count = builder.Count;
213 int num = importTableRva + 40;
214 int num2 = num + (Is32Bit ? 12 : 16);
215 if (Is32Bit)
216 {
217 builder.WriteUInt32((uint)num2);
218 builder.WriteUInt32(0u);
219 }
220 else
221 {
222 builder.WriteUInt64((uint)num2);
223 builder.WriteUInt64(0uL);
224 }
225 }
226
227 private void WriteImportTable(BlobBuilder builder, int importTableRva, int importAddressTableRva)
228 {
229 int count = builder.Count;
230 int num = importTableRva + 40;
231 int num2 = num + (Is32Bit ? 12 : 16);
232 int value = num2 + 12 + 2;
233 builder.WriteUInt32((uint)num);
234 builder.WriteUInt32(0u);
235 builder.WriteUInt32(0u);
236 builder.WriteUInt32((uint)value);
237 builder.WriteUInt32((uint)importAddressTableRva);
238 builder.WriteBytes(0, 20);
239 if (Is32Bit)
240 {
241 builder.WriteUInt32((uint)num2);
242 builder.WriteUInt32(0u);
243 builder.WriteUInt32(0u);
244 }
245 else
246 {
247 builder.WriteUInt64((uint)num2);
248 builder.WriteUInt64(0uL);
249 }
250 builder.WriteUInt16(0);
251 string corEntryPointName = CorEntryPointName;
252 foreach (char c in corEntryPointName)
253 {
254 builder.WriteByte((byte)c);
255 }
256 builder.WriteByte(0);
257 }
258
259 private static void WriteNameTable(BlobBuilder builder)
260 {
261 int count = builder.Count;
262 string text = "mscoree.dll";
263 foreach (char c in text)
264 {
265 builder.WriteByte((byte)c);
266 }
267 builder.WriteByte(0);
268 builder.WriteUInt16(0);
269 }
270
271 private void WriteCorHeader(BlobBuilder builder, int textSectionRva, int entryPointTokenOrRva, CorFlags corFlags)
272 {
273 int num = textSectionRva + ComputeOffsetToMetadata();
274 int num2 = num + MetadataSize;
275 int num3 = num2 + ResourceDataSize;
276 int count = builder.Count;
277 builder.WriteUInt32(72u);
278 builder.WriteUInt16(2);
279 builder.WriteUInt16(5);
280 builder.WriteUInt32((uint)num);
281 builder.WriteUInt32((uint)MetadataSize);
282 builder.WriteUInt32((uint)corFlags);
283 builder.WriteUInt32((uint)entryPointTokenOrRva);
284 builder.WriteUInt32((ResourceDataSize != 0) ? ((uint)num2) : 0u);
285 builder.WriteUInt32((uint)ResourceDataSize);
286 builder.WriteUInt32((StrongNameSignatureSize != 0) ? ((uint)num3) : 0u);
288 builder.WriteUInt32(0u);
289 builder.WriteUInt32(0u);
290 builder.WriteUInt32(0u);
291 builder.WriteUInt32(0u);
292 builder.WriteUInt32(0u);
293 builder.WriteUInt32(0u);
294 builder.WriteUInt32(0u);
295 builder.WriteUInt32(0u);
296 }
297
298 private void WriteRuntimeStartupStub(BlobBuilder sectionBuilder, int importAddressTableRva, ulong baseAddress)
299 {
300 if (Is32Bit)
301 {
302 sectionBuilder.Align(4);
303 sectionBuilder.WriteUInt16(0);
304 sectionBuilder.WriteByte(byte.MaxValue);
305 sectionBuilder.WriteByte(37);
306 sectionBuilder.WriteUInt32((uint)(importAddressTableRva + (int)baseAddress));
307 }
308 else
309 {
310 sectionBuilder.Align(8);
311 sectionBuilder.WriteUInt32(0u);
312 sectionBuilder.WriteUInt16(0);
313 sectionBuilder.WriteByte(byte.MaxValue);
314 sectionBuilder.WriteByte(37);
315 sectionBuilder.WriteUInt64((ulong)importAddressTableRva + baseAddress);
316 }
317 }
318}
static uint Align(uint position, uint alignment)
void LinkSuffix(BlobBuilder suffix)
void WriteBytes(byte value, int byteCount)
void WriteCorHeader(BlobBuilder builder, int textSectionRva, int entryPointTokenOrRva, CorFlags corFlags)
ManagedTextSection(Characteristics imageCharacteristics, Machine machine, int ilStreamSize, int metadataSize, int resourceDataSize, int strongNameSignatureSize, int debugDataSize, int mappedFieldDataSize)
void Serialize(BlobBuilder builder, int relativeVirtualAddess, int entryPointTokenOrRelativeVirtualAddress, CorFlags corFlags, ulong baseAddress, BlobBuilder metadataBuilder, BlobBuilder ilBuilder, BlobBuilder? mappedFieldDataBuilderOpt, BlobBuilder? resourceBuilderOpt, BlobBuilder? debugDataBuilderOpt, out Blob strongNameSignature)
void WriteImportTable(BlobBuilder builder, int importTableRva, int importAddressTableRva)
void WriteRuntimeStartupStub(BlobBuilder sectionBuilder, int importAddressTableRva, ulong baseAddress)
void WriteImportAddressTable(BlobBuilder builder, int importTableRva)
unsafe void WriteBytes(byte value, int byteCount)