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