* COFFHeader.cs: Convert to class, use Read and Write methods.
authorJackson Harper <jackson@novell.com>
Tue, 18 Feb 2003 07:18:00 +0000 (07:18 -0000)
committerJackson Harper <jackson@novell.com>
Tue, 18 Feb 2003 07:18:00 +0000 (07:18 -0000)
                 Compress some code
        * CheckSum.cs: Access Lfanew through property not field.
        * CorHeader.cs: Convert to class, use Read and Write methods.
        * DOSHeader.cs: Convert to class, use Read and Write methods,
                and Init method for creating new DOSHeaders
        * DataDir.cs: Convert to class, use Read and Write methods.
        * Image.cs: Access lfanew through property, add Write method.
        * PEHeader.cs: Convert to class, use Read and Write methods.
        * PEUtils.cs: Add GetString method for converting byte pointers
             to strings.
        * RVA.cs: Add Write method
        * Section.cs: Use PEUtils.GetString method instead of new string (byte*)
        * makefuile.gnu: Compile all the files I want compiled ;-)

svn path=/trunk/mcs/; revision=11683

12 files changed:
mcs/class/Mono.PEToolkit/COFFHeader.cs
mcs/class/Mono.PEToolkit/ChangeLog [new file with mode: 0644]
mcs/class/Mono.PEToolkit/CheckSum.cs
mcs/class/Mono.PEToolkit/CorHeader.cs
mcs/class/Mono.PEToolkit/DOSHeader.cs
mcs/class/Mono.PEToolkit/DataDir.cs
mcs/class/Mono.PEToolkit/Image.cs
mcs/class/Mono.PEToolkit/PEHeader.cs
mcs/class/Mono.PEToolkit/PEUtils.cs
mcs/class/Mono.PEToolkit/RVA.cs
mcs/class/Mono.PEToolkit/Section.cs
mcs/class/Mono.PEToolkit/makefile.gnu

