Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

201 lines
5.3 KiB
C#

//
// PEOptionalHeader.cs
//
// Author:
// Jb Evain (jbevain@gmail.com)
//
// (C) 2005 Jb Evain
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
namespace Mono.Cecil.Binary {
internal sealed class PEOptionalHeader : IHeader, IBinaryVisitable {
public StandardFieldsHeader StandardFields;
public NTSpecificFieldsHeader NTSpecificFields;
public DataDirectoriesHeader DataDirectories;
internal PEOptionalHeader ()
{
StandardFields = new StandardFieldsHeader ();
NTSpecificFields = new NTSpecificFieldsHeader ();
DataDirectories = new DataDirectoriesHeader ();
}
public void SetDefaultValues ()
{
}
public void Accept (IBinaryVisitor visitor)
{
visitor.VisitPEOptionalHeader (this);
StandardFields.Accept (visitor);
NTSpecificFields.Accept (visitor);
DataDirectories.Accept (visitor);
}
internal sealed class StandardFieldsHeader : IHeader, IBinaryVisitable {
public ushort Magic;
public byte LMajor;
public byte LMinor;
public uint CodeSize;
public uint InitializedDataSize;
public uint UninitializedDataSize;
public RVA EntryPointRVA;
public RVA BaseOfCode;
public RVA BaseOfData;
public bool IsPE64 {
get { return Magic == 0x20b; }
set {
if (value)
Magic = 0x20b;
else
Magic = 0x10b;
}
}
internal StandardFieldsHeader ()
{
}
public void SetDefaultValues ()
{
Magic = 0x10b;
LMajor = 6;
LMinor = 0;
}
public void Accept (IBinaryVisitor visitor)
{
visitor.VisitStandardFieldsHeader (this);
}
}
internal sealed class NTSpecificFieldsHeader : IHeader, IBinaryVisitable {
public ulong ImageBase;
public uint SectionAlignment;
public uint FileAlignment;
public ushort OSMajor;
public ushort OSMinor;
public ushort UserMajor;
public ushort UserMinor;
public ushort SubSysMajor;
public ushort SubSysMinor;
public uint Reserved;
public uint ImageSize;
public uint HeaderSize;
public uint FileChecksum;
public SubSystem SubSystem;
public ushort DLLFlags;
public ulong StackReserveSize;
public ulong StackCommitSize;
public ulong HeapReserveSize;
public ulong HeapCommitSize;
public uint LoaderFlags;
public uint NumberOfDataDir;
internal NTSpecificFieldsHeader ()
{
}
public void SetDefaultValues ()
{
ImageBase = 0x400000;
SectionAlignment = 0x2000;
FileAlignment = 0x200;
OSMajor = 4;
OSMinor = 0;
UserMajor = 0;
UserMinor = 0;
SubSysMajor = 4;
SubSysMinor = 0;
Reserved = 0;
HeaderSize = 0x200;
FileChecksum = 0;
DLLFlags = 0;
StackReserveSize = 0x100000;
StackCommitSize = 0x1000;
HeapReserveSize = 0x100000;
HeapCommitSize = 0x1000;
LoaderFlags = 0;
NumberOfDataDir = 0x10;
}
public void Accept (IBinaryVisitor visitor)
{
visitor.VisitNTSpecificFieldsHeader (this);
}
}
internal sealed class DataDirectoriesHeader : IHeader, IBinaryVisitable {
public DataDirectory ExportTable;
public DataDirectory ImportTable;
public DataDirectory ResourceTable;
public DataDirectory ExceptionTable;
public DataDirectory CertificateTable;
public DataDirectory BaseRelocationTable;
public DataDirectory Debug;
public DataDirectory Copyright;
public DataDirectory GlobalPtr;
public DataDirectory TLSTable;
public DataDirectory LoadConfigTable;
public DataDirectory BoundImport;
public DataDirectory IAT;
public DataDirectory DelayImportDescriptor;
public DataDirectory CLIHeader;
public DataDirectory Reserved;
internal DataDirectoriesHeader ()
{
}
public void SetDefaultValues ()
{
ExportTable = DataDirectory.Zero;
ResourceTable = DataDirectory.Zero;
ExceptionTable = DataDirectory.Zero;
CertificateTable = DataDirectory.Zero;
Debug = DataDirectory.Zero;
Copyright = DataDirectory.Zero;
GlobalPtr = DataDirectory.Zero;
TLSTable = DataDirectory.Zero;
LoadConfigTable = DataDirectory.Zero;
BoundImport = DataDirectory.Zero;
IAT = new DataDirectory (new RVA (0x2000), 8);
DelayImportDescriptor = DataDirectory.Zero;
CLIHeader = new DataDirectory (new RVA (0x2008), 0x48);
Reserved = DataDirectory.Zero;
}
public void Accept (IBinaryVisitor visitor)
{
visitor.VisitDataDirectoriesHeader (this);
}
}
}
}