2 * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
\r
8 using System.Runtime.InteropServices;
\r
10 namespace Mono.PEToolkit {
\r
12 public class Section {
\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
26 public Header (BinaryReader reader)
\r
31 public void Read (BinaryReader reader)
\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
44 public void Write (BinaryWriter writer)
\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
58 private string name;
\r
61 public readonly static Section Invalid;
\r
65 Invalid = new Section();
\r
73 public string Name {
\r
83 public uint PhysicalAddress {
\r
85 return hdr.phAddr_virtSize;
\r
88 hdr.phAddr_virtSize = value;
\r
92 public uint VirtualSize {
\r
94 return hdr.phAddr_virtSize;
\r
97 hdr.phAddr_virtSize = value;
\r
101 public RVA VirtualAddress {
\r
103 return hdr.virtAddr;
\r
106 hdr.virtAddr = value;
\r
110 public uint SizeOfRawData {
\r
112 return hdr.rawSize;
\r
115 hdr.rawSize = value;
\r
119 public RVA PointerToRawData {
\r
121 return hdr.rawDataPtr;
\r
124 hdr.rawDataPtr = value;
\r
128 public RVA PointerToRelocations {
\r
130 return hdr.relocPtr;
\r
133 hdr.relocPtr = value;
\r
137 public RVA PointerToLinenumbers {
\r
139 return hdr.lineNumPtr;
\r
142 hdr.lineNumPtr = value;
\r
146 public short NumberOfRelocations {
\r
148 return hdr.relocNum;
\r
151 hdr.relocNum = value;
\r
155 public short NumberOfLinenumbers {
\r
157 return hdr.linenumNum;
\r
160 hdr.linenumNum = value;
\r
164 public SectionCharacteristics Characteristics {
\r
175 public void Read(BinaryReader reader)
\r
177 char[] pName = new char[8];
\r
180 for (len = 0; len<8; len++) {
\r
181 sbyte c = reader.ReadSByte();
\r
184 pName[len] = (char) c;
\r
188 name = String.Empty;
\r
190 name = new String (pName);
\r
192 reader.BaseStream.Position += 8 - len - 1;
\r
194 hdr = new Header (reader);
\r
197 public void Write (BinaryWriter writer)
\r
199 sbyte[] name_bytes = new sbyte[8];
\r
201 for (int i=0; i<name.Length; i++)
\r
202 writer.Write ((sbyte) name[i]);
\r
204 for (int i=name.Length; i<8; i++)
\r
205 writer.Write ((sbyte) 0);
\r
207 hdr.Write (writer);
\r