示例#1
0
        public override bool View(DecompilerTextView textView)
        {
            AvalonEditTextOutput    output       = new AvalonEditTextOutput();
            IHighlightingDefinition highlighting = null;
            var lang = MainWindow.Instance.CurrentLanguage;

            textView.RunWithCancellation(
                token => Task.Factory.StartNew(
                    () => {
                try {
                    bamlData.Position = 0;
                    var document      = BamlReader.ReadDocument(bamlData, token);
                    if (BamlSettings.Instance.DisassembleBaml)
                    {
                        Disassemble(module, document, lang, output, out highlighting, token);
                    }
                    else
                    {
                        Decompile(module, document, lang, output, out highlighting, token);
                    }
                }
                catch (Exception ex) {
                    output.Write(ex.ToString(), TextTokenType.Text);
                }
                return(output);
            }, token)
                ).Then(t => textView.ShowNode(t, this, highlighting)).HandleExceptions();
            return(true);
        }
示例#2
0
        private void ParseResource(EmbeddedResource resource)
        {
            ResourceReader reader;

            try
            {
                reader = new ResourceReader(resource.CreateReader().AsStream());
            }
            catch (ArgumentException)
            {
                Console.WriteLine("This resource can not be parsed.");
                //throw;
                return;
            }

            var e = reader.GetEnumerator();

            while (e.MoveNext())
            {
                if (e.Key.ToString().ToLower().EndsWith(".baml"))
                {
                    reader.GetResourceData(e.Key.ToString(), out _, out var contents);

                    //MARK:AF 3E 00 00
                    contents = contents.Skip(4).ToArray(); //MARK:the first 4 bytes = length
                    using (var ms = new MemoryStream(contents))
                    {
                        BamlDocument b = BamlReader.ReadDocument(ms);
                        BamlFiles.TryAdd(e.Key.ToString(), b);
                    }
                }
            }
        }
示例#3
0
        public ResourcePart(DictionaryEntry entry)
        {
            name   = (string)entry.Key;
            stream = (Stream)entry.Value;

            if (Path.GetExtension(name) != ".baml")
            {
                return;
            }

            baml            = BamlReader.ReadDocument(stream);
            stream.Position = 0;

            foreach (BamlRecord record in baml)
            {
                if (record.Type == BamlRecordType.TypeInfo)
                {
                    TypeInfoRecord typeInfo = (TypeInfoRecord)record;

                    typeName = typeInfo.TypeFullName;
                    break;
                }

                if (record.Type == BamlRecordType.ElementStart)
                {
                    break;
                }
            }
        }
示例#4
0
 public static BamlDocument FromResourceBytes(byte[] rawResourceData)
 {
     byte[] streamBytes = rawResourceData.Skip(4).ToArray();
     using (var bamlStream = new MemoryStream(streamBytes))
     {
         return(BamlReader.ReadDocument(bamlStream));
     }
 }
示例#5
0
        private static BamlDocument GetResourceBamlDocument(string filename)
        {
            Application.ResourceAssembly = Assembly.GetExecutingAssembly();

            var streamInfo           = Application.GetResourceStream(new Uri("/Resources/BamlGeneration/GenericXaml/" + filename, UriKind.Relative));
            var expectedBamlDocument = BamlReader.ReadDocument(streamInfo.Stream);

            return(expectedBamlDocument);
        }
示例#6
0
        internal static XDocument LoadIntoDocument(PEFile module, IAssemblyResolver assemblyResolver,
                                                   Stream stream, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            var document = BamlReader.ReadDocument(stream, cancellationToken);
            var xaml     = new XamlDecompiler().Decompile(new BamlDecompilerTypeSystem(module, assemblyResolver), document, cancellationToken, new BamlDecompilerOptions(), null);

            return(xaml);
        }
示例#7
0
        public IList <string> Decompile(ModuleDef module, byte[] data, CancellationToken token, BamlDecompilerOptions bamlDecompilerOptions, Stream output, XamlOutputOptions outputOptions)
        {
            var doc     = BamlReader.ReadDocument(new MemoryStream(data), token);
            var asmRefs = new List <string>();
            var xaml    = new XamlDecompiler().Decompile(module, doc, token, bamlDecompilerOptions, asmRefs);
            var resData = Encoding.UTF8.GetBytes(new XamlOutputCreator(outputOptions).CreateText(xaml));

            output.Write(resData, 0, resData.Length);
            return(asmRefs);
        }
