Пример #1
0
        private LinkerSymbol CreateCustomAttributesTable(MosaUnit unit)
        {
            var symbolName = Metadata.CustomAttributesTable + unit.FullName;

            var customAttributesTableSymbol = Linker.GetSymbol(symbolName);

            if (customAttributesTableSymbol.Size != 0)
            {
                return(customAttributesTableSymbol);
            }

            // Emit custom attributes table
            customAttributesTableSymbol = Linker.DefineSymbol(symbolName, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0);
            var writer = new EndianAwareBinaryWriter(customAttributesTableSymbol.Stream, Architecture.Endianness);

            // 1. Number of Custom Attributes
            writer.Write(unit.CustomAttributes.Count, TypeLayout.NativePointerSize);

            // 2. Pointers to Custom Attributes
            for (int i = 0; i < unit.CustomAttributes.Count; i++)
            {
                // Get custom attribute
                var ca = unit.CustomAttributes[i];

                // Build definition
                var customAttributeTableSymbol = CreateCustomAttribute(unit, ca, i);

                // Link
                Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributesTableSymbol, writer.Position, customAttributeTableSymbol, 0);
                writer.WriteZeroBytes(TypeLayout.NativePointerSize);
            }

            return(customAttributesTableSymbol);
        }
Пример #2
0
        protected bool Select(TreeNode node, MosaUnit selected)
        {
            if (node == null)
            {
                return(false);
            }

            if (node.Tag != null)
            {
                if (node.Tag == selected)
                {
                    treeView.SelectedNode = node;
                    node.EnsureVisible();
                    return(true);
                }
            }

            foreach (TreeNode children in node.Nodes)
            {
                if (Select(children, selected))
                {
                    return(true);
                }
            }

            return(false);
        }
Пример #3
0
        private LinkerSymbol CreateCustomAttributesTable(MosaUnit unit)
        {
            // Emit custom attributes table
            var customAttributesTableSymbol = Linker.CreateSymbol(unit.FullName + Metadata.CustomAttributesTable, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0);
            var writer1 = new EndianAwareBinaryWriter(customAttributesTableSymbol.Stream, Architecture.Endianness);

            // 1. Number of Custom Attributes
            writer1.Write(unit.CustomAttributes.Count, TypeLayout.NativePointerSize);

            // 2. Pointers to Custom Attributes
            // Create the definitions along the way
            for (int i = 0; i < unit.CustomAttributes.Count; i++)
            {
                // Get custom attribute
                var ca = unit.CustomAttributes[i];

                // Build definition
                var customAttributeTableSymbol = CreateCustomAttribute(unit, ca, i);

                // Link
                Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributesTableSymbol, (int)writer1.Position, 0, customAttributeTableSymbol, 0);
                writer1.WriteZeroBytes(TypeLayout.NativePointerSize);
            }

            // Return customAttributesTableSymbol for linker usage
            return(customAttributesTableSymbol);
        }
Пример #4
0
        protected void Select(MosaUnit selected)
        {
            if (selected == null)
            {
                return;
            }

            foreach (TreeNode node in treeView.Nodes)
            {
                if (Select(node, selected))
                {
                    return;
                }
            }
        }