index 56c087274110e828b5cefbb4367fd9278c3e2c0a..76adbf6adbda4ff44914688b1121fb5a703d610b 100644 (file)
@@ -8,60 +8,31 @@ using System.Runtime.InteropServices;
 \r
 namespace Mono.PEToolkit {\r
 \r
-       /// <summary>\r
-       /// IMAGE_FILE_HEADER\r
-       /// </summary>\r
-       [StructLayoutAttribute(LayoutKind.Sequential)]\r
-       public struct COFFHeader {\r
+       public class COFFHeader {\r
 \r
-               internal MachineId machine;\r
-               internal short sections;\r
-               internal uint tdStampRaw;\r
-               internal uint symTabPtr;\r
-               internal uint numSymbols;\r
-               internal short optHeaderSize;\r
-               internal Characteristics characteristics;\r
+               private MachineId machine;\r
+               private short sections;\r
+               private uint tdStampRaw;\r
+               private uint symTabPtr;\r
+               private uint numSymbols;\r
+               private short optHeaderSize;\r
+               private Characteristics characteristics;\r
 \r
-\r
-\r
-               /// <summary>\r
-               ///  Machine identifier.\r
-               /// </summary>\r
                public MachineId Machine {\r
-                       get {\r
-                               return machine;\r
-                       }\r
-                       set {\r
-                               machine = value;\r
-                       }\r
+                       get { return machine; }\r
+                       set { machine = value; }\r
                }\r
 \r
-\r
-               /// <summary>\r
-               /// </summary>\r
                public short NumberOfSections {\r
-                       get {\r
-                               return sections;\r
-                       }\r
-                       set {\r
-                               sections = value;\r
-                       }\r
+                       get { return sections; }\r
+                       set { sections = value; }\r
                }\r
 \r
-\r
-               /// <summary>\r
-               /// </summary>\r
                public uint TimeDateStamp {\r
-                       get {\r
-                               return tdStampRaw;\r
-                       }\r
-                       set {\r
-                               tdStampRaw = value;\r
-                       }\r
+                       get { return tdStampRaw; }\r
+                       set { tdStampRaw = value; }\r
                }\r
 \r
-               /// <summary>\r
-               /// </summary>\r
                public DateTime TimeStamp {\r
                        get {\r
                                return (new DateTime(1970, 1, 1) +\r
@@ -69,83 +40,62 @@ namespace Mono.PEToolkit {
                        }\r
                }\r
 \r
-\r
-               /// <summary>\r
-               /// </summary>\r
                public uint PointerToSymbolTable {\r
-                       get {\r
-                               return symTabPtr;\r
-                       }\r
-                       set {\r
-                               symTabPtr = value;\r
-                       }\r
+                       get { return symTabPtr; }\r
+                       set { symTabPtr = value; }\r
                }\r
 \r
-\r
-               /// <summary>\r
-               /// </summary>\r
                public uint NumberOfSymbols {\r
-                       get {\r
-                               return numSymbols;\r
-                       }\r
-                       set {\r
-                               numSymbols = value;\r
-                       }\r
+                       get { return numSymbols; }\r
+                       set { numSymbols = value; }\r
                }\r
 \r
-\r
-               /// <summary>\r
-               /// </summary>\r
                public short SizeOfOptionalHeader {\r
-                       get {\r
-                               return optHeaderSize;\r
-                       }\r
-                       set {\r
-                               optHeaderSize = value;\r
-                       }\r
+                       get { return optHeaderSize; }\r
+                       set { optHeaderSize = value; }\r
                }\r
 \r
-\r
-               /// <summary>\r
-               /// </summary>\r
                public Characteristics Characteristics {\r
-                       get {\r
-                               return characteristics;\r
-                       }\r
-                       set {\r
-                               characteristics = value;\r
-                       }\r
+                       get { return characteristics; }\r
+                       set { characteristics = value; }\r
                }\r
 \r
-\r
-               /// <summary>\r
-               /// </summary>\r
-               unsafe public void Read(BinaryReader reader) {\r
-                       fixed (void* pThis = &this) {\r
-                               PEUtils.ReadStruct(reader, pThis, sizeof (COFFHeader), typeof (COFFHeader));\r
-                       }\r
+               public void Read (BinaryReader reader) \r
+               {\r
+                       machine = (MachineId) reader.ReadUInt16 ();\r
+                       sections = reader.ReadInt16 ();\r
+                       tdStampRaw = reader.ReadUInt32 ();\r
+                       symTabPtr = reader.ReadUInt32 ();\r
+                       numSymbols = reader.ReadUInt32 ();\r
+                       optHeaderSize = reader.ReadInt16 ();\r
+                       characteristics = (Characteristics) reader.ReadUInt16 ();       \r
                }\r
 \r
+               public void Write (BinaryWriter writer) \r
+               {\r
+                       writer.Write ((ushort)machine);\r
+                       writer.Write (sections);\r
+                       writer.Write (tdStampRaw);\r
+                       writer.Write (symTabPtr);\r
+                       writer.Write (numSymbols);\r
+                       writer.Write (optHeaderSize);\r
+                       writer.Write ((ushort)characteristics); \r
+               }\r
 \r
-               /// <summary>\r
-               /// </summary>\r
-               /// <param name="writer"></param>\r
                public void Dump(TextWriter writer)\r
                {\r
+                       \r
                        writer.WriteLine(\r
-                               "Machine ID      : {0}" + Environment.NewLine +\r
+                               "Machine ID      : {0}" + Environment.NewLine + \r
                                "Sections        : {1}" + Environment.NewLine +\r
-                               "timestamp       : {2}" + Environment.NewLine +\r
-                               "Characteristics : {3}" + Environment.NewLine,\r
-                               machine, sections,\r
-                               TimeStamp + " (" + tdStampRaw.ToString("X") + ")",\r
-                               characteristics + " (0x" + characteristics.ToString("X") + ")"\r
+                               "Characteristics : {2}" + Environment.NewLine +\r
+                               "timestamp       : {3}" + Environment.NewLine\r
+                               ,machine, sections, (ushort)characteristics,\r
+                               TimeStamp + " (" + tdStampRaw.ToString("X") + ")"\r
                        );\r
-               }\r
+               \r
+               }               \r
 \r
-               /// <summary>\r
-               /// </summary>\r
-               /// <returns></returns>\r
                public override string ToString()\r
                {\r
                        StringWriter sw = new StringWriter();\r
@@ -153,7 +103,6 @@ namespace Mono.PEToolkit {
                        return sw.ToString();\r
                }\r
 \r
-\r
-\r
        }\r
 }\r
+\r
diff --git a/mcs/class/Mono.PEToolkit/ChangeLog b/mcs/class/Mono.PEToolkit/ChangeLog
new file mode 100644 (file)
index 0000000..e1beb36
--- /dev/null
@@ -0,0 +1,15 @@
+2003-02-17  Jackson Harper <jackson@latitudegeo.com>
+
+       * COFFHeader.cs: Convert to class, use Read and Write methods. Compress some code
+       * CheckSum.cs: Access Lfanew through property not field.
+       * CorHeader.cs: Convert to class, use Read and Write methods.
+       * DOSHeader.cs: Convert to class, use Read and Write methods, and Init method for creating
+                       new DOSHeaders
+       * DataDir.cs: Convert to class, use Read and Write methods.
+       * Image.cs: Access lfanew through property, add Write method.
+       * PEHeader.cs: Convert to class, use Read and Write methods.
+       * PEUtils.cs: Add GetString method for converting byte pointers to strings.
+       * RVA.cs: Add Write method
+       * Section.cs: Use PEUtils.GetString method instead of new string (byte*)
+       * makefuile.gnu: Compile all the files I want compiled ;-)      
+       
index 153e607fd3bae4a0299116bd2710e5c4d4dba6e9..081a4d5481ed19df0441f9f4064f55fcc9c6d0d4 100644 (file)
@@ -37,7 +37,7 @@ namespace Mono.PEToolkit {
                                PEHeader peHdr = new PEHeader();\r
 \r
                                dosHdr.Read (reader);\r
-                               reader.BaseStream.Position = dosHdr.lfanew;\r
+                               reader.BaseStream.Position = dosHdr.Lfanew;\r
                                ExeSignature peSig = (ExeSignature) reader.ReadUInt16();\r
                                if (peSig != ExeSignature.NT) {\r
                                        throw new BadImageException("Checksum : Invalid image format, cannot find PE signature.");\r
index 0674f369a7092c873ac87bea1bbe13296f25ed02..bd827fba38d9b724784ea5a02bf8d0292e0b9e3e 100644 (file)
@@ -38,8 +38,7 @@ namespace Mono.PEToolkit {
        /// CLR 2.0 header structure.\r
        /// IMAGE_COR20_HEADER\r
        /// </summary>\r
-       [StructLayoutAttribute(LayoutKind.Sequential)]\r
-       public  struct CorHeader {\r
+       public class CorHeader {\r
                // Header versioning\r
                internal uint cb;\r
                internal short runtimeMaj;\r
@@ -266,26 +265,77 @@ namespace Mono.PEToolkit {
                }\r
 \r
 \r
-               unsafe public void Read(BinaryReader reader)\r
+               public void Read(BinaryReader reader)\r
                {\r
-                       // TODO: clear structure before reading to initialize/reset\r
-                       // unused fields. initblk would be great.\r
-\r
-                       // Read exactly the number of bytes as specified in the header.\r
-                       // This number is duplicated in PEHeader::CLIHdrDir.\r
-                       cb = reader.ReadUInt32();\r
-                       if (cb > sizeof(uint)) {\r
-                               fixed (void* ptr = &this.runtimeMaj, pThis = &this) {\r
-                                       PEUtils.ReadStruct(reader, ptr, (int)cb - sizeof (uint));\r
-                                       if (!System.BitConverter.IsLittleEndian) {\r
-                                               // fix entries on big-endian machine\r
-                                               // preserving cb\r
-                                               uint oldcb = cb;\r
-                                               PEUtils.ChangeStructEndianess(pThis, typeof (CorHeader));\r
-                                               cb = oldcb;\r
-                                       }\r
-                               }\r
-                       }\r
+                       // Header versioning\r
+                       cb = reader.ReadUInt32 ();\r
+                       \r
+                       runtimeMaj = reader.ReadInt16 ();\r
+                       runtimeMin = reader.ReadInt16 ();\r
+       \r
+                       \r
+                       // Symbol table and startup information.\r
+                       meta = new DataDir (reader);\r
+                       flags = (CorFlags) reader.ReadUInt32 ();\r
+                       entryTok = reader.ReadUInt32 ();\r
+\r
+                       // Binding information.\r
+                       rsrc  = new DataDir (reader);\r
+                       strongSig = new DataDir (reader);\r
+               \r
+                       // Regular fixup and binding information.\r
+                       codeManTab = new DataDir (reader);\r
+                       vtab = new DataDir (reader);\r
+                       jumps = new DataDir (reader);\r
+\r
+                       // Managed Native Code.\r
+                       eeInfo = new DataDir (reader);\r
+                       helper = new DataDir (reader);\r
+                       dynInfo = new DataDir (reader);\r
+                       delayInfo = new DataDir (reader);\r
+                       modImg = new DataDir (reader);\r
+                       extFixups = new DataDir (reader);\r
+                       ridMap = new DataDir (reader);\r
+                       dbgMap = new DataDir (reader);\r
+\r
+                       // obsolete?\r
+                       ipMap = new DataDir (reader);\r
+               }\r
+\r
+               public void Write (BinaryWriter writer)\r
+               {\r
+                       // Header versioning\r
+                       writer.Write (cb);\r
+                       \r
+                       writer.Write (runtimeMaj);\r
+                       writer.Write (runtimeMin);\r
+                               \r
+                       // Symbol table and startup information.\r
+                       meta.Write (writer);\r
+                       writer.Write ((uint)flags);\r
+                       writer.Write (entryTok);\r
+\r
+                       // Binding information.\r
+                       rsrc.Write (writer);\r
+                       strongSig.Write (writer);\r
+               \r
+                       // Regular fixup and binding information.\r
+                       codeManTab.Write (writer);\r
+                       vtab.Write (writer);\r
+                       jumps.Write (writer);\r
+\r
+                       // Managed Native Code.\r
+                       eeInfo.Write (writer);\r
+                       helper.Write (writer);\r
+                       dynInfo.Write (writer);\r
+                       delayInfo.Write (writer);\r
+                       modImg.Write (writer);\r
+                       extFixups.Write (writer);\r
+                       ridMap.Write (writer);\r
+                       dbgMap.Write (writer);\r
+\r
+                       // obsolete?\r
+                       ipMap.Write (writer);\r
                }\r
 \r
 \r
@@ -310,15 +360,18 @@ namespace Mono.PEToolkit {
                                "External Fixups            : {15}"  + Environment.NewLine +\r
                                "Rid Map                    : {16}"  + Environment.NewLine +\r
                                "Debug Map                  : {17}"  + Environment.NewLine +\r
-                               "IP Map                     : {18}"  + Environment.NewLine,\r
-                               cb + String.Format(" (0x{0})", cb.ToString("X")),\r
+                               "IP Map                     : {18}"  + Environment.NewLine +\r
+                               "Runtime Major              : {19}"  + Environment.NewLine +\r
+                               "Runtime Minor              : {20}" + Environment.NewLine,\r
+                               cb,\r
                                RuntimeVersion,\r
-                               meta, flags, EntryPointToken,\r
+                               meta, null, EntryPointToken,\r
                                rsrc, strongSig,\r
                                codeManTab, vtab, jumps,\r
                                eeInfo, helper, dynInfo, delayInfo, modImg, extFixups,\r
-                               ridMap, dbgMap, ipMap\r
+                               ridMap, dbgMap, ipMap, MajorRuntimeVersion, MinorRuntimeVersion\r
                        ));\r
+                       \r
                }\r
 \r
                /// <summary>\r
@@ -332,4 +385,4 @@ namespace Mono.PEToolkit {
 \r
 \r
        }\r
-}
\ No newline at end of file
+}\r
index 05120664d39a1073328044be7faed3bd66e4d791..1fae260edc33d818938d170a688c805fd8bb10fe 100644 (file)
@@ -8,74 +8,65 @@ using System.Runtime.InteropServices;
 \r
 namespace Mono.PEToolkit {\r
 \r
-       [StructLayout(LayoutKind.Explicit)]\r
-       public struct DOSHeader {\r
-               // Magic number (ExeSignature.DOS).\r
-               [FieldOffset(0*2)]  public ExeSignature magic;\r
+       public class DOSHeader {\r
+               \r
+               private readonly int OpenSize = 60;\r
+               private readonly int CloseSize = 64;\r
 \r
-               // Bytes on last page of file.\r
-               [FieldOffset(1*2)]  public short cblp;\r
+               private byte[] open_data;       // First 60 bytes of data\r
+               private byte[] close_data;      // Last 64 bytes of data\r
 \r
-               // Pages in file.\r
-               [FieldOffset(2*2)]  public short cp;\r
-\r
-               // Relocations.\r
-               [FieldOffset(3*2)]  public short crlc;\r
-\r
-               // Size of header in paragraphs.\r
-               [FieldOffset(4*2)]  public short cparhdr;\r
-\r
-               // Minimum extra paragraphs needed.\r
-               [FieldOffset(5*2)]  public short minalloc;\r
-\r
-               // Maximum extra paragraphs needed.\r
-               [FieldOffset(6*2)]  public short maxalloc;\r
-\r
-               // Initial (relative) SS value.\r
-               [FieldOffset(7*2)]  public short ss;\r
-\r
-               // Initial SP value.\r
-               [FieldOffset(8*2)]  public short sp;\r
-\r
-               // Checksum.\r
-               [FieldOffset(9*2)]  public short csum;\r
-\r
-               // Initial IP value.\r
-               [FieldOffset(10*2)] public short ip;\r
-\r
-               // Initial (relative) CS value.\r
-               [FieldOffset(11*2)] public short cs;\r
-\r
-               // File address of relocation table.\r
-               [FieldOffset(12*2)] public short lfarlc;\r
-\r
-               // Overlay number.\r
-               [FieldOffset(13*2)] public short ovno;\r
-\r
-               // Reserved words.\r
-               // short[4] res;\r
-\r
-               // OEM identifier (for e_oeminfo).\r
-               [FieldOffset(18*2)] public short oemid;\r
+               // File address of new exe header.\r
+               private uint lfanew;\r
 \r
-               // OEM information; e_oemid specific.\r
-               [FieldOffset(19*2)] public short oeminfo;\r
+               public DOSHeader ()\r
+               {\r
+                       Init ();\r
+               }\r
 \r
-               // Reserved words\r
-               // short[10] res2;\r
+               public DOSHeader (BinaryReader reader)\r
+               {\r
+                       Read (reader);\r
+               }\r
 \r
-               // File address of new exe header.\r
-               [FieldOffset(30*2)] public uint lfanew;\r
+               public uint Lfanew {\r
+                       get { return lfanew; }\r
+               }\r
 \r
+               public void Read (BinaryReader reader)\r
+               {\r
+                       open_data = reader.ReadBytes (OpenSize);\r
+                       lfanew = reader.ReadUInt32 ();\r
+                       close_data = reader.ReadBytes (CloseSize);\r
+               }\r
 \r
+               public void Write (BinaryWriter writer)\r
+               {\r
+                       writer.Write (open_data);\r
+                       writer.Write (lfanew);\r
+                       writer.Write (close_data);\r
+               }\r
 \r
-               /// <summary>\r
-               /// </summary>\r
-               unsafe public void Read(BinaryReader reader)\r
+               public void Init ()\r
                {\r
-                       fixed (void* pThis = &this) {\r
-                               PEUtils.ReadStruct(reader, pThis, sizeof (DOSHeader), typeof (DOSHeader));\r
-                       }\r
+                       open_data = new byte[] { 0x4D, 0x5A, 0x0, 0x0, 0xE7, 0x0, 0x0, 0x0, \r
+                                                0x4, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x0, \r
+                                                0xB8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \r
+                                                0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \r
+                                                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \r
+                                                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \r
+                                                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \r
+                                                0x0, 0x0, 0x0, 0x0 };\r
+                       \r
+                       close_data = new byte[] { 0xE, 0x1F, 0xBA, 0xE, 0x0, 0xB4, 0x9, 0xCD, \r
+                                                 0x21, 0xB8, 0x1, 0x4C, 0xCD, 0x21,0x54, 0x68, \r
+                                                 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, \r
+                                                 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, \r
+                                                 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, \r
+                                                 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, \r
+                                                 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0xD, 0xD, 0xA, \r
+                                                 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };\r
+\r
                }\r
 \r
                /// <summary>\r
@@ -84,17 +75,8 @@ namespace Mono.PEToolkit {
                public void Dump(TextWriter writer)\r
                {\r
                        writer.WriteLine(\r
-                               "Number of pages     : {0}" + Environment.NewLine +\r
-                               "Bytes on last pages : {1}" + Environment.NewLine +\r
-                               "New header offset   : {2}" + Environment.NewLine +\r
-                               "Initial CS:IP       : {3}:{4}" + Environment.NewLine +\r
-                               "Initial SS:SP       : {5}:{6}" + Environment.NewLine +\r
-                               "Overlay number      : {7}" + Environment.NewLine,\r
-                               cp, cblp,\r
-                               lfanew + " (0x" + lfanew.ToString("X") + ")",\r
-                               cs.ToString("X"), ip.ToString("X"),\r
-                               ss.ToString("X"), sp.ToString("X"),\r
-                               ovno\r
+                               "New header offset   : {0}",\r
+                               lfanew + " (0x" + lfanew.ToString("X") + ")"\r
                        );\r
                }\r
 \r
index c4b7bfcab984da4e829598b6b3b3c628dd79e44d..40c8bda09113b91c7047a5ea4fd1cad48f205dfb 100644 (file)
@@ -3,6 +3,7 @@
  */\r
 \r
 using System;\r
+using System.IO;\r
 using System.Runtime.InteropServices;\r
 \r
 namespace Mono.PEToolkit {\r
@@ -10,8 +11,7 @@ namespace Mono.PEToolkit {
        /// <summary>\r
        /// IMAGE_DATA_DIRECTORY.\r
        /// </summary>\r
-       [StructLayoutAttribute(LayoutKind.Sequential)]\r
-       public struct DataDir {\r
+       public class DataDir {\r
 \r
                public static readonly DataDir Null;\r
 \r
@@ -20,10 +20,31 @@ namespace Mono.PEToolkit {
 \r
                static DataDir ()\r
                {\r
+                       Null = new DataDir ();\r
                        Null.virtAddr = 0;\r
                        Null.size = 0;\r
                }\r
 \r
+               public DataDir () {\r
+\r
+               }\r
+\r
+               public DataDir (BinaryReader reader)\r
+               {\r
+                       Read (reader);\r
+               }\r
+\r
+               public void Read (BinaryReader reader)\r
+               {\r
+                       virtAddr = new RVA (reader.ReadUInt32 ());\r
+                       size = reader.ReadUInt32 ();\r
+               }\r
+\r
+               public void Write (BinaryWriter writer)\r
+               {\r
+                       virtAddr.Write (writer);\r
+                       writer.Write (size);\r
+               }\r
 \r
                public RVA VirtualAddress {\r
                        get {\r
index c1399c7faf080eba5de1235c96c15b2e7f5d03d9..11b523187353146970dcd1b8d8950ba1ceee772b 100644 (file)
@@ -111,7 +111,7 @@ namespace Mono.PEToolkit {
                        }\r
 \r
                        dosHdr.Read(reader);\r
-                       reader.BaseStream.Position = dosHdr.lfanew;\r
+                       reader.BaseStream.Position = dosHdr.Lfanew;\r
                        ExeSignature peSig = (ExeSignature) reader.ReadUInt16();\r
                        if (peSig != ExeSignature.NT) {\r
                                throw new Exception ("Invalid image format: cannot find PE signature.");\r
@@ -123,17 +123,49 @@ namespace Mono.PEToolkit {
 \r
                        coffHdr.Read(reader);\r
                        peHdr.Read(reader);\r
+               \r
                        sectionsPos = reader.BaseStream.Position;\r
                        ReadSections();\r
-\r
+                       \r
                        if (this.IsCLI) {\r
+                               \r
                                reader.BaseStream.Position = RVAToVA(peHdr.CLIHdrDir.virtAddr);\r
-                               corHdr.Read(reader);\r
+                               corHdr.Read (reader);\r
+                               \r
+                               mdRoot = new MetaDataRoot(this);\r
+                               reader.BaseStream.Position = RVAToVA(corHdr.MetaData.virtAddr);\r
+                               mdRoot.Read(reader);\r
+                               \r
+                       }\r
+                       \r
+               }\r
 \r
+               public void WriteHeaders (BinaryWriter writer)\r
+               {\r
+                       dosHdr.Write (writer);\r
+                       writer.BaseStream.Position = dosHdr.Lfanew;\r
+                       writer.Write ((ushort)ExeSignature.NT);\r
+                       writer.Write ((ushort)ExeSignature.NT2);\r
+                       \r
+                       coffHdr.Write (writer);\r
+                       peHdr.Write (writer);\r
+               \r
+                       /*\r
+                       int pos = reader.BaseStream.Position;\r
+                       ReadSections();\r
+                       \r
+                       if (this.IsCLI) {\r
+                               \r
+                               reader.BaseStream.Position = RVAToVA(peHdr.CLIHdrDir.virtAddr);\r
+                               corHdr.Read (reader);\r
+                               \r
                                mdRoot = new MetaDataRoot(this);\r
                                reader.BaseStream.Position = RVAToVA(corHdr.MetaData.virtAddr);\r
                                mdRoot.Read(reader);\r
+                               \r
                        }\r
+                       */\r
+                       \r
                }\r
 \r
                /// <summary>\r
@@ -160,9 +192,11 @@ namespace Mono.PEToolkit {
                public void Dump(TextWriter writer)\r
                {\r
                        writer.WriteLine (\r
-                               dosHdr.ToString() + Environment.NewLine +\r
+                               "COFF Header:" + Environment.NewLine +\r
                                coffHdr.ToString() + Environment.NewLine +\r
+                               "PE Header:" + Environment.NewLine +\r
                                peHdr.ToString() + Environment.NewLine +\r
+                               "Core Header:" + Environment.NewLine +\r
                                corHdr.ToString()\r
                        );\r
                }\r
index 8da65d10a854567e09339207f434a6d6a6f98a93..2b406b96e29748cea01c488819130db827553583 100644 (file)
@@ -9,15 +9,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 +25,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 +87,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 +110,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 +576,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 +651,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
index 1375a7ebec5682ee483a9f3e63ebeb6f40517808..338948458933a4c12c84ecacfdca9c9f0f0a7ea3 100644 (file)
@@ -4,6 +4,7 @@
 \r
 using System;\r
 using System.IO;\r
+using System.Text;\r
 using System.Reflection;\r
 using System.Runtime.InteropServices;\r
 \r
@@ -16,6 +17,15 @@ namespace Mono.PEToolkit {
                }\r
 \r
 \r
+               unsafe internal static string GetString (sbyte* data, int start, int len, Encoding encoding)\r
+               {\r
+                       byte[] data_array = new byte[len-start];\r
+                       \r
+                       for (int i=start; i<len; i++)\r
+                               data_array[i-start] = (byte)*data++;\r
+                       \r
+                       return encoding.GetString (data_array);\r
+               }\r
 \r
                /// <summary>\r
                /// Reads structure from the input stream preserving its endianess.\r
index 14aee790781e2236396ea8922835d46779f1436b..b8b826384209ef74b22f4c03ec1cf53940a4dd05 100644 (file)
@@ -3,6 +3,7 @@
  */\r
 \r
 using System;\r
+using System.IO;\r
 \r
 namespace Mono.PEToolkit {\r
 \r
@@ -36,6 +37,10 @@ namespace Mono.PEToolkit {
                        }\r
                }\r
 \r
+               public void Write (BinaryWriter writer)\r
+               {\r
+                       writer.Write (value);\r
+               }\r
 \r
                public static implicit operator RVA (uint val)\r
                {\r
index 2021b0c6695d99ddcb9691a04289ade0ac070659..979ada4e2e6bfc38442fad72d0c192d3b70c4f5e 100644 (file)
@@ -157,7 +157,7 @@ namespace Mono.PEToolkit {
 \r
                        int len = (int) (p - pName);\r
                        if (len != 0) {\r
-                               name = new string(pName, 0, len, Encoding.ASCII);\r
+                               name = PEUtils.GetString (pName, 0, len, Encoding.ASCII);\r
                        } else {\r
                                name = String.Empty;\r
                        }\r
index d53b62840eff8491f5e17685efc653a5742cd25c..fcd5b723f3d353f00a30faf81148419dfe40099b 100644 (file)
@@ -5,9 +5,56 @@ LIBRARY = $(topdir)/class/lib/Mono.PEToolkit.dll
 LIB_LIST = list.unix
 LIB_FLAGS = --unsafe -r corlib -r System.Xml -r mscorlib
 
-SOURCES_INCLUDE=
+SOURCES_INCLUDE=                       \
+       build/mddump.cs                 \
+       BadImageException.cs            \
+       COFFHeader.cs                   \
+       Characteristics.cs              \
+       CheckSum.cs                     \
+       CorHeader.cs                    \
+       DOSHeader.cs                    \
+       DataDir.cs                      \
+       ExeSignature.cs                 \
+       Image.cs                        \
+       LEBitConverter.cs               \
+       MachineId.cs                    \
+       PEHeader.cs                     \
+       PEUtils.cs                      \
+       RVA.cs                          \
+       Section.cs                      \
+       SectionCharacteristics.cs       \
+       Subsystem.cs                    \
+       metadata/AssemblyFlags.cs       \
+       metadata/BadMetaDataException.cs        \
+       metadata/CodedTokenId.cs        \
+       metadata/ElementType.cs         \
+       metadata/GUIDHeap.cs            \
+       metadata/MDHeap.cs              \
+       metadata/MDStream.cs            \
+       metadata/MDTable.cs             \
+       metadata/MDToken.cs             \
+       metadata/MDUtils.cs             \
+       metadata/ManifestResourceAttributes.cs  \
+       metadata/MetaDataRoot.cs        \
+       metadata/MethodIL.cs            \
+       metadata/MethodSemanticsAttributes.cs   \
+       metadata/PInvokeAttributes.cs   \
+       metadata/Row.cs                 \
+       metadata/Rows.cs                \
+       metadata/StringsHeap.cs         \
+       metadata/TableId.cs             \
+       metadata/Tables.cs              \
+       metadata/TablesHeap.cs          \
+       metadata/TablesHeapBase.cs      \
+       metadata/TabsDecoder.cs         \
+       metadata/TokenType.cs           \
+
+
 SOURCES_EXCLUDE=
 
-export MONO_PATH_PREFIX = $(topdir)/class/lib:
+#export MONO_PATH_PREFIX = $(topdir)/class/lib:
+
+#include $(topdir)/class/library.make
 
-include $(topdir)/class/library.make
+all:
+       mcs /out:mddump.exe /unsafe $(SOURCES_INCLUDE)