Esempio n. 1
0
        /// <summary>
        /// Creates copy of read-only metadata of runnig assembly to enable changes.
        /// </summary>
        /// <param name="roEmitter">Read-only version of metadata.</param>
        /// <returns>Editable copy of metadata.</returns>

        private unsafe IMetaDataEmit createEmitterCopy(IMetaDataEmit roEmitter)
        {
            Object objDispenser, objEmitter = null;
            ulong  saveSize;

            byte[] metadataBuffer;

            roEmitter.GetSaveSize((uint)CorSaveSize.cssAccurate, out saveSize);
            metadataBuffer = new byte[saveSize];
            roEmitter.SaveToMemory(metadataBuffer, saveSize);

            int hResult = NativeMethods.CoCreateInstance(ref dispenserClassID, null, 1, ref dispenserIID, out objDispenser);

            if (hResult == 0)
            {
                IMetaDataDispenser dispenser = (IMetaDataDispenser)objDispenser;

                UInt32 fVal = 0x01;
                object val  = (object)fVal;
                dispenser.SetOption(ref metaDataSetENC, ref val);
                fixed(byte *buff = metadataBuffer)
                {
                    dispenser.OpenScopeOnMemory(new IntPtr(buff), (uint)metadataBuffer.Length, CorOpenFlags.ofRead, ref emitterIID, out objEmitter);
                }

                oldDispenser = dispenser;
            }
            return((IMetaDataEmit)objEmitter);
        }
Esempio n. 2
0
        private static string[] PeVerify(byte[] peImage, int domainId, string assemblyPath, bool metadataOnly)
        {
            if (MonoHelpers.IsRunningOnMono())
            {
                // PEverify is currently unsupported on Mono hence return an empty
                // set of messages
                return(new string[0]);
            }

            lock (s_guard)
            {
                GCHandle pinned = GCHandle.Alloc(peImage, GCHandleType.Pinned);
                try
                {
                    IntPtr buffer = pinned.AddrOfPinnedObject();

                    ICLRValidator          validator    = (ICLRValidator)GetRuntimeInterfaceAsObject(s_clsIdClrRuntimeHost, typeof(ICLRRuntimeHost).GUID);
                    ValidationErrorHandler errorHandler = new ValidationErrorHandler(validator);

                    IMetaDataDispenser dispenser = (IMetaDataDispenser)GetRuntimeInterfaceAsObject(s_clsIdCorMetaDataDispenser, typeof(IMetaDataDispenser).GUID);

                    // the buffer needs to be pinned during validation
                    Guid   riid           = typeof(IMetaDataImport).GUID;
                    object metaDataImport = null;
                    if (assemblyPath != null)
                    {
                        dispenser.OpenScope(assemblyPath, CorOpenFlags.ofRead, ref riid, out metaDataImport);
                    }
                    else
                    {
                        dispenser.OpenScopeOnMemory(buffer, (uint)peImage.Length, CorOpenFlags.ofRead, ref riid, out metaDataImport);
                    }

                    IMetaDataValidate metaDataValidate = (IMetaDataValidate)metaDataImport;
                    metaDataValidate.ValidatorInit(CorValidatorModuleType.ValidatorModuleTypePE, errorHandler);
                    metaDataValidate.ValidateMetaData();

                    if (!metadataOnly)
                    {
                        validator.Validate(errorHandler, (uint)domainId, ValidatorFlags.VALIDATOR_EXTRA_VERBOSE,
                                           ulMaxError: 10, token: 0, fileName: assemblyPath, pe: buffer, ulSize: (uint)peImage.Length);
                    }

                    return(errorHandler.GetOutput());
                }
                finally
                {
                    pinned.Free();
                }
            }
        }
Esempio n. 3
0
        public static ISymbolReader CreateReader(string filename, byte [] binaryFile)
        {
            SymBinder binder;
            object    objImporter;

            IntPtr filePtr = Marshal.AllocHGlobal(binaryFile.Length);

            Marshal.Copy(binaryFile, 0, filePtr, binaryFile.Length);

            IMetaDataDispenser dispenser = InstantiateDispenser(out binder);

            dispenser.OpenScopeOnMemory(filePtr, (uint)binaryFile.Length, 0, ref s_importerIID, out objImporter);

            return(InstantiateReader(binder, filename, objImporter));
        }
Esempio n. 4
0
        private static string[] PeVerify(byte[] peImage, int domainId, string assemblyPath)
        {
            lock (Guard)
            {
                GCHandle pinned = GCHandle.Alloc(peImage, GCHandleType.Pinned);
                try
                {
                    IntPtr buffer = pinned.AddrOfPinnedObject();

                    ICLRValidator          validator    = (ICLRValidator)RuntimeEnvironment.GetRuntimeInterfaceAsObject(ClsIdClrRuntimeHost, typeof(ICLRRuntimeHost).GUID);
                    ValidationErrorHandler errorHandler = new ValidationErrorHandler(validator);

                    IMetaDataDispenser dispenser = (IMetaDataDispenser)RuntimeEnvironment.GetRuntimeInterfaceAsObject(ClsIdCorMetaDataDispenser, typeof(IMetaDataDispenser).GUID);

                    // the buffer needs to be pinned during validation
                    Guid   riid           = typeof(IMetaDataImport).GUID;
                    object metaDataImport = null;
                    if (assemblyPath != null)
                    {
                        dispenser.OpenScope(assemblyPath, CorOpenFlags.ofRead, ref riid, out metaDataImport);
                    }
                    else
                    {
                        dispenser.OpenScopeOnMemory(buffer, (uint)peImage.Length, CorOpenFlags.ofRead, ref riid, out metaDataImport);
                    }

                    IMetaDataValidate metaDataValidate = (IMetaDataValidate)metaDataImport;
                    metaDataValidate.ValidatorInit(CorValidatorModuleType.ValidatorModuleTypePE, errorHandler);
                    metaDataValidate.ValidateMetaData();

                    validator.Validate(errorHandler, (uint)domainId, ValidatorFlags.VALIDATOR_EXTRA_VERBOSE,
                                       ulMaxError: 10, token: 0, fileName: assemblyPath, pe: buffer, ulSize: (uint)peImage.Length);

                    return(errorHandler.GetOutput());
                }
                finally
                {
                    pinned.Free();
                }
            }
        }