Exemplo n.º 1
0
        public void PostRename(ConfuserContext context, INameService service, ProtectionParameters parameters, IDnlibDef def)
        {
            var module = def as ModuleDefMD;

            if (module == null)
            {
                return;
            }

            var wpfResInfo = context.Annotations.Get <Dictionary <string, Dictionary <string, BamlDocument> > >(module, BAMLKey);

            if (wpfResInfo == null)
            {
                return;
            }

            foreach (var res in module.Resources.OfType <EmbeddedResource>())
            {
                Dictionary <string, BamlDocument> resInfo;

                if (!wpfResInfo.TryGetValue(res.Name, out resInfo))
                {
                    continue;
                }

                var stream = new MemoryStream();
                var writer = new ResourceWriter(stream);

                res.Data.Position = 0;
                var reader     = new ResourceReader(new ImageStream(res.Data));
                var enumerator = reader.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    var    name = (string)enumerator.Key;
                    string typeName;
                    byte[] data;
                    reader.GetResourceData(name, out typeName, out data);

                    BamlDocument document;
                    if (resInfo.TryGetValue(name, out document))
                    {
                        var docStream = new MemoryStream();
                        docStream.Position = 4;
                        BamlWriter.WriteDocument(document, docStream);
                        docStream.Position = 0;
                        docStream.Write(BitConverter.GetBytes((int)docStream.Length - 4), 0, 4);
                        data = docStream.ToArray();
                        name = document.DocumentName;
                    }

                    writer.AddResourceData(name, typeName, data);
                }
                writer.Generate();
                res.Data = MemoryImageStream.Create(stream.ToArray());
            }
        }
Exemplo n.º 2
0
        public static byte[] ToResourceBytes(BamlDocument document)
        {
            using (var targetStream = new MemoryStream())
            {
                BamlWriter.WriteDocument(document, targetStream);
                targetStream.Position = 0;

                return(BitConverter.GetBytes((int)targetStream.Length).Concat(targetStream.ToArray()).ToArray());
            }
        }
Exemplo n.º 3
0
        private void WriteDocuments(List <BamlDocument> documents)
        {
            var indexedDocuments = documents.ToDictionary(x => x.DocumentName);
            var newResources     = new List <EmbeddedResource>();

            foreach (var resource in Module.Resources.OfType <EmbeddedResource>())
            {
                using (var stream = new MemoryStream()) {
                    using (var resourceWriter = new ResourceWriter(stream)) {
                        using (var resourceStream = resource.CreateReader().AsStream()) {
                            using (var resourceReader = new ResourceReader(resourceStream)) {
                                var enumerator = resourceReader.GetEnumerator();
                                while (enumerator.MoveNext())
                                {
                                    var name = (string)enumerator.Key;

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

                                    if (indexedDocuments.TryGetValue(name, out var document))
                                    {
                                        using (var documentStream = new MemoryStream()) {
                                            documentStream.Position = 4;
                                            BamlWriter.WriteDocument(document, documentStream);
                                            documentStream.Position = 0;
                                            documentStream.Write(BitConverter.GetBytes((int)documentStream.Length - 4), 0, 4);
                                            data = documentStream.ToArray();
                                        }
                                    }

                                    resourceWriter.AddResourceData(name, typeName, data);
                                }
                            }
                        }

                        resourceWriter.Generate();
                        newResources.Add(new EmbeddedResource(resource.Name, stream.ToArray(), resource.Attributes));
                    }
                }
            }

            foreach (var resource in newResources)
            {
                var index = Module.Resources.IndexOfEmbeddedResource(resource.Name);

                Module.Resources[index] = resource;
            }
        }
Exemplo n.º 4
0
        public void UpdateReference(Identifier old, Identifier @new)
        {
            EmbeddedResource res = mod.Resources[resId] as EmbeddedResource;

            foreach (KeyValuePair <string, BamlDocument> pair in (res as IAnnotationProvider).Annotations["Gbamls"] as Dictionary <string, BamlDocument> )
            {
                Stream dst = new MemoryStream();
                BamlWriter.WriteDocument(pair.Value, dst);
                ((res as IAnnotationProvider).Annotations["Gresources"] as Dictionary <string, object>)[pair.Key] = dst;
            }
            MemoryStream   newRes = new MemoryStream();
            ResourceWriter wtr    = new ResourceWriter(newRes);

            foreach (KeyValuePair <string, object> pair in (res as IAnnotationProvider).Annotations["Gresources"] as Dictionary <string, object> )
            {
                wtr.AddResource(pair.Key, pair.Value);
            }
            wtr.Generate();
            mod.Resources[resId] = new EmbeddedResource(res.Name, res.Attributes, newRes.ToArray());
        }
Exemplo n.º 5
0
        private EmbeddedResource ReloadResource(EmbeddedResource resource)
        {
            ResourceReader reader;

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

            MemoryStream   m      = new MemoryStream();
            ResourceWriter writer = new ResourceWriter(m);

            var e = reader.GetEnumerator();

            while (e.MoveNext())
            {
                if (BamlFiles.ContainsKey(e.Key.ToString()))
                {
                    //MARK:AF 3E 00 00
                    using var ms = new MemoryStream();
                    BamlWriter.WriteDocument(BamlFiles[e.Key.ToString()], ms);
                    writer.AddResource(e.Key.ToString(), ms.ToArray());
                }
                else
                {
                    writer.AddResource(e.Key.ToString(), e.Value);
                }
            }

            //writer.AddResource(e.Key.ToString(), e.Value);
            writer.Generate();
            EmbeddedResource embedded = new EmbeddedResource(resource.Name, m.ToArray());

            writer.Close();
            return(embedded);
        }