Terraria
v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
PEHeaders.cs
Go to the documentation of this file.
1
using
System.Collections.Immutable
;
2
using
System.IO
;
3
using
System.Reflection.Internal
;
4
5
namespace
System.Reflection.PortableExecutable
;
6
7
public
sealed
class
PEHeaders
8
{
9
private
readonly
CoffHeader
_coffHeader
;
10
11
private
readonly
PEHeader
_peHeader
;
12
13
private
readonly
ImmutableArray<SectionHeader>
_sectionHeaders
;
14
15
private
readonly
CorHeader
_corHeader
;
16
17
private
readonly
bool
_isLoadedImage
;
18
19
private
readonly
int
_metadataStartOffset
= -1;
20
21
private
readonly
int
_metadataSize
;
22
23
private
readonly
int
_coffHeaderStartOffset
= -1;
24
25
private
readonly
int
_corHeaderStartOffset
= -1;
26
27
private
readonly
int
_peHeaderStartOffset
= -1;
28
29
internal
const
ushort
DosSignature
= 23117;
30
31
internal
const
int
PESignatureOffsetLocation
= 60;
32
33
internal
const
uint
PESignature
= 17744u;
34
35
internal
const
int
PESignatureSize
= 4;
36
37
public
int
MetadataStartOffset
=>
_metadataStartOffset
;
38
39
public
int
MetadataSize
=>
_metadataSize
;
40
41
public
CoffHeader
CoffHeader
=>
_coffHeader
;
42
43
public
int
CoffHeaderStartOffset
=>
_coffHeaderStartOffset
;
44
45
public
bool
IsCoffOnly
=>
_peHeader
==
null
;
46
47
public
PEHeader
?
PEHeader
=>
_peHeader
;
48
49
public
int
PEHeaderStartOffset
=>
_peHeaderStartOffset
;
50
51
public
ImmutableArray<SectionHeader>
SectionHeaders
=>
_sectionHeaders
;
52
53
public
CorHeader
?
CorHeader
=>
_corHeader
;
54
55
public
int
CorHeaderStartOffset
=>
_corHeaderStartOffset
;
56
57
public
bool
IsConsoleApplication
58
{
59
get
60
{
61
if
(
_peHeader
!=
null
)
62
{
63
return
_peHeader.Subsystem ==
Subsystem
.WindowsCui;
64
}
65
return
false
;
66
}
67
}
68
69
public
bool
IsDll
=> (_coffHeader.Characteristics &
Characteristics
.Dll) != 0;
70
71
public
bool
IsExe
=> (_coffHeader.Characteristics &
Characteristics
.Dll) == 0;
72
73
public
PEHeaders
(
Stream
peStream)
74
: this(peStream, 0)
75
{
76
}
77
78
public
PEHeaders
(
Stream
peStream,
int
size)
79
: this(peStream, size, isLoadedImage: false)
80
{
81
}
82
83
public
PEHeaders
(
Stream
peStream,
int
size,
bool
isLoadedImage)
84
{
85
if
(peStream ==
null
)
86
{
87
throw
new
ArgumentNullException
(
"peStream"
);
88
}
89
if
(!peStream.
CanRead
|| !peStream.
CanSeek
)
90
{
91
throw
new
ArgumentException
(
System
.
SR
.
StreamMustSupportReadAndSeek
,
"peStream"
);
92
}
93
_isLoadedImage
= isLoadedImage;
94
int
andValidateSize =
StreamExtensions
.
GetAndValidateSize
(peStream, size,
"peStream"
);
95
PEBinaryReader
reader =
new
PEBinaryReader
(peStream, andValidateSize);
96
SkipDosHeader
(ref reader, out var isCOFFOnly);
97
_coffHeaderStartOffset
= reader.
CurrentOffset
;
98
_coffHeader
=
new
CoffHeader
(ref reader);
99
if
(!isCOFFOnly)
100
{
101
_peHeaderStartOffset
= reader.
CurrentOffset
;
102
_peHeader
=
new
PEHeader
(ref reader);
103
}
104
_sectionHeaders
=
ReadSectionHeaders
(ref reader);
105
if
(!isCOFFOnly &&
TryCalculateCorHeaderOffset
(andValidateSize, out var startOffset))
106
{
107
_corHeaderStartOffset
= startOffset;
108
reader.
Seek
(startOffset);
109
_corHeader
=
new
CorHeader
(ref reader);
110
}
111
CalculateMetadataLocation
(andValidateSize, out
_metadataStartOffset
, out
_metadataSize
);
112
}
113
114
private
bool
TryCalculateCorHeaderOffset
(
long
peStreamSize, out
int
startOffset)
115
{
116
if
(!
TryGetDirectoryOffset
(
_peHeader
.
CorHeaderTableDirectory
, out startOffset, canCrossSectionBoundary:
false
))
117
{
118
startOffset = -1;
119
return
false
;
120
}
121
int
size =
_peHeader
.
CorHeaderTableDirectory
.
Size
;
122
if
(size < 72)
123
{
124
throw
new
BadImageFormatException
(
System
.
SR
.
InvalidCorHeaderSize
);
125
}
126
return
true
;
127
}
128
129
private
void
SkipDosHeader
(ref
PEBinaryReader
reader, out
bool
isCOFFOnly)
130
{
131
ushort num = reader.ReadUInt16();
132
if
(num != 23117)
133
{
134
if
(num == 0 && reader.ReadUInt16() == ushort.MaxValue)
135
{
136
throw
new
BadImageFormatException
(
System
.
SR
.
UnknownFileFormat
);
137
}
138
isCOFFOnly =
true
;
139
reader.Seek(0);
140
}
141
else
142
{
143
isCOFFOnly =
false
;
144
}
145
if
(!isCOFFOnly)
146
{
147
reader.Seek(60);
148
int
offset
= reader.ReadInt32();
149
reader.Seek(
offset
);
150
uint num2 = reader.ReadUInt32();
151
if
(num2 != 17744)
152
{
153
throw
new
BadImageFormatException
(
System
.
SR
.
InvalidPESignature
);
154
}
155
}
156
}
157
158
private
ImmutableArray<SectionHeader>
ReadSectionHeaders
(ref
PEBinaryReader
reader)
159
{
160
int
numberOfSections =
_coffHeader
.
NumberOfSections
;
161
if
(numberOfSections < 0)
162
{
163
throw
new
BadImageFormatException
(
System
.
SR
.
InvalidNumberOfSections
);
164
}
165
ImmutableArray<SectionHeader>
.
Builder
builder =
ImmutableArray
.CreateBuilder<
SectionHeader
>(numberOfSections);
166
for
(
int
i = 0; i < numberOfSections; i++)
167
{
168
builder.Add(
new
SectionHeader
(ref reader));
169
}
170
return
builder.MoveToImmutable();
171
}
172
173
public
bool
TryGetDirectoryOffset
(
DirectoryEntry
directory, out
int
offset
)
174
{
175
return
TryGetDirectoryOffset
(directory, out
offset
, canCrossSectionBoundary:
true
);
176
}
177
178
internal
bool
TryGetDirectoryOffset
(
DirectoryEntry
directory, out
int
offset
,
bool
canCrossSectionBoundary)
179
{
180
int
containingSectionIndex =
GetContainingSectionIndex
(directory.
RelativeVirtualAddress
);
181
if
(containingSectionIndex < 0)
182
{
183
offset
= -1;
184
return
false
;
185
}
186
int
num = directory.RelativeVirtualAddress -
_sectionHeaders
[containingSectionIndex].VirtualAddress;
187
if
(!canCrossSectionBoundary && directory.
Size
>
_sectionHeaders
[containingSectionIndex].VirtualSize - num)
188
{
189
throw
new
BadImageFormatException
(
System
.
SR
.
SectionTooSmall
);
190
}
191
offset
= (
_isLoadedImage
? directory.RelativeVirtualAddress : (
_sectionHeaders
[containingSectionIndex].PointerToRawData + num));
192
return
true
;
193
}
194
195
public
int
GetContainingSectionIndex
(
int
relativeVirtualAddress)
196
{
197
for
(
int
i = 0; i <
_sectionHeaders
.Length; i++)
198
{
199
if
(
_sectionHeaders
[i].VirtualAddress <= relativeVirtualAddress && relativeVirtualAddress <
_sectionHeaders
[i].VirtualAddress +
_sectionHeaders
[i].VirtualSize)
200
{
201
return
i;
202
}
203
}
204
return
-1;
205
}
206
207
internal
int
IndexOfSection
(
string
name)
208
{
209
for
(
int
i = 0; i <
SectionHeaders
.Length; i++)
210
{
211
if
(
SectionHeaders
[i].
Name
.Equals(name,
StringComparison
.Ordinal))
212
{
213
return
i;
214
}
215
}
216
return
-1;
217
}
218
219
private
void
CalculateMetadataLocation
(
long
peImageSize, out
int
start
, out
int
size)
220
{
221
if
(
IsCoffOnly
)
222
{
223
int
num =
IndexOfSection
(
".cormeta"
);
224
if
(num == -1)
225
{
226
start
= -1;
227
size = 0;
228
return
;
229
}
230
if
(
_isLoadedImage
)
231
{
232
start
=
SectionHeaders
[num].VirtualAddress;
233
size =
SectionHeaders
[num].VirtualSize;
234
}
235
else
236
{
237
start
=
SectionHeaders
[num].PointerToRawData;
238
size =
SectionHeaders
[num].SizeOfRawData;
239
}
240
}
241
else
242
{
243
if
(
_corHeader
==
null
)
244
{
245
start
= 0;
246
size = 0;
247
return
;
248
}
249
if
(!
TryGetDirectoryOffset
(
_corHeader
.
MetadataDirectory
, out
start
, canCrossSectionBoundary:
false
))
250
{
251
throw
new
BadImageFormatException
(
System
.
SR
.
MissingDataDirectory
);
252
}
253
size =
_corHeader
.
MetadataDirectory
.
Size
;
254
}
255
if
(start < 0 || start >= peImageSize || size <= 0 || start > peImageSize - size)
256
{
257
throw
new
BadImageFormatException
(
System
.
SR
.
InvalidMetadataSectionSpan
);
258
}
259
}
260
}
System.ArgumentException
Definition
ArgumentException.cs:9
System.ArgumentNullException
Definition
ArgumentNullException.cs:10
System.BadImageFormatException
Definition
BadImageFormatException.cs:10
System.Collections.Immutable.ImmutableArray.Builder
Definition
ImmutableArray.cs:227
System.Collections.Immutable.ImmutableArray
Definition
ImmutableArray.cs:223
System.IO.Stream.CanSeek
bool CanSeek
Definition
Stream.cs:496
System.IO.Stream.CanRead
bool CanRead
Definition
Stream.cs:492
System.IO.Stream
Definition
Stream.cs:11
System.Reflection.Internal.StreamExtensions.GetAndValidateSize
static int GetAndValidateSize(Stream stream, int size, string streamParameterName)
Definition
StreamExtensions.cs:57
System.Reflection.Internal.StreamExtensions
Definition
StreamExtensions.cs:7
System.Reflection.PortableExecutable.CoffHeader.NumberOfSections
short NumberOfSections
Definition
CoffHeader.cs:9
System.Reflection.PortableExecutable.CoffHeader
Definition
CoffHeader.cs:4
System.Reflection.PortableExecutable.CorHeader.MetadataDirectory
DirectoryEntry MetadataDirectory
Definition
CorHeader.cs:9
System.Reflection.PortableExecutable.CorHeader
Definition
CorHeader.cs:4
System.Reflection.PortableExecutable.PEHeader.CorHeaderTableDirectory
DirectoryEntry CorHeaderTableDirectory
Definition
PEHeader.cs:91
System.Reflection.PortableExecutable.PEHeader
Definition
PEHeader.cs:4
System.Reflection.PortableExecutable.PEHeaders._isLoadedImage
readonly bool _isLoadedImage
Definition
PEHeaders.cs:17
System.Reflection.PortableExecutable.PEHeaders.DosSignature
const ushort DosSignature
Definition
PEHeaders.cs:29
System.Reflection.PortableExecutable.PEHeaders.PESignature
const uint PESignature
Definition
PEHeaders.cs:33
System.Reflection.PortableExecutable.PEHeaders.CalculateMetadataLocation
void CalculateMetadataLocation(long peImageSize, out int start, out int size)
Definition
PEHeaders.cs:219
System.Reflection.PortableExecutable.PEHeaders._corHeaderStartOffset
readonly int _corHeaderStartOffset
Definition
PEHeaders.cs:25
System.Reflection.PortableExecutable.PEHeaders._corHeader
readonly CorHeader _corHeader
Definition
PEHeaders.cs:15
System.Reflection.PortableExecutable.PEHeaders.CoffHeader
CoffHeader CoffHeader
Definition
PEHeaders.cs:41
System.Reflection.PortableExecutable.PEHeaders.PEHeaders
PEHeaders(Stream peStream)
Definition
PEHeaders.cs:73
System.Reflection.PortableExecutable.PEHeaders.SectionHeaders
ImmutableArray< SectionHeader > SectionHeaders
Definition
PEHeaders.cs:51
System.Reflection.PortableExecutable.PEHeaders.GetContainingSectionIndex
int GetContainingSectionIndex(int relativeVirtualAddress)
Definition
PEHeaders.cs:195
System.Reflection.PortableExecutable.PEHeaders.CorHeaderStartOffset
int CorHeaderStartOffset
Definition
PEHeaders.cs:55
System.Reflection.PortableExecutable.PEHeaders.IsDll
bool IsDll
Definition
PEHeaders.cs:69
System.Reflection.PortableExecutable.PEHeaders._sectionHeaders
readonly ImmutableArray< SectionHeader > _sectionHeaders
Definition
PEHeaders.cs:13
System.Reflection.PortableExecutable.PEHeaders.PEHeaderStartOffset
int PEHeaderStartOffset
Definition
PEHeaders.cs:49
System.Reflection.PortableExecutable.PEHeaders.PEHeaders
PEHeaders(Stream peStream, int size, bool isLoadedImage)
Definition
PEHeaders.cs:83
System.Reflection.PortableExecutable.PEHeaders.IsCoffOnly
bool IsCoffOnly
Definition
PEHeaders.cs:45
System.Reflection.PortableExecutable.PEHeaders.PEHeader
PEHeader? PEHeader
Definition
PEHeaders.cs:47
System.Reflection.PortableExecutable.PEHeaders.PESignatureSize
const int PESignatureSize
Definition
PEHeaders.cs:35
System.Reflection.PortableExecutable.PEHeaders.CoffHeaderStartOffset
int CoffHeaderStartOffset
Definition
PEHeaders.cs:43
System.Reflection.PortableExecutable.PEHeaders.IndexOfSection
int IndexOfSection(string name)
Definition
PEHeaders.cs:207
System.Reflection.PortableExecutable.PEHeaders._peHeaderStartOffset
readonly int _peHeaderStartOffset
Definition
PEHeaders.cs:27
System.Reflection.PortableExecutable.PEHeaders.IsConsoleApplication
bool IsConsoleApplication
Definition
PEHeaders.cs:58
System.Reflection.PortableExecutable.PEHeaders.PEHeaders
PEHeaders(Stream peStream, int size)
Definition
PEHeaders.cs:78
System.Reflection.PortableExecutable.PEHeaders.TryCalculateCorHeaderOffset
bool TryCalculateCorHeaderOffset(long peStreamSize, out int startOffset)
Definition
PEHeaders.cs:114
System.Reflection.PortableExecutable.PEHeaders.SkipDosHeader
void SkipDosHeader(ref PEBinaryReader reader, out bool isCOFFOnly)
Definition
PEHeaders.cs:129
System.Reflection.PortableExecutable.PEHeaders._peHeader
readonly PEHeader _peHeader
Definition
PEHeaders.cs:11
System.Reflection.PortableExecutable.PEHeaders.PESignatureOffsetLocation
const int PESignatureOffsetLocation
Definition
PEHeaders.cs:31
System.Reflection.PortableExecutable.PEHeaders.MetadataSize
int MetadataSize
Definition
PEHeaders.cs:39
System.Reflection.PortableExecutable.PEHeaders._coffHeaderStartOffset
readonly int _coffHeaderStartOffset
Definition
PEHeaders.cs:23
System.Reflection.PortableExecutable.PEHeaders._metadataStartOffset
readonly int _metadataStartOffset
Definition
PEHeaders.cs:19
System.Reflection.PortableExecutable.PEHeaders.MetadataStartOffset
int MetadataStartOffset
Definition
PEHeaders.cs:37
System.Reflection.PortableExecutable.PEHeaders.TryGetDirectoryOffset
bool TryGetDirectoryOffset(DirectoryEntry directory, out int offset, bool canCrossSectionBoundary)
Definition
PEHeaders.cs:178
System.Reflection.PortableExecutable.PEHeaders._metadataSize
readonly int _metadataSize
Definition
PEHeaders.cs:21
System.Reflection.PortableExecutable.PEHeaders.IsExe
bool IsExe
Definition
PEHeaders.cs:71
System.Reflection.PortableExecutable.PEHeaders._coffHeader
readonly CoffHeader _coffHeader
Definition
PEHeaders.cs:9
System.Reflection.PortableExecutable.PEHeaders.ReadSectionHeaders
ImmutableArray< SectionHeader > ReadSectionHeaders(ref PEBinaryReader reader)
Definition
PEHeaders.cs:158
System.Reflection.PortableExecutable.PEHeaders.CorHeader
CorHeader? CorHeader
Definition
PEHeaders.cs:53
System.Reflection.PortableExecutable.PEHeaders.TryGetDirectoryOffset
bool TryGetDirectoryOffset(DirectoryEntry directory, out int offset)
Definition
PEHeaders.cs:173
System.Reflection.PortableExecutable.PEHeaders
Definition
PEHeaders.cs:8
System.SR.InvalidPESignature
static string InvalidPESignature
Definition
SR.cs:32
System.SR.MissingDataDirectory
static string MissingDataDirectory
Definition
SR.cs:44
System.SR.InvalidNumberOfSections
static string InvalidNumberOfSections
Definition
SR.cs:104
System.SR.StreamMustSupportReadAndSeek
static string StreamMustSupportReadAndSeek
Definition
SR.cs:52
System.SR.InvalidCorHeaderSize
static string InvalidCorHeaderSize
Definition
SR.cs:16
System.SR.InvalidMetadataSectionSpan
static string InvalidMetadataSectionSpan
Definition
SR.cs:26
System.SR.SectionTooSmall
static string SectionTooSmall
Definition
SR.cs:50
System.SR.UnknownFileFormat
static string UnknownFileFormat
Definition
SR.cs:54
System.SR
Definition
SR.cs:7
System.Collections.Immutable
Definition
AllocFreeConcurrentStack.cs:4
System.IO
Definition
ConsoleStream.cs:3
System.Reflection.Internal
Definition
AbstractMemoryBlock.cs:4
System.Reflection.PortableExecutable.Characteristics
Characteristics
Definition
Characteristics.cs:5
System.Reflection.PortableExecutable.Subsystem
Subsystem
Definition
Subsystem.cs:4
System.Reflection.PortableExecutable
Definition
Characteristics.cs:1
System.Reflection.MetadataTokenType.Name
@ Name
System.ExceptionArgument.offset
@ offset
System.ExceptionArgument.start
@ start
System.StringComparison
StringComparison
Definition
StringComparison.cs:4
System
Definition
BlockingCollection.cs:8
System.Reflection.PortableExecutable.DirectoryEntry.Size
readonly int Size
Definition
DirectoryEntry.cs:7
System.Reflection.PortableExecutable.DirectoryEntry.RelativeVirtualAddress
readonly int RelativeVirtualAddress
Definition
DirectoryEntry.cs:5
System.Reflection.PortableExecutable.DirectoryEntry
Definition
DirectoryEntry.cs:4
System.Reflection.PortableExecutable.PEBinaryReader.CurrentOffset
int CurrentOffset
Definition
PEBinaryReader.cs:14
System.Reflection.PortableExecutable.PEBinaryReader.Seek
void Seek(int offset)
Definition
PEBinaryReader.cs:23
System.Reflection.PortableExecutable.PEBinaryReader
Definition
PEBinaryReader.cs:7
System.Reflection.PortableExecutable.SectionHeader
Definition
SectionHeader.cs:4
source
System.Reflection.Metadata
System.Reflection.PortableExecutable
PEHeaders.cs
Generated by
1.10.0