Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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);
        }