public static int GetMetadataLocator( [MarshalAs(UnmanagedType.LPWStr)] string imagePath, uint imageTimestamp, uint imageSize, [MarshalAs(UnmanagedType.LPArray, SizeConst = 16)] byte[] mvid, uint mdRva, uint flags, uint bufferSize, IntPtr pMetadata, IntPtr pMetadataSize) { int hr = unchecked ((int)0x80004005); int dataSize = 0; Debug.Assert(pMetadata != IntPtr.Zero); Stream peStream = null; if (imagePath != null && File.Exists(imagePath)) { peStream = SymbolReader.TryOpenFile(imagePath); } else if (SymbolReader.IsSymbolStoreEnabled()) { SymbolStoreKey key = PEFileKeyGenerator.GetKey(imagePath, imageTimestamp, imageSize); peStream = SymbolReader.GetSymbolStoreFile(key)?.Stream; } if (peStream != null) { using (var peReader = new PEReader(peStream, PEStreamOptions.Default)) { if (peReader.HasMetadata) { PEMemoryBlock metadataInfo = peReader.GetMetadata(); unsafe { int size = Math.Min((int)bufferSize, metadataInfo.Length); Marshal.Copy(metadataInfo.GetContent().ToArray(), 0, pMetadata, size); } dataSize = metadataInfo.Length; hr = 0; } } } if (pMetadataSize != IntPtr.Zero) { Marshal.WriteInt32(pMetadataSize, dataSize); } return(hr); }
/// <summary> /// Metadata locator helper for the DAC. /// </summary> /// <param name="imagePath">file name and path to module</param> /// <param name="imageTimestamp">module timestamp</param> /// <param name="imageSize">module image</param> /// <param name="mvid">not used</param> /// <param name="mdRva">not used</param> /// <param name="flags">not used</param> /// <param name="bufferSize">size of incoming buffer (pMetadata)</param> /// <param name="pMetadata">pointer to buffer</param> /// <param name="pMetadataSize">size of outgoing metadata</param> /// <returns>HRESULT</returns> public static int GetMetadataLocator( [MarshalAs(UnmanagedType.LPWStr)] string imagePath, uint imageTimestamp, uint imageSize, [MarshalAs(UnmanagedType.LPArray, SizeConst = 16)] byte[] mvid, uint mdRva, uint flags, uint bufferSize, IntPtr pMetadata, IntPtr pMetadataSize) { int hr = S_OK; int dataSize = 0; Debug.Assert(pMetadata != IntPtr.Zero); try { Stream peStream = null; if (imagePath != null && File.Exists(imagePath)) { peStream = SymbolReader.TryOpenFile(imagePath); } else if (SymbolReader.IsSymbolStoreEnabled()) { SymbolStoreKey key = PEFileKeyGenerator.GetKey(imagePath, imageTimestamp, imageSize); peStream = SymbolReader.GetSymbolStoreFile(key)?.Stream; } if (peStream != null) { using (var peReader = new PEReader(peStream, PEStreamOptions.Default)) { if (peReader.HasMetadata) { PEMemoryBlock metadataInfo = peReader.GetMetadata(); dataSize = metadataInfo.Length; unsafe { int size = Math.Min((int)bufferSize, metadataInfo.Length); Marshal.Copy(metadataInfo.GetContent().ToArray(), 0, pMetadata, size); } } else { hr = E_FAIL; } } } else { hr = E_FAIL; } } catch (Exception ex) when (ex is UnauthorizedAccessException || ex is BadImageFormatException || ex is InvalidVirtualAddressException || ex is IOException) { hr = E_FAIL; } if (pMetadataSize != IntPtr.Zero) { Marshal.WriteInt32(pMetadataSize, dataSize); } return(hr); }