+\r
+//\r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+// \r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+//\r
/*\r
* Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>\r
*/\r
namespace Mono.PEToolkit {\r
\r
// IMAGE_OPTIONAL_HEADER\r
-\r
- [StructLayoutAttribute(LayoutKind.Sequential)]\r
- public struct PEHeader {\r
+ public class PEHeader {\r
\r
/// <summary>\r
/// Standard PE/COFF fields.\r
/// </summary>\r
- [StructLayoutAttribute(LayoutKind.Sequential)]\r
- public struct StdFields {\r
+ public class StdFields {\r
internal short magic; // always 0x10B?\r
internal byte lMajor;\r
internal byte lMinor;\r
internal RVA codeBase;\r
internal RVA dataBase;\r
\r
+ public StdFields ()\r
+ {\r
+\r
+ }\r
+\r
+ public StdFields (BinaryReader reader)\r
+ {\r
+ Read (reader);\r
+ }\r
+\r
+ public void Read (BinaryReader reader)\r
+ {\r
+ magic = reader.ReadInt16 ();\r
+ lMajor = reader.ReadByte ();\r
+ lMinor = reader.ReadByte ();\r
+ codeSize = reader.ReadUInt32 ();\r
+ initDataSize = reader.ReadUInt32 ();\r
+ uninitDataSize = reader.ReadUInt32 ();\r
+ entryRVA = new RVA (reader.ReadUInt32 ());\r
+ codeBase = new RVA (reader.ReadUInt32 ());\r
+ dataBase = new RVA (reader.ReadUInt32 ());\r
+ }\r
+\r
+ public void Write (BinaryWriter writer)\r
+ {\r
+ writer.Write (magic);\r
+ writer.Write (lMajor);\r
+ writer.Write (lMinor);\r
+ writer.Write (codeSize);\r
+ writer.Write (initDataSize);\r
+ writer.Write (uninitDataSize);\r
+ entryRVA.Write (writer);\r
+ codeBase.Write (writer);\r
+ dataBase.Write (writer);\r
+ }\r
\r
- /// <summary>\r
- /// </summary>\r
public string LinkerVersion {\r
get {\r
return String.Format("{0}.{1}", lMajor, lMinor);\r
}\r
}\r
\r
-\r
- /// <summary>\r
- /// </summary>\r
- /// <returns></returns>\r
public override string ToString() {\r
return String.Format(\r
"Magic : 0x{0}" + Environment.NewLine +\r
/// <remarks>\r
/// See Partition II, 24.2.3.2\r
/// </remarks>\r
- [StructLayoutAttribute(LayoutKind.Sequential)]\r
- public struct NTFields {\r
+ public class NTFields {\r
internal uint imgBase;\r
internal uint sectAlign;\r
internal uint fileAlign;\r
internal uint ldrFlags;\r
internal uint numDirs;\r
\r
+ public NTFields ()\r
+ {\r
+\r
+ }\r
+ \r
+ public NTFields (BinaryReader reader) \r
+ {\r
+ Read (reader);\r
+ }\r
+\r
+ public void Read (BinaryReader reader) \r
+ {\r
+ imgBase = reader.ReadUInt32 ();\r
+ sectAlign = reader.ReadUInt32 ();\r
+ fileAlign = reader.ReadUInt32 ();\r
+ osMaj = reader.ReadInt16 ();\r
+ osMin = reader.ReadInt16 ();\r
+ imgMaj = reader.ReadInt16 ();\r
+ imgMin = reader.ReadInt16 ();\r
+ subSysMaj = reader.ReadInt16 ();\r
+ subSysMin = reader.ReadInt16 ();\r
+ reserved_win32ver = reader.ReadInt32 ();\r
+ imgSize = reader.ReadUInt32 ();\r
+ hdrSize = reader.ReadUInt32 ();\r
+ chksum = reader.ReadUInt32 ();\r
+ subSys = (Subsystem) reader.ReadInt16 ();\r
+ dllFlags = reader.ReadInt16 ();\r
+ stackRes = reader.ReadUInt32 ();\r
+ stackCommit = reader.ReadUInt32 ();\r
+ heapRes = reader.ReadUInt32 ();\r
+ heapCommit = reader.ReadUInt32 ();\r
+ ldrFlags = reader.ReadUInt32 ();\r
+ numDirs = reader.ReadUInt32 ();\r
+ }\r
+\r
+ public void Write (BinaryWriter writer) \r
+ {\r
+ writer.Write (imgBase);\r
+ writer.Write (sectAlign);\r
+ writer.Write (fileAlign);\r
+ writer.Write (osMaj);\r
+ writer.Write (osMin);\r
+ writer.Write (imgMaj);\r
+ writer.Write (imgMin);\r
+ writer.Write (subSysMaj);\r
+ writer.Write (subSysMin);\r
+ writer.Write (reserved_win32ver);\r
+ writer.Write (imgSize);\r
+ writer.Write (hdrSize);\r
+ writer.Write (chksum);\r
+ writer.Write ((short)subSys);\r
+ writer.Write (dllFlags);\r
+ writer.Write (stackRes);\r
+ writer.Write (stackCommit);\r
+ writer.Write (heapRes);\r
+ writer.Write (heapCommit);\r
+ writer.Write (ldrFlags);\r
+ writer.Write (numDirs);\r
+ }\r
+\r
public string OSVersion {\r
get {\r
return String.Format("{0}.{1}", osMaj, osMin);\r
\r
/// <summary>\r
/// </summary>\r
- unsafe public void Read(BinaryReader reader)\r
+ public void Read(BinaryReader reader)\r
{\r
- fixed (void* pThis = &this) {\r
- int hdrSize = sizeof (StdFields) + sizeof (NTFields);\r
- PEUtils.ReadStruct(reader, pThis, hdrSize);\r
- PEUtils.ReadStruct(reader, (byte*)pThis + hdrSize, (int) NumberOfRvaAndSizes * sizeof (DataDir));\r
-\r
- if (!System.BitConverter.IsLittleEndian) {\r
- PEUtils.ChangeStructEndianess(pThis, typeof (PEHeader));\r
- }\r
- }\r
+ stdFlds = new StdFields (reader);\r
+ ntFlds = new NTFields (reader);\r
+\r
+ exportDir = new DataDir (reader);\r
+ importDir = new DataDir (reader); \r
+ resourceDir = new DataDir (reader);\r
+ exceptionDir = new DataDir (reader);\r
+ securityDir = new DataDir (reader);\r
+ baseRelocDir = new DataDir (reader);\r
+ debugDir = new DataDir (reader);\r
+ copyrightDir = new DataDir (reader);\r
+ GPDir = new DataDir (reader);\r
+ TLSDir = new DataDir (reader);\r
+ loadCfgDir = new DataDir (reader);\r
+ boundImpDir = new DataDir (reader);\r
+ IATDir = new DataDir (reader);\r
+ delayImpDir = new DataDir (reader);\r
+ CLIHdrDir = new DataDir (reader);\r
+ reservedDir = new DataDir (reader);\r
+ \r
}\r
\r
-\r
+ public void Write (BinaryWriter writer)\r
+ {\r
+ stdFlds.Write (writer);\r
+ ntFlds.Write (writer);\r
+\r
+ exportDir.Write (writer);\r
+ importDir.Write (writer);\r
+ resourceDir.Write (writer);\r
+ exceptionDir.Write (writer);\r
+ securityDir.Write (writer);\r
+ baseRelocDir.Write (writer);\r
+ debugDir.Write (writer);\r
+ copyrightDir.Write (writer);\r
+ GPDir.Write (writer);\r
+ TLSDir.Write (writer);\r
+ loadCfgDir.Write (writer);\r
+ boundImpDir.Write (writer);\r
+ IATDir.Write (writer);\r
+ delayImpDir.Write (writer);\r
+ CLIHdrDir.Write (writer);\r
+ reservedDir.Write (writer);\r
+ }\r
\r
/// <summary>\r
/// </summary>\r
);\r
\r
writer.WriteLine(\r
+ "Standard Fields:" + Environment.NewLine +\r
stdFlds.ToString() + Environment.NewLine +\r
+ "NT Fields:" + Environment.NewLine +\r
ntFlds.ToString() + Environment.NewLine +\r
"Directories: "+ Environment.NewLine +\r
dirs\r