From dbfb677b7b97d5aa95ff7910567d6461608a5f7c Mon Sep 17 00:00:00 2001 From: jfrijters Date: Fri, 18 Mar 2011 05:49:05 +0000 Subject: [PATCH] Added Module.__ReadDataFromRVA() to make it more convenient to read data based on rva. --- reflect/Module.cs | 5 +++++ reflect/Reader/Field.cs | 13 +------------ reflect/Reader/ModuleReader.cs | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/reflect/Module.cs b/reflect/Module.cs index 79018ee6..ba295f6f 100644 --- a/reflect/Module.cs +++ b/reflect/Module.cs @@ -207,6 +207,11 @@ namespace IKVM.Reflection throw new NotSupportedException(); } + public virtual int __ReadDataFromRVA(int rva, byte[] data, int offset, int length) + { + throw new NotSupportedException(); + } + public virtual void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine) { throw new NotSupportedException(); diff --git a/reflect/Reader/Field.cs b/reflect/Reader/Field.cs index 5784ebce..6f25dfb2 100644 --- a/reflect/Reader/Field.cs +++ b/reflect/Reader/Field.cs @@ -87,18 +87,7 @@ namespace IKVM.Reflection.Reader Array.Clear(data, offset, length); return; } - module.SeekRVA(rva); - while (length > 0) - { - int read = module.stream.Read(data, offset, length); - if (read == 0) - { - // C++ assemblies can have fields that have an RVA that lies outside of the file - break; - } - offset += read; - length -= read; - } + module.__ReadDataFromRVA(rva, data, offset, length); } public override int __FieldRVA diff --git a/reflect/Reader/ModuleReader.cs b/reflect/Reader/ModuleReader.cs index dad37326..5ac9928e 100644 --- a/reflect/Reader/ModuleReader.cs +++ b/reflect/Reader/ModuleReader.cs @@ -1044,6 +1044,25 @@ namespace IKVM.Reflection.Reader return peFile.GetSectionInfo(rva, out name, out characteristics); } + public override int __ReadDataFromRVA(int rva, byte[] data, int offset, int length) + { + SeekRVA(rva); + int totalBytesRead = 0; + while (length > 0) + { + int read = stream.Read(data, offset, length); + if (read == 0) + { + // C++ assemblies can have fields that have an RVA that lies outside of the file + break; + } + offset += read; + length -= read; + totalBytesRead += read; + } + return totalBytesRead; + } + public override void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine) { peKind = 0;