示例#8
0
        public static ResourceDictionary ReadCommonThemes()
        {
            var sri = Application.GetResourceStream(
                new Uri("/Iris.Desktop.UI;component/CommonThemes.xaml", UriKind.Relative));

            if (sri != null)
            {
                return((ResourceDictionary)BamlReader.Load(sri.Stream));
            }
            return(new ResourceDictionary());
        }
示例#9
0
        public string Decompile(IDecompilerOutput output, CancellationToken token)
        {
            var lang     = Context.Decompiler;
            var document = BamlReader.ReadDocument(new MemoryStream(bamlData), token);

            if (bamlSettings.DisassembleBaml)
            {
                Disassemble(module, document, output, token);
                return(ContentTypes.BamlDnSpy);
            }
            else
            {
                Decompile(module, document, lang, output, token);
                return(ContentTypes.Xaml);
            }
        }
示例#10
0
        public DocumentTreeNodeData Create(ModuleDef module, ResourceElement resourceElement, ITreeNodeGroup treeNodeGroup)
        {
            if (resourceElement.ResourceData.Code != ResourceTypeCode.ByteArray && resourceElement.ResourceData.Code != ResourceTypeCode.Stream)
            {
                return(null);
            }

            var data = (byte[])((BuiltInResourceData)resourceElement.ResourceData).Data;

            if (!BamlReader.IsBamlHeader(new MemoryStream(data)))
            {
                return(null);
            }

            return(new BamlResourceElementNode(module, resourceElement, data, treeNodeGroup, bamlSettings, xamlOutputOptionsProvider, documentWriterService));
        }
示例#11
0
        public IResourceElementNode Create(ModuleDef module, ResourceElement resourceElement, ITreeNodeGroup treeNodeGroup)
        {
            if (resourceElement.ResourceData.Code != ResourceTypeCode.ByteArray && resourceElement.ResourceData.Code != ResourceTypeCode.Stream)
            {
                return(null);
            }

            var data = (byte[])((BuiltInResourceData)resourceElement.ResourceData).Data;

            if (!BamlReader.IsBamlHeader(new MemoryStream(data)))
            {
                return(null);
            }

            return(new BamlResourceElementNode(module, resourceElement, data, treeNodeGroup, bamlSettings));
        }
示例#12
0
        public string Decompile(ITextOutput output, CancellationToken token)
        {
            string ext      = null;
            var    lang     = Context.Language;
            var    document = BamlReader.ReadDocument(new MemoryStream(bamlData), token);

            if (bamlSettings.DisassembleBaml)
            {
                Disassemble(module, document, lang, output, out ext, token);
            }
            else
            {
                Decompile(module, document, lang, output, out ext, token);
            }
            return(ext);
        }
示例#13
0
        private List <BamlDocument> ReadDocuments()
        {
            var documents = new List <BamlDocument>();

            foreach (var resource in Module.Resources.OfType <EmbeddedResource>())
            {
                var match = ResourceNamePattern.Match(resource.Name);
                if (!match.Success)
                {
                    continue;
                }

                using (var resourceStream = resource.CreateReader().AsStream()) {
                    using (var resourceReader = new ResourceReader(resourceStream)) {
                        var enumerator = resourceReader.GetEnumerator();
                        while (enumerator.MoveNext())
                        {
                            var name = (string)enumerator.Key;
                            if (!name.EndsWith(".baml"))
                            {
                                continue;
                            }

                            resourceReader.GetResourceData(name, out var typeName, out var data);

                            using (var bamlStream = new MemoryStream(data, 4, data.Length - 4)) {
                                var document = BamlReader.ReadDocument(bamlStream);
                                document.DocumentName = name;

                                documents.Add(document);
                            }
                        }
                    }
                }
            }

            return(documents);
        }
