New test.
[mono.git] / mcs / class / Mono.PEToolkit / PEHeader.cs
index 8da65d10a854567e09339207f434a6d6a6f98a93..3ff1e9becbc70df67c9c177403acf2a537f1e1fe 100644 (file)
@@ -1,3 +1,24 @@
+\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
@@ -9,15 +30,12 @@ using System.Runtime.InteropServices;
 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
@@ -28,19 +46,48 @@ namespace Mono.PEToolkit {
                        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
@@ -61,8 +108,7 @@ namespace Mono.PEToolkit {
                /// <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
@@ -85,6 +131,66 @@ namespace Mono.PEToolkit {
                        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
@@ -491,20 +597,52 @@ namespace Mono.PEToolkit {
 \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
@@ -534,7 +672,9 @@ namespace Mono.PEToolkit {
                        );\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