Пример #5
0
        private LinkerSymbol CreateCustomAttribute(MosaUnit unit, MosaCustomAttribute ca, int position)
        {
            // Emit custom attribute list
            string name = unit.FullName + ">>" + position.ToString() + ":" + ca.Constructor.DeclaringType.Name;

            var customAttributeSymbol = Linker.DefineSymbol(Metadata.CustomAttribute + name, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0);
            var writer1 = new EndianAwareBinaryWriter(customAttributeSymbol.Stream, Architecture.Endianness);

            // 1. Pointer to Attribute Type
            Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, writer1.Position, Metadata.TypeDefinition + ca.Constructor.DeclaringType.FullName, 0);
            writer1.WriteZeroBytes(TypeLayout.NativePointerSize);

            // 2. Pointer to Constructor Method Definition
            Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, writer1.Position, Metadata.MethodDefinition + ca.Constructor.FullName, 0);

            writer1.WriteZeroBytes(TypeLayout.NativePointerSize);

            // 3. Number of Arguments (Both unnamed and named)
            writer1.Write((uint)(ca.Arguments.Length + ca.NamedArguments.Length), TypeLayout.NativePointerSize);

            // 4. Pointers to Custom Attribute Arguments (Both unnamed and named)
            for (int i = 0; i < ca.Arguments.Length; i++)
            {
                // Build definition
                var customAttributeArgumentSymbol = CreateCustomAttributeArgument(name, i, null, ca.Arguments[i], false);

                // Link
                Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, writer1.Position, customAttributeArgumentSymbol, 0);
                writer1.WriteZeroBytes(TypeLayout.NativePointerSize);
            }

            foreach (var namedArg in ca.NamedArguments)
            {
                // Build definition
                var customAttributeArgumentSymbol = CreateCustomAttributeArgument(name, 0, namedArg.Name, namedArg.Argument, namedArg.IsField);

                // Link
                Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, writer1.Position, customAttributeArgumentSymbol, 0);
                writer1.WriteZeroBytes(TypeLayout.NativePointerSize);
            }

            return(customAttributeSymbol);
        }
Пример #6
0
 public void EnqueueForResolve(MosaUnit unit)
 {
     resolveQueue.Enqueue(unit);
 }
Пример #7
0
        private void ResolveCustomAttributes(MosaUnit.MutatorBase unit, IHasCustomAttribute obj)
        {
            foreach (var attr in obj.CustomAttributes)
            {
                MosaType type = metadata.Loader.GetType(attr.AttributeType.ToTypeSig());
                MethodDef ctor = ((IMethodDefOrRef)attr.Constructor).ResolveMethod();
                MosaMethod mosaCtor = null;
                foreach (var method in type.Methods)
                {
                    var desc = method.GetUnderlyingObject<UnitDesc<MethodDef, MethodSig>>();
                    if (desc.Token.Token == ctor.MDToken)
                    {
                        mosaCtor = method;
                        break;
                    }
                }
                if (mosaCtor == null)
                    throw new AssemblyLoadException();

                var values = new MosaCustomAttribute.Argument[attr.ConstructorArguments.Count];
                for (int i = 0; i < values.Length; i++)
                    values[i] = ToMosaCAArgument(attr.ConstructorArguments[i]);

                var namedArgs = new MosaCustomAttribute.NamedArgument[attr.NamedArguments.Count];
                for (int i = 0; i < namedArgs.Length; i++)
                {
                    var namedArg = attr.NamedArguments[i];
                    namedArgs[i] = new MosaCustomAttribute.NamedArgument(namedArg.Name, namedArg.IsField, ToMosaCAArgument(namedArg.Argument));
                }

                unit.CustomAttributes.Add(new MosaCustomAttribute(mosaCtor, values, namedArgs));
            }
        }
Пример #8
0
        private LinkerSymbol CreateCustomAttributesTable(MosaUnit unit)
        {
            // Emit custom attributes table
            var customAttributesTableSymbol = Linker.CreateSymbol(unit.FullName + Metadata.CustomAttributesTable, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0);
            var writer1 = new EndianAwareBinaryWriter(customAttributesTableSymbol.Stream, Architecture.Endianness);

            // 1. Number of Custom Attributes
            writer1.Write(unit.CustomAttributes.Count, TypeLayout.NativePointerSize);

            // 2. Pointers to Custom Attributes
            // Create the definitions along the way
            for (int i = 0; i < unit.CustomAttributes.Count; i++)
            {
                // Get custom attribute
                var ca = unit.CustomAttributes[i];

                // Build definition
                var customAttributeTableSymbol = CreateCustomAttribute(unit, ca, i);

                // Link
                Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributesTableSymbol, (int)writer1.Position, 0, customAttributeTableSymbol, 0);
                writer1.WriteZeroBytes(TypeLayout.NativePointerSize);
            }

            // Return customAttributesTableSymbol for linker usage
            return customAttributesTableSymbol;
        }
