New test.
[mono.git] / mcs / class / Mono.PEToolkit / Section.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.Text;\r
29 using System.Runtime.InteropServices;\r
30 \r
31 namespace Mono.PEToolkit {\r
32 \r
33         public class Section {\r
34 \r
35                 // IMAGE_SECTION_HEADER\r
36                 protected class Header {\r
37                         internal uint  phAddr_virtSize;\r
38                         internal RVA   virtAddr;\r
39                         internal uint  rawSize;\r
40                         internal RVA   rawDataPtr;\r
41                         internal RVA   relocPtr;\r
42                         internal RVA   lineNumPtr;\r
43                         internal short relocNum;\r
44                         internal short linenumNum;\r
45                         internal SectionCharacteristics flags;\r
46                         \r
47                         public Header (BinaryReader reader)\r
48                         {\r
49                                 Read (reader);\r
50                         }\r
51 \r
52                         public void Read (BinaryReader reader)\r
53                         {\r
54                                 phAddr_virtSize = reader.ReadUInt32 ();\r
55                                 virtAddr = new RVA (reader.ReadUInt32 ());\r
56                                 rawSize = reader.ReadUInt32 ();\r
57                                 rawDataPtr = new RVA (reader.ReadUInt32 ());\r
58                                 relocPtr = new RVA (reader.ReadUInt32 ());\r
59                                 lineNumPtr = new RVA (reader.ReadUInt32 ());\r
60                                 relocNum = reader.ReadInt16 ();\r
61                                 linenumNum = reader.ReadInt16 ();\r
62                                 flags = (SectionCharacteristics) reader.ReadUInt32 ();\r
63                         }\r
64                         \r
65                         public void Write (BinaryWriter writer)\r
66                         {\r
67                                 writer.Write (phAddr_virtSize);\r
68                                 virtAddr.Write (writer);\r
69                                 writer.Write (rawSize);\r
70                                 rawDataPtr.Write (writer);\r
71                                 relocPtr.Write (writer);\r
72                                 lineNumPtr.Write (writer);\r
73                                 writer.Write (relocNum);\r
74                                 writer.Write (linenumNum);\r
75                                 writer.Write ((uint) flags);\r
76                         }\r
77                 }\r
78 \r
79                 private string name;\r
80                 private Header hdr;\r
81 \r
82                 public readonly static Section Invalid;\r
83 \r
84                 static Section()\r
85                 {\r
86                         Invalid = new Section();\r
87                 }\r
88 \r
89                 public Section()\r
90                 {\r
91                 }\r
92 \r
93 \r
94                 public string Name {\r
95                         get {\r
96                                 return name;\r
97                         }\r
98                         set {\r
99                                 name = value;\r
100                         }\r
101                 }\r
102 \r
103 \r
104                 public uint PhysicalAddress {\r
105                         get {\r
106                                 return hdr.phAddr_virtSize;\r
107                         }\r
108                         set {\r
109                                 hdr.phAddr_virtSize = value;\r
110                         }\r
111                 }\r
112 \r
113                 public uint VirtualSize {\r
114                         get {\r
115                                 return hdr.phAddr_virtSize;\r
116                         }\r
117                         set {\r
118                                 hdr.phAddr_virtSize = value;\r
119                         }\r
120                 }\r
121 \r
122                 public RVA VirtualAddress {\r
123                         get {\r
124                                 return hdr.virtAddr;\r
125                         }\r
126                         set {\r
127                                 hdr.virtAddr = value;\r
128                         }\r
129                 }\r
130 \r
131                 public uint SizeOfRawData {\r
132                         get {\r
133                                 return hdr.rawSize;\r
134                         }\r
135                         set {\r
136                                 hdr.rawSize = value;\r
137                         }\r
138                 }\r
139 \r
140                 public RVA PointerToRawData {\r
141                         get {\r
142                                 return hdr.rawDataPtr;\r
143                         }\r
144                         set {\r
145                                 hdr.rawDataPtr = value;\r
146                         }\r
147                 }\r
148                 \r
149                 public RVA PointerToRelocations {\r
150                         get {\r
151                                 return hdr.relocPtr;\r
152                         }\r
153                         set {\r
154                                 hdr.relocPtr = value;\r
155                         }\r
156                 }\r
157                 \r
158                 public RVA PointerToLinenumbers {\r
159                         get {\r
160                                 return hdr.lineNumPtr;\r
161                         }\r
162                         set {\r
163                                 hdr.lineNumPtr = value;\r
164                         }\r
165                 }\r
166                 \r
167                 public short NumberOfRelocations {\r
168                         get {\r
169                                 return hdr.relocNum;\r
170                         }\r
171                         set {\r
172                                 hdr.relocNum = value;\r
173                         }\r
174                 }\r
175                 \r
176                 public short NumberOfLinenumbers {\r
177                         get {\r
178                                 return hdr.linenumNum;\r
179                         }\r
180                         set {\r
181                                 hdr.linenumNum = value;\r
182                         }\r
183                 }\r
184                 \r
185                 public SectionCharacteristics Characteristics {\r
186                         get {\r
187                                 return hdr.flags;\r
188                         }\r
189                         set {\r
190                                 hdr.flags = value;\r
191                         }\r
192                 }\r
193 \r
194                 /// <summary>\r
195                 /// </summary>\r
196                 public void Read(BinaryReader reader)\r
197                 {\r
198                         char[] pName = new char[8];\r
199                         int len = 0;\r
200 \r
201                         for (len = 0; len<8; len++) {\r
202                                 sbyte c = reader.ReadSByte();\r
203                                 if (c == 0) \r
204                                         break;\r
205                                 pName[len] = (char) c;\r
206                         }\r
207 \r
208                         if (len == 0)\r
209                                 name = String.Empty;\r
210                         else\r
211                                 name = new String (pName);                      \r
212 \r
213                         reader.BaseStream.Position += 8 - len - 1;\r
214 \r
215                         hdr = new Header (reader);\r
216                 }\r
217 \r
218                 public void Write (BinaryWriter writer)\r
219                 {\r
220                         sbyte[] name_bytes =  new sbyte[8];\r
221         \r
222                         for (int i=0; i<name.Length; i++)\r
223                                 writer.Write ((sbyte) name[i]);\r
224                         \r
225                         for (int i=name.Length; i<8; i++)\r
226                                 writer.Write ((sbyte) 0);\r
227 \r
228                         hdr.Write (writer);\r
229                 }\r
230 \r
231         }\r
232 \r
233 }\r
234 \r