private unsafe InternalManifestResourceInfo GetInternalManifestResourceInfo(string resourceName) { InternalManifestResourceInfo result = new InternalManifestResourceInfo(); ManifestResourceHandleCollection manifestResources = MetadataReader.ManifestResources; foreach (var resourceHandle in manifestResources) { ManifestResource resource = MetadataReader.GetManifestResource(resourceHandle); if (MetadataReader.StringComparer.Equals(resource.Name, resourceName)) { result.Found = true; if (resource.Implementation.IsNil) { checked { // Embedded data resource result.ResourceLocation = ResourceLocation.Embedded | ResourceLocation.ContainedInManifestFile; PEReader pe = PEReader; PEMemoryBlock resourceDirectory = pe.GetSectionData(pe.PEHeaders.CorHeader.ResourcesDirectory.RelativeVirtualAddress); BlobReader reader = resourceDirectory.GetReader((int)resource.Offset, resourceDirectory.Length - (int)resource.Offset); uint length = reader.ReadUInt32(); result.PointerToResource = reader.CurrentPointer; // Length check the size of the resource to ensure it fits in the PE file section, note, this is only safe as its in a checked region if (length + sizeof(Int32) > reader.Length) { throw new BadImageFormatException(); } result.SizeOfResource = length; } } else { if (resource.Implementation.Kind == HandleKind.AssemblyFile) { // Get file name result.ResourceLocation = default(ResourceLocation); AssemblyFile file = MetadataReader.GetAssemblyFile((AssemblyFileHandle)resource.Implementation); if (file.ContainsMetadata) { result.ResourceLocation = ResourceLocation.Embedded; throw new PlatformNotSupportedException(); // Support for multi-module assemblies is not implemented on this platform } result.FileName = MetadataReader.GetString(file.Name); } else if (resource.Implementation.Kind == HandleKind.AssemblyReference) { // Resolve assembly reference result.ResourceLocation = ResourceLocation.ContainedInAnotherAssembly; RuntimeAssemblyName destinationAssemblyName = ((AssemblyReferenceHandle)resource.Implementation).ToRuntimeAssemblyName(MetadataReader); result.ReferencedAssembly = RuntimeAssembly.GetRuntimeAssemblyIfExists(destinationAssemblyName); } } } } return(result); }
public sealed override String[] GetManifestResourceNames() { ManifestResourceHandleCollection manifestResources = MetadataReader.ManifestResources; string[] resourceNames = new string[manifestResources.Count]; int iResource = 0; foreach (var resourceHandle in manifestResources) { ManifestResource resource = MetadataReader.GetManifestResource(resourceHandle); resourceNames[iResource] = MetadataReader.GetString(resource.Name); iResource++; } return(resourceNames); }
internal unsafe InternalManifestResourceInfo GetInternalManifestResourceInfo(string resourceName) { MetadataReader reader = Reader; InternalManifestResourceInfo result = default; ManifestResourceHandleCollection manifestResources = reader.ManifestResources; foreach (ManifestResourceHandle resourceHandle in manifestResources) { ManifestResource resource = resourceHandle.GetManifestResource(reader); if (resource.Name.Equals(resourceName, reader)) { result.Found = true; if (resource.Implementation.IsNil) { checked { // Embedded data resource result.ResourceLocation = ResourceLocation.Embedded | ResourceLocation.ContainedInManifestFile; PEReader pe = _guardedPEReader.PEReader; PEMemoryBlock resourceDirectory = pe.GetSectionData(pe.PEHeaders.CorHeader.ResourcesDirectory.RelativeVirtualAddress); BlobReader blobReader = resourceDirectory.GetReader((int)resource.Offset, resourceDirectory.Length - (int)resource.Offset); uint length = blobReader.ReadUInt32(); result.PointerToResource = blobReader.CurrentPointer; // Length check the size of the resource to ensure it fits in the PE file section, note, this is only safe as its in a checked region if (length + sizeof(int) > blobReader.Length) { throw new BadImageFormatException(); } result.SizeOfResource = length; } } else { if (resource.Implementation.Kind == HandleKind.AssemblyFile) { // Get file name result.ResourceLocation = default; AssemblyFile file = ((AssemblyFileHandle)resource.Implementation).GetAssemblyFile(reader); result.FileName = file.Name.GetString(reader); if (file.ContainsMetadata) { EcmaModule module = (EcmaModule)Assembly.GetModule(result.FileName); if (module == null) { throw new BadImageFormatException(SR.Format(SR.ManifestResourceInfoReferencedBadModule, result.FileName)); } result = module.GetInternalManifestResourceInfo(resourceName); } } else if (resource.Implementation.Kind == HandleKind.AssemblyReference) { // Resolve assembly reference result.ResourceLocation = ResourceLocation.ContainedInAnotherAssembly; RoAssemblyName destinationAssemblyName = ((AssemblyReferenceHandle)resource.Implementation).ToRoAssemblyName(reader); result.ReferencedAssembly = Loader.ResolveAssembly(destinationAssemblyName); } } } } return(result); }