Пример #9
0
        private LinkerSymbol CreateCustomAttribute(MosaUnit unit, MosaCustomAttribute ca, int position)
        {
            // Emit custom attribute list
            string name = unit.FullName + ">>" + position.ToString() + ":" + ca.Constructor.DeclaringType.Name;
            var customAttributeSymbol = Linker.CreateSymbol(name + Metadata.CustomAttribute, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0);
            var writer1 = new EndianAwareBinaryWriter(customAttributeSymbol.Stream, Architecture.Endianness);

            // 1. Pointer to Attribute Type
            Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, (int)writer1.Position, 0, ca.Constructor.DeclaringType.FullName + Metadata.TypeDefinition, SectionKind.ROData, 0);
            writer1.WriteZeroBytes(TypeLayout.NativePointerSize);

            // 2. Pointer to Constructor Method Definition
            Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, (int)writer1.Position, 0, ca.Constructor.FullName + Metadata.MethodDefinition, SectionKind.ROData, 0);
            writer1.WriteZeroBytes(TypeLayout.NativePointerSize);

            // 3. Number of Arguments (Both unnamed and named)
            writer1.Write((uint)(ca.Arguments.Length + ca.NamedArguments.Length), TypeLayout.NativePointerSize);

            // 4. Pointers to Custom Attribute Arguments (Both unnamed and named)
            for (int i = 0; i < ca.Arguments.Length; i++)
            {
                // Build definition
                var customAttributeArgumentSymbol = CreateCustomAttributeArgument(name, i, null, ca.Arguments[i], false);

                // Link
                Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, (int)writer1.Position, 0, customAttributeArgumentSymbol, 0);
                writer1.WriteZeroBytes(TypeLayout.NativePointerSize);
            }

            foreach (var namedArg in ca.NamedArguments)
            {
                // Build definition
                var customAttributeArgumentSymbol = CreateCustomAttributeArgument(name, 0, namedArg.Name, namedArg.Argument, namedArg.IsField);

                // Link
                Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, (int)writer1.Position, 0, customAttributeArgumentSymbol, 0);
                writer1.WriteZeroBytes(TypeLayout.NativePointerSize);
            }

            // Return customAttributeSymbol for linker usage
            return customAttributeSymbol;
        }
Пример #10
0
        protected HashSet <MosaUnit> GetIncluded(string value, out MosaUnit selected)
        {
            selected = null;

            value = value.Trim();

            if (string.IsNullOrWhiteSpace(value))
            {
                return(null);
            }

            if (value.Length < 1)
            {
                return(null);
            }

            var include = new HashSet <MosaUnit>();

            MosaUnit typeSelected   = null;
            MosaUnit methodSelected = null;

            foreach (var type in Compiler.TypeSystem.AllTypes)
            {
                bool typeIncluded = false;

                var typeMatch = type.FullName.Contains(value);

                if (typeMatch)
                {
                    include.Add(type);
                    include.AddIfNew(type.Module);

                    if (typeSelected == null)
                    {
                        typeSelected = type;
                    }
                }

                foreach (var method in type.Methods)
                {
                    bool methodMatch = method.FullName.Contains(value);

                    if (typeMatch || methodMatch)
                    {
                        include.Add(method);
                        include.AddIfNew(type);
                        include.AddIfNew(type.Module);

                        if (methodMatch && methodSelected == null)
                        {
                            methodSelected = method;
                        }
                    }
                }

                foreach (var property in type.Properties)
                {
                    if (typeIncluded || property.FullName.Contains(value))
                    {
                        include.Add(property);
                        include.AddIfNew(type);
                        include.AddIfNew(type.Module);
                    }
                }
            }

            selected = methodSelected ?? typeSelected;

            return(include);
        }
