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

Loading…
Cancel
Save