2 * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
\r
7 using System.Runtime.InteropServices;
\r
9 namespace Mono.PEToolkit {
\r
11 [StructLayout(LayoutKind.Explicit)]
\r
12 public struct DOSHeader {
\r
13 // Magic number (ExeSignature.DOS).
\r
14 [FieldOffset(0*2)] public ExeSignature magic;
\r
16 // Bytes on last page of file.
\r
17 [FieldOffset(1*2)] public short cblp;
\r
20 [FieldOffset(2*2)] public short cp;
\r
23 [FieldOffset(3*2)] public short crlc;
\r
25 // Size of header in paragraphs.
\r
26 [FieldOffset(4*2)] public short cparhdr;
\r
28 // Minimum extra paragraphs needed.
\r
29 [FieldOffset(5*2)] public short minalloc;
\r
31 // Maximum extra paragraphs needed.
\r
32 [FieldOffset(6*2)] public short maxalloc;
\r
34 // Initial (relative) SS value.
\r
35 [FieldOffset(7*2)] public short ss;
\r
37 // Initial SP value.
\r
38 [FieldOffset(8*2)] public short sp;
\r
41 [FieldOffset(9*2)] public short csum;
\r
43 // Initial IP value.
\r
44 [FieldOffset(10*2)] public short ip;
\r
46 // Initial (relative) CS value.
\r
47 [FieldOffset(11*2)] public short cs;
\r
49 // File address of relocation table.
\r
50 [FieldOffset(12*2)] public short lfarlc;
\r
53 [FieldOffset(13*2)] public short ovno;
\r
58 // OEM identifier (for e_oeminfo).
\r
59 [FieldOffset(18*2)] public short oemid;
\r
61 // OEM information; e_oemid specific.
\r
62 [FieldOffset(19*2)] public short oeminfo;
\r
67 // File address of new exe header.
\r
68 [FieldOffset(30*2)] public uint lfanew;
\r
74 unsafe public void Read(BinaryReader reader)
\r
76 fixed (void* pThis = &this) {
\r
77 PEUtils.ReadStruct(reader, pThis, sizeof (DOSHeader), typeof (DOSHeader));
\r
83 /// <param name="writer"></param>
\r
84 public void Dump(TextWriter writer)
\r
87 "Number of pages : {0}" + Environment.NewLine +
\r
88 "Bytes on last pages : {1}" + Environment.NewLine +
\r
89 "New header offset : {2}" + Environment.NewLine +
\r
90 "Initial CS:IP : {3}:{4}" + Environment.NewLine +
\r
91 "Initial SS:SP : {5}:{6}" + Environment.NewLine +
\r
92 "Overlay number : {7}" + Environment.NewLine,
\r
94 lfanew + " (0x" + lfanew.ToString("X") + ")",
\r
95 cs.ToString("X"), ip.ToString("X"),
\r
96 ss.ToString("X"), sp.ToString("X"),
\r
103 /// <returns></returns>
\r
104 public override string ToString()
\r
106 StringWriter sw = new StringWriter();
\r
108 return sw.ToString();
\r