Пример #11
0
        public void Resolve()
        {
            foreach (var unit in metadata.Loader.LoadedUnits)
            {
                if (unit is MosaType)
                {
                    MosaType type = (MosaType)unit;
                    using (var mosaType = metadata.Controller.MutateType(type))
                    {
                        TypeDef typeDef = type.GetUnderlyingObject <UnitDesc <TypeDef, TypeSig> >().Definition;

                        if (typeDef.BaseType != null)
                        {
                            mosaType.BaseType = metadata.Loader.GetType(typeDef.BaseType.ToTypeSig());
                        }

                        if (typeDef.DeclaringType != null)
                        {
                            mosaType.DeclaringType = metadata.Loader.GetType(typeDef.DeclaringType.ToTypeSig());
                        }

                        if (typeDef.IsEnum)
                        {
                            mosaType.ElementType = metadata.Loader.GetType(typeDef.GetEnumUnderlyingType());
                        }

                        foreach (var iface in typeDef.Interfaces)
                        {
                            mosaType.Interfaces.Add(metadata.Loader.GetType(iface.Interface.ToTypeSig()));
                        }

                        if (typeDef.BaseType != null)
                        {
                            ResolveInterfacesInBaseTypes(mosaType, type.BaseType);
                        }
                    }
                    ResolveType(type);
                }
                else if (unit is MosaField || unit is MosaMethod || unit is MosaModule || unit is MosaProperty)
                {
                    resolveQueue.Enqueue(unit);
                }
            }

            while (resolveQueue.Count > 0)
            {
                MosaUnit unit = resolveQueue.Dequeue();
                if (unit is MosaType)
                {
                    ResolveType((MosaType)unit);
                }
                if (unit is MosaField)
                {
                    ResolveField((MosaField)unit);
                }
                if (unit is MosaMethod)
                {
                    ResolveMethod((MosaMethod)unit);
                }
                if (unit is MosaProperty)
                {
                    ResolveProperty((MosaProperty)unit);
                }
                if (unit is MosaModule)
                {
                    MosaModule module = (MosaModule)unit;
                    using (var mosaModule = metadata.Controller.MutateModule(module))
                        ResolveCustomAttributes(mosaModule, module.GetUnderlyingObject <UnitDesc <ModuleDef, object> >().Definition);
                }
            }

            foreach (var module in metadata.Cache.Modules.Values)
            {
                ModuleDef moduleDef = module.GetUnderlyingObject <UnitDesc <ModuleDef, object> >().Definition;
                if (moduleDef.EntryPoint != null)
                {
                    using (var mosaModule = metadata.Controller.MutateModule(module))
                        mosaModule.EntryPoint = metadata.Cache.GetMethodByToken(new ScopedToken(moduleDef, moduleDef.EntryPoint.MDToken));
                }
            }

            while (arrayResolveQueue.Count > 0)
            {
                MosaType type = arrayResolveQueue.Dequeue();
                type.FinishSZArray();
            }
        }
Пример #12
0
 public void EnqueueForResolve(MosaUnit unit)
 {
     resolveQueue.Enqueue(unit);
 }
Пример #13
0
        private void ResolveCustomAttributes(MosaUnit.MutatorBase unit, IHasCustomAttribute obj)
        {
            // TODO: More detail parsing
            foreach (var attr in obj.CustomAttributes)
            {
                MosaType type = metadata.Loader.GetType(attr.AttributeType.ToTypeSig());
                MethodDef ctor = ((IMethodDefOrRef)attr.Constructor).ResolveMethod();
                MosaMethod mosaCtor = null;
                foreach (var method in type.Methods)
                {
                    var desc = method.GetUnderlyingObject<UnitDesc<MethodDef, MethodSig>>();
                    if (desc.Token.Token == ctor.MDToken)
                    {
                        mosaCtor = method;
                        break;
                    }
                }
                if (mosaCtor == null)
                    throw new AssemblyLoadException();

                object[] values = new object[attr.ConstructorArguments.Count];
                for (int i = 0; i < values.Length; i++)
                {
                    if (attr.ConstructorArguments[i].Value is UTF8String)
                        values[i] = ((UTF8String)attr.ConstructorArguments[i].Value).String;
                    else
                        values[i] = attr.ConstructorArguments[i].Value;
                }
                unit.CustomAttributes.Add(new MosaCustomAttribute(mosaCtor, values));
            }
        }