internal static ImmutableArray <MetadataBlock> GetMetadataBlocks(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, ImmutableArray <AssemblyIdentity> missingAssemblyIdentities) { ArrayBuilder <MetadataBlock> builder = null; foreach (AssemblyIdentity missingAssemblyIdentity in missingAssemblyIdentities) { MetadataBlock block; try { uint size; IntPtr ptr; ptr = getMetaDataBytesPtrFunction(missingAssemblyIdentity, out size); Debug.Assert(size > 0); block = GetMetadataBlock(ptr, size); } catch (Exception e) when(MetadataUtilities.IsBadOrMissingMetadataException(e, missingAssemblyIdentity.GetDisplayName())) { continue; } if (builder == null) { builder = ArrayBuilder <MetadataBlock> .GetInstance(); } builder.Add(block); } return(builder == null ? ImmutableArray <MetadataBlock> .Empty : builder.ToImmutableAndFree()); }
internal static ImmutableArray <MetadataBlock> GetMetadataBlocks(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, ImmutableArray <AssemblyIdentity> missingAssemblyIdentities) { ArrayBuilder <MetadataBlock> builder = null; foreach (AssemblyIdentity missingAssemblyIdentity in missingAssemblyIdentities) { int size; IntPtr ptr; MetadataReader reader; if (TryGetMetadataReader(getMetaDataBytesPtrFunction, missingAssemblyIdentity, out ptr, out size, out reader)) { var moduleDef = reader.GetModuleDefinition(); var moduleVersionId = reader.GetGuid(moduleDef.Mvid); var generationId = reader.GetGuid(moduleDef.GenerationId); if (builder == null) { builder = ArrayBuilder <MetadataBlock> .GetInstance(); } builder.Add(new MetadataBlock(moduleVersionId, generationId, ptr, size)); } } return(builder == null ? ImmutableArray <MetadataBlock> .Empty : builder.ToImmutableAndFree()); }
internal static ImmutableArray <MetadataBlock> GetMetadataBlocks(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, ImmutableArray <AssemblyIdentity> missingAssemblyIdentities) { ArrayBuilder <MetadataBlock>?builder = null; foreach (var missingAssemblyIdentity in missingAssemblyIdentities) { uint size; IntPtr ptr; try { ptr = getMetaDataBytesPtrFunction(missingAssemblyIdentity, out size); Debug.Assert(size > 0); } catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e)) { continue; } if (!TryGetMetadataBlock(ptr, size, out var block)) { // ignore modules with bad metadata headers continue; } builder ??= ArrayBuilder <MetadataBlock> .GetInstance(); builder.Add(block); } return(builder == null ? ImmutableArray <MetadataBlock> .Empty : builder.ToImmutableAndFree()); }
/// <summary> /// Attempt to construct a <see cref="MetadataReader"/> instance for this module. /// </summary> /// <returns>Returns 'false' for modules with "bad" or missing metadata.</returns> private unsafe static bool TryGetMetadataReader(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, AssemblyIdentity assemblyIdentity, out IntPtr ptr, out int size, out MetadataReader reader) { var assemblyName = assemblyIdentity.GetDisplayName(); try { uint uSize; ptr = getMetaDataBytesPtrFunction(assemblyIdentity, out uSize); size = (int)uSize; reader = new MetadataReader((byte *)ptr, size); return(true); } catch (Exception e) when(MetadataUtilities.IsBadOrMissingMetadataException(e, assemblyName)) { ptr = IntPtr.Zero; size = 0; reader = null; return(false); } }