|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|