2002-10-26 Piers Haken <piersh@friskit.com>
[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                 [StructLayoutAttribute(LayoutKind.Sequential)]\r
16                 public struct Header {\r
17                         internal uint  phAddr_virtSize;\r
18                         internal RVA   virtAddr;\r
19                         internal uint  rawSize;\r
20                         internal RVA   rawDataPtr;\r
21                         internal RVA   relocPtr;\r
22                         internal RVA   lineNumPtr;\r
23                         internal short relocNum;\r
24                         internal short linenumNum;\r
25                         internal SectionCharacteristics flags;\r
26                 }\r
27 \r
28                 private string name;\r
29                 internal Header hdr;\r
30 \r
31                 public readonly static Section Invalid;\r
32 \r
33                 static Section()\r
34                 {\r
35                         Invalid = new Section();\r
36                 }\r
37 \r
38                 public Section()\r
39                 {\r
40                 }\r
41 \r
42 \r
43                 public string Name {\r
44                         get {\r
45                                 return name;\r
46                         }\r
47                         set {\r
48                                 name = value;\r
49                         }\r
50                 }\r
51 \r
52 \r
53                 public uint PhysicalAddress {\r
54                         get {\r
55                                 return hdr.phAddr_virtSize;\r
56                         }\r
57                         set {\r
58                                 hdr.phAddr_virtSize = value;\r
59                         }\r
60                 }\r
61 \r
62                 public uint VirtualSize {\r
63                         get {\r
64                                 return hdr.phAddr_virtSize;\r
65                         }\r
66                         set {\r
67                                 hdr.phAddr_virtSize = value;\r
68                         }\r
69                 }\r
70 \r
71                 public RVA VirtualAddress {\r
72                         get {\r
73                                 return hdr.virtAddr;\r
74                         }\r
75                         set {\r
76                                 hdr.virtAddr = value;\r
77                         }\r
78                 }\r
79 \r
80                 public uint SizeOfRawData {\r
81                         get {\r
82                                 return hdr.rawSize;\r
83                         }\r
84                         set {\r
85                                 hdr.rawSize = value;\r
86                         }\r
87                 }\r
88 \r
89                 public RVA PointerToRawData {\r
90                         get {\r
91                                 return hdr.rawDataPtr;\r
92                         }\r
93                         set {\r
94                                 hdr.rawDataPtr = value;\r
95                         }\r
96                 }\r
97                 \r
98                 public RVA PointerToRelocations {\r
99                         get {\r
100                                 return hdr.relocPtr;\r
101                         }\r
102                         set {\r
103                                 hdr.relocPtr = value;\r
104                         }\r
105                 }\r
106                 \r
107                 public RVA PointerToLinenumbers {\r
108                         get {\r
109                                 return hdr.lineNumPtr;\r
110                         }\r
111                         set {\r
112                                 hdr.lineNumPtr = value;\r
113                         }\r
114                 }\r
115                 \r
116                 public short NumberOfRelocations {\r
117                         get {\r
118                                 return hdr.relocNum;\r
119                         }\r
120                         set {\r
121                                 hdr.relocNum = value;\r
122                         }\r
123                 }\r
124                 \r
125                 public short NumberOfLinenumbers {\r
126                         get {\r
127                                 return hdr.linenumNum;\r
128                         }\r
129                         set {\r
130                                 hdr.linenumNum = value;\r
131                         }\r
132                 }\r
133                 \r
134                 public SectionCharacteristics Characteristics {\r
135                         get {\r
136                                 return hdr.flags;\r
137                         }\r
138                         set {\r
139                                 hdr.flags = value;\r
140                         }\r
141                 }\r
142 \r
143 \r
144 \r
145                 /// <summary>\r
146                 /// </summary>\r
147                 unsafe public void Read(BinaryReader reader)\r
148                 {\r
149                         sbyte* pName = stackalloc sbyte [8];\r
150                         sbyte* p = pName;\r
151 \r
152                         for (int i = 8; --i >=0;) {\r
153                                 sbyte c = reader.ReadSByte();\r
154                                 if (c == 0) break;\r
155                                 *p++ = c;\r
156                         }\r
157 \r
158                         int len = (int) (p - pName);\r
159                         if (len != 0) {\r
160                                 name = new string(pName, 0, len, Encoding.ASCII);\r
161                         } else {\r
162                                 name = String.Empty;\r
163                         }\r
164 \r
165                         reader.BaseStream.Position += 8 - len - 1;\r
166 \r
167                         fixed (void* pHdr = &this.hdr) {\r
168                                 PEUtils.ReadStruct(reader, pHdr, sizeof (Header), typeof (Header));\r
169                         }\r
170                 }\r
171 \r
172         }\r
173 \r
174 }\r
175 \r