Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Mono.Cecil.PE/ImageReader.cs')
-rw-r--r--Mono.Cecil.PE/ImageReader.cs61
1 files changed, 24 insertions, 37 deletions
diff --git a/Mono.Cecil.PE/ImageReader.cs b/Mono.Cecil.PE/ImageReader.cs
index 734b00a..1205e0b 100644
--- a/Mono.Cecil.PE/ImageReader.cs
+++ b/Mono.Cecil.PE/ImageReader.cs
@@ -42,12 +42,13 @@ namespace Mono.Cecil.PE {
DataDirectory cli;
DataDirectory metadata;
+ uint table_heap_offset;
+
public ImageReader (Stream stream)
: base (stream)
{
image = new Image ();
-
- image.FileName = stream.GetFullyQualifiedName ();
+ image.Stream = stream;
}
void MoveTo (DataDirectory directory)
@@ -55,11 +56,6 @@ namespace Mono.Cecil.PE {
BaseStream.Position = image.ResolveVirtualAddress (directory.VirtualAddress);
}
- void MoveTo (uint position)
- {
- BaseStream.Position = position;
- }
-
void ReadImage ()
{
if (BaseStream.Length < 128)
@@ -275,31 +271,11 @@ namespace Mono.Cecil.PE {
Advance (16);
sections [i] = section;
-
- ReadSectionData (section);
}
image.Sections = sections;
}
- void ReadSectionData (Section section)
- {
- var position = BaseStream.Position;
-
- MoveTo (section.PointerToRawData);
-
- var length = (int) section.SizeOfRawData;
- var data = new byte [length];
- int offset = 0, read;
-
- while ((read = Read (data, offset, length - offset)) > 0)
- offset += read;
-
- section.Data = data;
-
- BaseStream.Position = position;
- }
-
void ReadCLIHeader ()
{
MoveTo (cli);
@@ -362,39 +338,50 @@ namespace Mono.Cecil.PE {
void ReadMetadataStream (Section section)
{
// Offset 4
- uint start = metadata.VirtualAddress - section.VirtualAddress + ReadUInt32 (); // relative to the section start
+ uint offset = metadata.VirtualAddress - section.VirtualAddress + ReadUInt32 (); // relative to the section start
// Size 4
uint size = ReadUInt32 ();
+ var data = ReadHeapData (offset, size);
+
var name = ReadAlignedString (16);
switch (name) {
case "#~":
case "#-":
- image.TableHeap = new TableHeap (section, start, size);
+ image.TableHeap = new TableHeap (data);
+ table_heap_offset = offset;
break;
case "#Strings":
- image.StringHeap = new StringHeap (section, start, size);
+ image.StringHeap = new StringHeap (data);
break;
case "#Blob":
- image.BlobHeap = new BlobHeap (section, start, size);
+ image.BlobHeap = new BlobHeap (data);
break;
case "#GUID":
- image.GuidHeap = new GuidHeap (section, start, size);
+ image.GuidHeap = new GuidHeap (data);
break;
case "#US":
- image.UserStringHeap = new UserStringHeap (section, start, size);
+ image.UserStringHeap = new UserStringHeap (data);
break;
}
}
+ byte [] ReadHeapData (uint offset, uint size)
+ {
+ var position = BaseStream.Position;
+ MoveTo (offset + image.MetadataSection.PointerToRawData);
+ var data = ReadBytes ((int) size);
+ BaseStream.Position = position;
+
+ return data;
+ }
+
void ReadTableHeap ()
{
var heap = image.TableHeap;
- uint start = heap.Section.PointerToRawData;
-
- MoveTo (heap.Offset + start);
+ MoveTo (table_heap_offset + image.MetadataSection.PointerToRawData);
// Reserved 4
// MajorVersion 1
@@ -447,7 +434,7 @@ namespace Mono.Cecil.PE {
void ComputeTableInformations ()
{
- uint offset = (uint) BaseStream.Position - image.MetadataSection.PointerToRawData; // header
+ uint offset = (uint) BaseStream.Position - table_heap_offset - image.MetadataSection.PointerToRawData; // header
int stridx_size = image.StringHeap.IndexSize;
int blobidx_size = image.BlobHeap != null ? image.BlobHeap.IndexSize : 2;