示例#14
0
        public BamlDecompilationResult Decompile(Stream stream)
        {
            var ct       = CancellationToken;
            var document = BamlReader.ReadDocument(stream, ct);
            var ctx      = XamlContext.Construct(typeSystem, document, ct, settings);

            var handler = HandlerMap.LookupHandler(ctx.RootNode.Type);
            var elem    = handler.Translate(ctx, ctx.RootNode, null);

            var xaml = new XDocument();

            xaml.Add(elem.Xaml.Element);

            foreach (var pass in rewritePasses)
            {
                ct.ThrowIfCancellationRequested();
                pass.Run(ctx, xaml);
            }

            var assemblyReferences = ctx.Baml.AssemblyIdMap.Select(a => a.Value.AssemblyFullName);

            return(new BamlDecompilationResult(xaml, assemblyReferences));
        }
示例#15
0
        //-----------------------------
        // private  methods
        //-----------------------------
        /// <summary>
        /// build the baml element tree as well as the localizability inheritance tree
        /// </summary>
        /// <param name="bamlSteam">input baml stream.</param>
        /// <returns>the tree constructed.</returns>
        private BamlTree LoadBamlImp(Stream bamlSteam)
        {
            _reader = new BamlReader(bamlSteam);
            _reader.Read();

            if (_reader.NodeType != BamlNodeType.StartDocument)
            {
                throw new XamlParseException(SR.Get(SRID.InvalidStartOfBaml));
            }

            // create root element.
            _root = new BamlStartDocumentNode();
            PushNodeToStack(_root);

            // A hash table used to handle duplicate properties within an element
            Hashtable propertyOccurrences = new Hashtable(8);

            // create the tree by depth first traversal.
            while (_bamlTreeStack.Count > 0 && _reader.Read())
            {
                switch (_reader.NodeType)
                {
                case BamlNodeType.StartElement:
                {
                    BamlTreeNode bamlNode = new BamlStartElementNode(
                        _reader.AssemblyName,
                        _reader.Name,
                        _reader.IsInjected,
                        _reader.CreateUsingTypeConverter
                        );
                    PushNodeToStack(bamlNode);
                    break;
                }

                case BamlNodeType.EndElement:
                {
                    BamlTreeNode bamlNode = new BamlEndElementNode();
                    AddChildToCurrentParent(bamlNode);
                    PopStack();
                    break;
                }

                case BamlNodeType.StartComplexProperty:
                {
                    BamlStartComplexPropertyNode bamlNode = new BamlStartComplexPropertyNode(
                        _reader.AssemblyName,
                        _reader.Name.Substring(0, _reader.Name.LastIndexOf('.')),
                        _reader.LocalName
                        );

                    bamlNode.LocalizabilityAncestor = PeekPropertyStack(bamlNode.PropertyName);
                    PushPropertyToStack(bamlNode.PropertyName, (ILocalizabilityInheritable)bamlNode);
                    PushNodeToStack(bamlNode);
                    break;
                }

                case BamlNodeType.EndComplexProperty:
                {
                    BamlTreeNode bamlNode = new BamlEndComplexPropertyNode();
                    AddChildToCurrentParent(bamlNode);
                    PopStack();
                    break;
                }

                case BamlNodeType.Event:
                {
                    BamlTreeNode bamlNode = new BamlEventNode(_reader.Name, _reader.Value);
                    AddChildToCurrentParent(bamlNode);
                    break;
                }

                case BamlNodeType.RoutedEvent:
                {
                    BamlTreeNode bamlNode = new BamlRoutedEventNode(
                        _reader.AssemblyName,
                        _reader.Name.Substring(0, _reader.Name.LastIndexOf('.')),
                        _reader.LocalName,
                        _reader.Value
                        );
                    AddChildToCurrentParent(bamlNode);
                    break;
                }

                case BamlNodeType.PIMapping:
                {
                    BamlTreeNode bamlNode = new BamlPIMappingNode(
                        _reader.XmlNamespace,
                        _reader.ClrNamespace,
                        _reader.AssemblyName
                        );
                    AddChildToCurrentParent(bamlNode);
                    break;
                }

                case BamlNodeType.LiteralContent:
                {
                    BamlTreeNode bamlNode = new BamlLiteralContentNode(_reader.Value);
                    AddChildToCurrentParent(bamlNode);
                    break;
                }

                case BamlNodeType.Text:
                {
                    BamlTreeNode bamlNode = new BamlTextNode(
                        _reader.Value,
                        _reader.TypeConverterAssemblyName,
                        _reader.TypeConverterName
                        );

                    AddChildToCurrentParent(bamlNode);
                    break;
                }

                case BamlNodeType.StartConstructor:
                {
                    BamlTreeNode bamlNode = new BamlStartConstructorNode();
                    AddChildToCurrentParent(bamlNode);
                    break;
                }

                case BamlNodeType.EndConstructor:
                {
                    BamlTreeNode bamlNode = new BamlEndConstructorNode();
                    AddChildToCurrentParent(bamlNode);
                    break;
                }

                case BamlNodeType.EndDocument:
                {
                    BamlTreeNode bamlNode = new BamlEndDocumentNode();
                    AddChildToCurrentParent(bamlNode);
                    PopStack();
                    break;
                }

                default:
                {
                    throw new XamlParseException(SR.Get(SRID.UnRecognizedBamlNodeType, _reader.NodeType));
                }
                }

                // read properties if it has any.
                if (_reader.HasProperties)
                {
                    // The Hashtable is used to auto-number repeated properties. The usage is as the following:
                    // When encountering the 1st occurrence of the property, it stores a reference to the property's node (BamlTreeNode).
                    // When encountering the property the 2nd time, we start auto-numbering the property including the 1st occurrence
                    // and store the index count (int) in the slot from that point onwards.
                    propertyOccurrences.Clear();

                    _reader.MoveToFirstProperty();
                    do
                    {
                        switch (_reader.NodeType)
                        {
                        case BamlNodeType.ConnectionId:
                        {
                            BamlTreeNode bamlNode = new BamlConnectionIdNode(_reader.ConnectionId);
                            AddChildToCurrentParent(bamlNode);
                            break;
                        }

                        case BamlNodeType.Property:
                        {
                            BamlPropertyNode bamlNode = new BamlPropertyNode(
                                _reader.AssemblyName,
                                _reader.Name.Substring(0, _reader.Name.LastIndexOf('.')),
                                _reader.LocalName,
                                _reader.Value,
                                _reader.AttributeUsage
                                );

                            bamlNode.LocalizabilityAncestor = PeekPropertyStack(bamlNode.PropertyName);
                            PushPropertyToStack(bamlNode.PropertyName, (ILocalizabilityInheritable)bamlNode);

                            AddChildToCurrentParent(bamlNode);

                            if (propertyOccurrences.Contains(_reader.Name))
                            {
                                // we autonumber properties that have occurrences larger than 1
                                object occurrence = propertyOccurrences[_reader.Name];
                                int    index      = 2;
                                if (occurrence is BamlPropertyNode)
                                {
                                    // start numbering this property as the 2nd occurrence is encountered
                                    // the value stores the 1st occurrence of the property at this point
                                    ((BamlPropertyNode)occurrence).Index = 1;
                                }
                                else
                                {
                                    // For the 3rd or more occurrences, the value stores the next index
                                    // to assign to the property
                                    index = (int)occurrence;
                                }

                                // auto-number the current property node
                                ((BamlPropertyNode)bamlNode).Index = index;
                                propertyOccurrences[_reader.Name]  = ++index;
                            }
                            else
                            {
                                // store the first occurrence of the property
                                propertyOccurrences[_reader.Name] = bamlNode;
                            }

                            break;
                        }

                        case BamlNodeType.DefAttribute:
                        {
                            if (_reader.Name == XamlReaderHelper.DefinitionUid)
                            {
                                // set the Uid proeprty when we see it.
                                ((BamlStartElementNode)_currentParent).Uid = _reader.Value;
                            }

                            BamlTreeNode bamlNode = new BamlDefAttributeNode(
                                _reader.Name,
                                _reader.Value
                                );
                            AddChildToCurrentParent(bamlNode);
                            break;
                        }

                        case BamlNodeType.XmlnsProperty:
                        {
                            BamlTreeNode bamlNode = new BamlXmlnsPropertyNode(
                                _reader.LocalName,
                                _reader.Value
                                );
                            AddChildToCurrentParent(bamlNode);
                            break;
                        }

                        case BamlNodeType.ContentProperty:
                        {
                            BamlTreeNode bamlNode = new BamlContentPropertyNode(
                                _reader.AssemblyName,
                                _reader.Name.Substring(0, _reader.Name.LastIndexOf('.')),
                                _reader.LocalName
                                );

                            AddChildToCurrentParent(bamlNode);
                            break;
                        }

                        case BamlNodeType.PresentationOptionsAttribute:
                        {
                            BamlTreeNode bamlNode = new BamlPresentationOptionsAttributeNode(
                                _reader.Name,
                                _reader.Value
                                );
                            AddChildToCurrentParent(bamlNode);
                            break;
                        }

                        default:
                        {
                            throw new XamlParseException(SR.Get(SRID.UnRecognizedBamlNodeType, _reader.NodeType));
                        }
                        }
                    } while (_reader.MoveToNextProperty());
                }
            }

            // At this point, the baml tree stack should be completely unwinded and also nothing more to read.
            if (_reader.Read() || _bamlTreeStack.Count > 0)
            {
                throw new XamlParseException(SR.Get(SRID.InvalidEndOfBaml));
            }

            return(new BamlTree(_root, _nodeCount));
            //notice that we don't close the input stream because we don't own it.
        }
