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;