New test.
[mono.git] / mcs / class / Mono.PEToolkit / COFFHeader.cs
1 \r
2 //\r
3 // Permission is hereby granted, free of charge, to any person obtaining\r
4 // a copy of this software and associated documentation files (the\r
5 // "Software"), to deal in the Software without restriction, including\r
6 // without limitation the rights to use, copy, modify, merge, publish,\r
7 // distribute, sublicense, and/or sell copies of the Software, and to\r
8 // permit persons to whom the Software is furnished to do so, subject to\r
9 // the following conditions:\r
10 // \r
11 // The above copyright notice and this permission notice shall be\r
12 // included in all copies or substantial portions of the Software.\r
13 // \r
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21 //\r
22 /*\r
23  * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>\r
24  */\r
25 \r
26 using System;\r
27 using System.IO;\r
28 using System.Runtime.InteropServices;\r
29 \r
30 namespace Mono.PEToolkit {\r
31 \r
32         public class COFFHeader {\r
33 \r
34                 private MachineId machine;\r
35                 private short sections;\r
36                 private uint tdStampRaw;\r
37                 private uint symTabPtr;\r
38                 private uint numSymbols;\r
39                 private short optHeaderSize;\r
40                 private Characteristics characteristics;\r
41 \r
42                 public MachineId Machine {\r
43                         get { return machine; }\r
44                         set { machine = value; }\r
45                 }\r
46 \r
47                 public short NumberOfSections {\r
48                         get { return sections; }\r
49                         set { sections = value; }\r
50                 }\r
51 \r
52                 public uint TimeDateStamp {\r
53                         get { return tdStampRaw; }\r
54                         set { tdStampRaw = value; }\r
55                 }\r
56 \r
57                 public DateTime TimeStamp {\r
58                         get {\r
59                                 return (new DateTime(1970, 1, 1) +\r
60                                        TimeSpan.FromSeconds(tdStampRaw)).ToLocalTime();\r
61                         }\r
62                 }\r
63 \r
64                 public uint PointerToSymbolTable {\r
65                         get { return symTabPtr; }\r
66                         set { symTabPtr = value; }\r
67                 }\r
68 \r
69                 public uint NumberOfSymbols {\r
70                         get { return numSymbols; }\r
71                         set { numSymbols = value; }\r
72                 }\r
73 \r
74                 public short SizeOfOptionalHeader {\r
75                         get { return optHeaderSize; }\r
76                         set { optHeaderSize = value; }\r
77                 }\r
78 \r
79                 public Characteristics Characteristics {\r
80                         get { return characteristics; }\r
81                         set { characteristics = value; }\r
82                 }\r
83 \r
84                 public void Read (BinaryReader reader) \r
85                 {\r
86                         machine = (MachineId) reader.ReadUInt16 ();\r
87                         sections = reader.ReadInt16 ();\r
88                         tdStampRaw = reader.ReadUInt32 ();\r
89                         symTabPtr = reader.ReadUInt32 ();\r
90                         numSymbols = reader.ReadUInt32 ();\r
91                         optHeaderSize = reader.ReadInt16 ();\r
92                         characteristics = (Characteristics) reader.ReadUInt16 ();       \r
93                 }\r
94 \r
95                 public void Write (BinaryWriter writer) \r
96                 {\r
97                         writer.Write ((ushort)machine);\r
98                         writer.Write (sections);\r
99                         writer.Write (tdStampRaw);\r
100                         writer.Write (symTabPtr);\r
101                         writer.Write (numSymbols);\r
102                         writer.Write (optHeaderSize);\r
103                         writer.Write ((ushort)characteristics); \r
104                 }\r
105 \r
106                 public void Dump(TextWriter writer)\r
107                 {\r
108                         writer.WriteLine(\r
109                                 "Machine ID      : {0}" + Environment.NewLine + \r
110                                 "Sections        : {1}" + Environment.NewLine +\r
111                                 "Characteristics : {2}" + Environment.NewLine +\r
112                                 "timestamp       : {3} ({4})" + Environment.NewLine\r
113                                 ,machine, sections, (ushort)characteristics,\r
114                                 TimeStamp, tdStampRaw.ToString("X")\r
115                         );\r
116                 }               \r
117 \r
118                 public override string ToString()\r
119                 {\r
120                         StringWriter sw = new StringWriter();\r
121                         Dump(sw);\r
122                         return sw.ToString();\r
123                 }\r
124 \r
125         }\r
126 }\r
127 \r