示例#16
0
        private void ProcessBaml(ModuleDefinition mod, Dictionary <string, BamlDocument> bamls, ref int cc, DictionaryEntry entry, Stream stream)
        {
            cc++;
            docName = entry.Key as string;
            doc     = BamlReader.ReadDocument(stream);
            (mod as IAnnotationProvider).Annotations[RenMode] = NameMode.Letters;

            for (int i = 0; i < doc.Count; i++)
            {
                if (doc[i] is LineNumberAndPositionRecord || doc[i] is LinePositionRecord)
                {
                    doc.RemoveAt(i); i--;
                }
            }

            int asmId = -1;
            Dictionary <ushort, AssemblyDefinition> asms = new Dictionary <ushort, AssemblyDefinition>();

            foreach (var rec in doc.OfType <AssemblyInfoRecord>())
            {
                AssemblyNameReference nameRef = AssemblyNameReference.Parse(rec.AssemblyFullName);
                if (nameRef.Name == mod.Assembly.Name.Name)
                {
                    asmId = rec.AssemblyId;
                    rec.AssemblyFullName = GetBamlAssemblyFullName(mod.Assembly.Name);
                    asms.Add(rec.AssemblyId, mod.Assembly);
                    PopulateMembers(mod.Assembly);
                    nameRef = null;
                }
                else
                {
                    bool added = false;
                    foreach (var i in ivtMap)
                    {
                        if (i.Key.Name.Name == nameRef.Name)
                        {
                            rec.AssemblyFullName = GetBamlAssemblyFullName(i.Key.Name);
                            asms.Add(rec.AssemblyId, i.Key);
                            PopulateMembers(i.Key);
                            nameRef = null;
                            added   = true;
                            break;
                        }
                    }
                    if (!added)
                    {
                        var asmRefDef = GlobalAssemblyResolver.Instance.Resolve(nameRef);
                        if (asmRefDef != null)
                        {
                            PopulateMembers(asmRefDef);
                        }
                    }
                }
            }

            Dictionary <ushort, TypeDefinition> types = new Dictionary <ushort, TypeDefinition>();

            foreach (var rec in doc.OfType <TypeInfoRecord>())
            {
                AssemblyDefinition asm;
                if (asms.TryGetValue((ushort)(rec.AssemblyId & 0xfff), out asm))
                {
                    TypeReference type = TypeParser.ParseType(asm.MainModule, rec.TypeFullName);
                    if (type != null)
                    {
                        types.Add(rec.TypeId, type.Resolve());
                        AddTypeRenRefs(type, type, rec);
                        rec.TypeFullName = TypeParser.ToParseable(type);
                    }
                }
            }

            Dictionary <string, string> xmlns = new Dictionary <string, string>();

            foreach (var rec in doc.OfType <XmlnsPropertyRecord>())
            {
                xmlns[rec.Prefix] = rec.XmlNamespace;
            }

            Dictionary <ushort, string> ps = new Dictionary <ushort, string>();

            foreach (var rec in doc.OfType <AttributeInfoRecord>())
            {
                if (types.ContainsKey(rec.OwnerTypeId))
                {
                    PropertyDefinition prop = types[rec.OwnerTypeId].Properties.SingleOrDefault(p => p.Name == rec.Name);
                    if (prop != null)
                    {
                        ((prop as IAnnotationProvider).Annotations[RenRef] as List <IReference>).Add(new BamlAttributeReference(rec));
                    }
                    EventDefinition evt = types[rec.OwnerTypeId].Events.SingleOrDefault(p => p.Name == rec.Name);
                    if (evt != null)
                    {
                        ((evt as IAnnotationProvider).Annotations[RenRef] as List <IReference>).Add(new BamlAttributeReference(rec));
                    }
                    FieldDefinition field = types[rec.OwnerTypeId].Fields.SingleOrDefault(p => p.Name == rec.Name);
                    if (field != null)
                    {
                        ((field as IAnnotationProvider).Annotations[RenRef] as List <IReference>).Add(new BamlAttributeReference(rec));
                    }

                    //Attached property
                    MethodDefinition getM = types[rec.OwnerTypeId].Methods.SingleOrDefault(p => p.Name == "Get" + rec.Name);
                    if (getM != null)
                    {
                        (getM as IAnnotationProvider).Annotations[RenOk] = false;
                    }
                    MethodDefinition setM = types[rec.OwnerTypeId].Methods.SingleOrDefault(p => p.Name == "Set" + rec.Name);
                    if (setM != null)
                    {
                        (setM as IAnnotationProvider).Annotations[RenOk] = false;
                    }
                }
                ps.Add(rec.AttributeId, rec.Name);
            }

            foreach (var rec in doc.OfType <PropertyWithConverterRecord>())
            {
                if (rec.ConverterTypeId == 0xfd4c || ((short)rec.AttributeId > 0 && ps[rec.AttributeId] == "TypeName"))  //TypeExtension
                {
                    string type = rec.Value;

                    string xmlNamespace;
                    if (type.IndexOf(':') != -1)
                    {
                        xmlNamespace = xmlns[type.Substring(0, type.IndexOf(':'))];
                        type         = type.Substring(type.IndexOf(':') + 1, type.Length - type.IndexOf(':') - 1);
                    }
                    else
                    {
                        xmlNamespace = xmlns[""];
                    }
                    TypeDefinition typeDef;
                    if ((typeDef = ResolveXmlns(xmlNamespace, type, mod.Assembly, asms.Values)) != null)
                    {
                        ((typeDef as IAnnotationProvider).Annotations[RenRef] as List <IReference>).Add(new BamlTypeExtReference(rec, doc, typeDef.Module.Assembly.Name.Name));
                    }
                }
                if (rec.ConverterTypeId == 0xff77 || rec.ConverterTypeId == 0xfe14 || rec.ConverterTypeId == 0xfd99)
                {
                    ProcessProperty(rec, rec.Value);
                }
            }

            for (int i = 1; i < doc.Count; i++)
            {
                ElementStartRecord binding             = doc[i - 1] as ElementStartRecord;
                ConstructorParametersStartRecord param = doc[i] as ConstructorParametersStartRecord;
                if (binding != null && param != null && binding.TypeId == 0xffec)//Binding
                {
                    TextRecord path = doc[i + 1] as TextRecord;
                    ProcessProperty(path, path.Value);
                }
            }

            var rootRec = doc.OfType <ElementStartRecord>().FirstOrDefault();

            if (rootRec != null && types.ContainsKey(rootRec.TypeId))
            {
                TypeDefinition root = types[rootRec.TypeId];
                Dictionary <string, IMemberDefinition> m = new Dictionary <string, IMemberDefinition>();
                foreach (PropertyDefinition prop in root.Properties)
                {
                    m.Add(prop.Name, prop);
                }
                foreach (EventDefinition evt in root.Events)
                {
                    m.Add(evt.Name, evt);
                }
                //foreach (MethodDefinition mtd in root.Methods)
                //    mems.Add(mtd.Name, mtd);

                foreach (var rec in doc.OfType <PropertyRecord>())
                {
                    if (!(rec.Value is string))
                    {
                        continue;
                    }
                    if (m.ContainsKey((string)rec.Value))
                    {
                        ((m[(string)rec.Value] as IAnnotationProvider).Annotations[RenRef] as List <IReference>).Add(new BamlPropertyReference(rec));
                    }
                }
            }

            bamls.Add(entry.Key as string, doc);
        }
