Browse Source

Refactor Resource.TryGetLength and TryOpenStream.

pull/2785/head
Siegfried Pammer 3 years ago
parent
commit
7444dd96e3
  1. 45
      ICSharpCode.Decompiler/Metadata/Resource.cs

45
ICSharpCode.Decompiler/Metadata/Resource.cs

@ -110,48 +110,39 @@ namespace ICSharpCode.Decompiler.Metadata
return ResourceType.Linked; return ResourceType.Linked;
} }
public override unsafe Stream? TryOpenStream() unsafe bool TryReadResource(out byte* ptr, out long length)
{ {
ptr = null;
length = 0;
if (ResourceType != ResourceType.Embedded) if (ResourceType != ResourceType.Embedded)
return null; return false;
var headers = Module.Reader.PEHeaders; var headers = Module.Reader.PEHeaders;
if (headers.CorHeader == null) if (headers.CorHeader == null)
return null; return false;
var resources = headers.CorHeader.ResourcesDirectory; var resources = headers.CorHeader.ResourcesDirectory;
if (resources.RelativeVirtualAddress == 0) if (resources.RelativeVirtualAddress == 0)
return null; return false;
var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress); var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress);
if (sectionData.Length == 0) if (sectionData.Length == 0)
return null; return false;
var resource = Module.Metadata.GetManifestResource(Handle); var resource = Module.Metadata.GetManifestResource(Handle);
if (resource.Offset > sectionData.Length) if (resource.Offset + 4 > sectionData.Length)
return null; return false;
byte* ptr = sectionData.Pointer + resource.Offset; ptr = sectionData.Pointer + resource.Offset;
int length = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24); length = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24);
if (length < 0 || length > sectionData.Length) return length >= 0 && length <= sectionData.Length;
}
public override unsafe Stream? TryOpenStream()
{
if (!TryReadResource(out var ptr, out var length))
return null; return null;
return new ResourceMemoryStream(Module.Reader, ptr + sizeof(int), length); return new ResourceMemoryStream(Module.Reader, ptr + sizeof(int), length);
} }
public unsafe override long? TryGetLength() public unsafe override long? TryGetLength()
{ {
if (ResourceType != ResourceType.Embedded) if (!TryReadResource(out _, out var length))
return null;
var headers = Module.Reader.PEHeaders;
if (headers.CorHeader == null)
return null;
var resources = headers.CorHeader.ResourcesDirectory;
if (resources.RelativeVirtualAddress == 0)
return null;
var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress);
if (sectionData.Length == 0)
return null;
var resource = Module.Metadata.GetManifestResource(Handle);
if (resource.Offset > sectionData.Length)
return null;
byte* ptr = sectionData.Pointer + resource.Offset;
int length = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24);
if (length < 0 || length > sectionData.Length)
return null; return null;
return length; return length;
} }

Loading…
Cancel
Save