\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
}\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
return sw.ToString();\r
}\r
\r
-\r
-\r
}\r
}\r
+\r
--- /dev/null
+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 ;-)
+
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
/// 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
}\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
"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
\r
\r
}\r
-}
\ No newline at end of file
+}\r
\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
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
*/\r
\r
using System;\r
+using System.IO;\r
using System.Runtime.InteropServices;\r
\r
namespace Mono.PEToolkit {\r
/// <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
\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
}\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
\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
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
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
\r
using System;\r
using System.IO;\r
+using System.Text;\r
using System.Reflection;\r
using System.Runtime.InteropServices;\r
\r
}\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
*/\r
\r
using System;\r
+using System.IO;\r
\r
namespace Mono.PEToolkit {\r
\r
}\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
\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
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)