示例#17
0
        void AnalysisResource(ModuleDefinition mod, int resId)
        {
            EmbeddedResource                  res    = mod.Resources[resId] as EmbeddedResource;
            ResourceReader                    resRdr = new ResourceReader(res.GetResourceStream());
            Dictionary <string, object>       ress;
            Dictionary <string, BamlDocument> bamls;

            (res as IAnnotationProvider).Annotations["Gresources"] = ress = new Dictionary <string, object>();
            (res as IAnnotationProvider).Annotations["Gbamls"]     = bamls = new Dictionary <string, BamlDocument>();
            int cc = 0;

            foreach (DictionaryEntry entry in resRdr)
            {
                Stream stream = null;
                if (entry.Value is Stream)
                {
                    byte[] buff = new byte[(entry.Value as Stream).Length];
                    (entry.Value as Stream).Position = 0;
                    (entry.Value as Stream).Read(buff, 0, buff.Length);
                    ress.Add(entry.Key as string, stream = new MemoryStream(buff));
                }
                else
                {
                    ress.Add(entry.Key as string, entry.Value);
                }
                if (stream != null && (entry.Key as string).EndsWith(".baml"))
                {
                    BamlDocument doc = BamlReader.ReadDocument(stream);
                    int          c   = 0;

                    int asmId = -1;
                    foreach (var rec in doc.OfType <AssemblyInfoRecord>())
                    {
                        if (AssemblyNameReference.Parse(rec.AssemblyFullName).Name == mod.Assembly.Name.Name)
                        {
                            asmId = rec.AssemblyId;
                        }
                    }
                    Dictionary <ushort, TypeDefinition> types = new Dictionary <ushort, TypeDefinition>();
                    foreach (var rec in doc.OfType <TypeInfoRecord>())
                    {
                        if ((rec.AssemblyId & 0xfff) == asmId)
                        {
                            TypeDefinition type = mod.GetType(rec.TypeFullName);
                            if (type != null)
                            {
                                types.Add(rec.TypeId, type);
                                ((type as IAnnotationProvider).Annotations["RenRef"] as List <IReference>).Add(new BamlTypeReference(rec));
                                c++; cc++;
                            }
                        }
                    }

                    Dictionary <ushort, PropertyDefinition> ps = new Dictionary <ushort, PropertyDefinition>();
                    foreach (var rec in doc.OfType <AttributeInfoRecord>())
                    {
                        if (types.ContainsKey(rec.OwnerTypeId))
                        {
                            PropertyDefinition prop = types[rec.OwnerTypeId].Properties.FirstOrDefault(p => p.Name == rec.Name);
                            if (prop != null && types[rec.OwnerTypeId].Fields.FirstOrDefault(fld => fld.Name == prop.Name + "Property") == null)
                            {
                                ((prop as IAnnotationProvider).Annotations["RenRef"] as List <IReference>).Add(new BamlAttributeReference(rec));
                                c++; cc++;
                            }
                        }
                    }
                    var rootRec = doc.OfType <ElementStartRecord>().FirstOrDefault();
                    if (rootRec != null && types.ContainsKey(rootRec.TypeId))
                    {
                        TypeDefinition root = types[rootRec.TypeId];
                        Dictionary <string, IMemberDefinition> mems = new Dictionary <string, IMemberDefinition>();
                        foreach (PropertyDefinition prop in root.Properties)
                        {
                            mems.Add(prop.Name, prop);
                        }
                        foreach (EventDefinition evt in root.Events)
                        {
                            mems.Add(evt.Name, evt);
                        }
                        foreach (MethodDefinition mtd in root.Methods)
                        {
                            mems.Add(mtd.Name, mtd);
                        }

                        foreach (var rec in doc.OfType <PropertyRecord>())
                        {
                            if (!(rec.Value is string))
                            {
                                continue;
                            }
                            if (mems.ContainsKey((string)rec.Value))
                            {
                                ((mems[(string)rec.Value] as IAnnotationProvider).Annotations["RenRef"] as List <IReference>).Add(new BamlPropertyReference(rec));
                                c++; cc++;
                            }
                        }
                    }

                    if (c != 0)
                    {
                        bamls.Add(entry.Key as string, doc);
                    }
                }
            }
            if (cc != 0)
            {
                ((res as IAnnotationProvider).Annotations["RenRef"] as List <IReference>).Add(new SaveBamlsReference(mod, resId));
            }
        }