2003-01-13 Ville Palo <vi64pa@koti.soon.fi>
[mono.git] / mcs / class / Mono.PEToolkit / DOSHeader.cs
1 /*\r
2  * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>\r
3  */\r
4 \r
5 using System;\r
6 using System.IO;\r
7 using System.Runtime.InteropServices;\r
8 \r
9 namespace Mono.PEToolkit {\r
10 \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
15 \r
16                 // Bytes on last page of file.\r
17                 [FieldOffset(1*2)]  public short cblp;\r
18 \r
19                 // Pages in file.\r
20                 [FieldOffset(2*2)]  public short cp;\r
21 \r
22                 // Relocations.\r
23                 [FieldOffset(3*2)]  public short crlc;\r
24 \r
25                 // Size of header in paragraphs.\r
26                 [FieldOffset(4*2)]  public short cparhdr;\r
27 \r
28                 // Minimum extra paragraphs needed.\r
29                 [FieldOffset(5*2)]  public short minalloc;\r
30 \r
31                 // Maximum extra paragraphs needed.\r
32                 [FieldOffset(6*2)]  public short maxalloc;\r
33 \r
34                 // Initial (relative) SS value.\r
35                 [FieldOffset(7*2)]  public short ss;\r
36 \r
37                 // Initial SP value.\r
38                 [FieldOffset(8*2)]  public short sp;\r
39 \r
40                 // Checksum.\r
41                 [FieldOffset(9*2)]  public short csum;\r
42 \r
43                 // Initial IP value.\r
44                 [FieldOffset(10*2)] public short ip;\r
45 \r
46                 // Initial (relative) CS value.\r
47                 [FieldOffset(11*2)] public short cs;\r
48 \r
49                 // File address of relocation table.\r
50                 [FieldOffset(12*2)] public short lfarlc;\r
51 \r
52                 // Overlay number.\r
53                 [FieldOffset(13*2)] public short ovno;\r
54 \r
55                 // Reserved words.\r
56                 // short[4] res;\r
57 \r
58                 // OEM identifier (for e_oeminfo).\r
59                 [FieldOffset(18*2)] public short oemid;\r
60 \r
61                 // OEM information; e_oemid specific.\r
62                 [FieldOffset(19*2)] public short oeminfo;\r
63 \r
64                 // Reserved words\r
65                 // short[10] res2;\r
66 \r
67                 // File address of new exe header.\r
68                 [FieldOffset(30*2)] public uint lfanew;\r
69 \r
70 \r
71 \r
72                 /// <summary>\r
73                 /// </summary>\r
74                 unsafe public void Read(BinaryReader reader)\r
75                 {\r
76                         fixed (void* pThis = &this) {\r
77                                 PEUtils.ReadStruct(reader, pThis, sizeof (DOSHeader), typeof (DOSHeader));\r
78                         }\r
79                 }\r
80 \r
81                 /// <summary>\r
82                 /// </summary>\r
83                 /// <param name="writer"></param>\r
84                 public void Dump(TextWriter writer)\r
85                 {\r
86                         writer.WriteLine(\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
93                                 cp, cblp,\r
94                                 lfanew + " (0x" + lfanew.ToString("X") + ")",\r
95                                 cs.ToString("X"), ip.ToString("X"),\r
96                                 ss.ToString("X"), sp.ToString("X"),\r
97                                 ovno\r
98                         );\r
99                 }\r
100 \r
101                 /// <summary>\r
102                 /// </summary>\r
103                 /// <returns></returns>\r
104                 public override string ToString()\r
105                 {\r
106                         StringWriter sw = new StringWriter();\r
107                         Dump(sw);\r
108                         return sw.ToString();\r
109                 }\r
110 \r
111         }\r
112 \r
113 }\r
114 \r