Example #1
0
        void DisassembleRecord(BamlContext ctx, BamlRecord record)
        {
            if (BamlNode.IsFooter(record))
            {
                while (scopeStack.Count > 0 && !BamlNode.IsMatch(scopeStack.Peek(), record))
                {
                    scopeStack.Pop();
                    output.Unindent();
                }
                if (scopeStack.Count > 0)
                {
                    scopeStack.Pop();
                    output.Unindent();
                }
            }

            output.WriteDefinition(record.Type.ToString(), BamlToolTipReference.Create(GetRecordReference(record)), TextTokenKind.Keyword, true);

            Action <BamlContext, BamlRecord> handler;

            if (handlerMap.TryGetValue(record.Type, out handler))
            {
                output.Write(" [", TextTokenKind.Text);
                handler(ctx, record);
                output.Write("]", TextTokenKind.Text);
            }

            output.WriteLine();

            if (BamlNode.IsHeader(record))
            {
                scopeStack.Push(record);
                output.Indent();
            }
        }
Example #2
0
        void DisassembleRecord(BamlContext ctx, TypeSerializerInfoRecord record)
        {
            DisassembleRecord(ctx, (TypeInfoRecord)record);

            WriteText(", SerializerTypeId=");
            WriteTypeId(ctx, record.SerializerTypeId);
        }
Example #3
0
        void DisassembleRecord(BamlContext ctx, BamlRecord record)
        {
            if (BamlNode.IsFooter(record))
            {
                while (scopeStack.Count > 0 && !BamlNode.IsMatch(scopeStack.Peek(), record))
                {
                    scopeStack.Pop();
                    output.DecreaseIndent();
                }
                if (scopeStack.Count > 0)
                {
                    scopeStack.Pop();
                    output.DecreaseIndent();
                }
            }

            output.Write(record.Type.ToString(), BamlToolTipReference.Create(GetRecordReference(record)), DecompilerReferenceFlags.Local | DecompilerReferenceFlags.Definition, BoxedTextColor.Keyword);

            if (handlerMap.TryGetValue(record.Type, out var handler))
            {
                output.Write(" [", BoxedTextColor.Text);
                handler(ctx, record);
                output.Write("]", BoxedTextColor.Text);
            }

            output.WriteLine();

            if (BamlNode.IsHeader(record))
            {
                scopeStack.Push(record);
                output.IncreaseIndent();
            }
        }
Example #4
0
        void DisassembleRecord(BamlContext ctx, PropertyWithConverterRecord record)
        {
            DisassembleRecord(ctx, (PropertyRecord)record);

            WriteText(", ConverterTypeId=");
            WriteTypeId(ctx, record.ConverterTypeId);
        }
Example #5
0
        void DisassembleRecord(BamlContext ctx, PropertyStringReferenceRecord record)
        {
            DisassembleRecord(ctx, (PropertyComplexStartRecord)record);

            WriteText(", StringId=");
            WriteStringId(ctx, record.StringId);
        }
Example #6
0
        public void Disassemble(ModuleDef module, BamlDocument document)
        {
            WriteText("Signature:      \t");
            WriteString(document.Signature);
            output.WriteLine();

            WriteText("Reader Version: \t");
            WriteVersion(document.ReaderVersion);
            output.WriteLine();

            WriteText("Updater Version:\t");
            WriteVersion(document.UpdaterVersion);
            output.WriteLine();

            WriteText("Writer Version: \t");
            WriteVersion(document.WriterVersion);
            output.WriteLine();

            WriteText("Record #:       \t");
            output.Write(document.Count.ToString(CultureInfo.InvariantCulture), BoxedTextColor.Number);
            output.WriteLine();

            output.WriteLine();

            var ctx = BamlContext.ConstructContext(module, document, token);

            scopeStack.Clear();
            foreach (var record in document)
            {
                token.ThrowIfCancellationRequested();
                DisassembleRecord(ctx, record);
            }
        }
Example #7
0
        void DisassembleRecord(BamlContext ctx, PropertyTypeReferenceRecord record)
        {
            DisassembleRecord(ctx, (PropertyComplexStartRecord)record);

            WriteText(", TypeId=");
            WriteTypeId(ctx, record.TypeId);
        }
Example #8
0
        void DisassembleRecord(BamlContext ctx, AttributeInfoRecord record)
        {
            WriteText("AttributeId=");
            WriteHexNumber(record.AttributeId);

            WriteText(", OwnerTypeId=");
            WriteTypeId(ctx, record.OwnerTypeId);

            WriteText(", AttributeUsage=");
            WriteHexNumber(record.AttributeUsage);

            string declType;

            if (record.OwnerTypeId > 0x7fff)
            {
                declType = ctx.KnownThings.Types((KnownTypes)(-record.OwnerTypeId)).FullName;
            }
            else if (ctx.TypeIdMap.ContainsKey(record.OwnerTypeId))
            {
                declType = ctx.TypeIdMap[record.OwnerTypeId].TypeFullName;
            }
            else
            {
                declType = $"(0x{record.OwnerTypeId:x4})";
            }
            var def = $"{IdentifierEscaper.Escape(declType)}::{IdentifierEscaper.Escape(record.Name)}";

            WriteText(", Name=");
            WriteDefinition(record.Name, def);
        }
Example #9
0
        void DisassembleRecord(BamlContext ctx, PropertyRecord record)
        {
            WriteText("AttributeId=");
            WriteAttributeId(ctx, record.AttributeId);

            WriteText(", Value=");
            WriteString(record.Value);
        }
Example #10
0
        void DisassembleRecord(BamlContext ctx, AssemblyInfoRecord record)
        {
            WriteText("AssemblyId=");
            WriteHexNumber(record.AssemblyId);

            WriteText(", AssemblyFullName=");
            WriteDefinition(record.AssemblyFullName);
        }
Example #11
0
        void DisassembleRecord(BamlContext ctx, PropertyWithStaticResourceIdRecord record)
        {
            WriteText("AttributeId=");
            WriteAttributeId(ctx, record.AttributeId);
            WriteText(", ");

            DisassembleRecord(ctx, (StaticResourceIdRecord)record);
        }
Example #12
0
        void DisassembleRecord(BamlContext ctx, StringInfoRecord record)
        {
            WriteText("StringId=");
            WriteHexNumber(record.StringId);

            WriteText(", Value=");
            WriteString(record.Value);
        }
Example #13
0
        void DisassembleRecord(BamlContext ctx, LineNumberAndPositionRecord record)
        {
            WriteText("LineNumber=");
            WriteHexNumber(record.LineNumber);

            WriteText(", LinePosition=");
            WriteHexNumber(record.LinePosition);
        }
Example #14
0
        void DisassembleRecord(BamlContext ctx, ElementStartRecord record)
        {
            WriteText("TypeId=");
            WriteTypeId(ctx, record.TypeId);

            WriteText(", Flags=");
            WriteHexNumber(record.Flags);
        }
Example #15
0
        void DisassembleRecord(BamlContext ctx, DefAttributeRecord record)
        {
            WriteText("Value=");
            WriteString(record.Value);

            WriteText(", NameId=");
            WriteStringId(ctx, record.NameId);
        }
Example #16
0
        void DisassembleRecord(BamlContext ctx, NamedElementStartRecord record)
        {
            WriteText("TypeId=");
            WriteTypeId(ctx, record.TypeId);

            WriteText(", RuntimeName=");
            WriteString(record.RuntimeName);
        }
Example #17
0
        void DisassembleRecord(BamlContext ctx, PropertyWithExtensionRecord record)
        {
            WriteText("AttributeId=");
            WriteAttributeId(ctx, record.AttributeId);

            WriteText(", Flags=");
            WriteHexNumber(record.Flags);

            WriteText(", ValueId=");
            WriteHexNumber(record.ValueId);
        }
Example #18
0
        void DisassembleRecord(BamlContext ctx, PIMappingRecord record)
        {
            WriteText("XmlNamespace=");
            WriteString(record.XmlNamespace);

            WriteText(", ClrNamespace=");
            WriteString(record.ClrNamespace);

            WriteText(", AssemblyId=");
            WriteAssemblyId(ctx, record.AssemblyId);
        }
Example #19
0
        void DisassembleRecord(BamlContext ctx, DocumentStartRecord record)
        {
            WriteText("LoadAsync=");
            WriteBool(record.LoadAsync);

            WriteText(", MaxAsyncRecords=");
            WriteHexNumber(record.MaxAsyncRecords);

            WriteText(", DebugBaml=");
            WriteBool(record.DebugBaml);
        }
Example #20
0
        void DisassembleRecord(BamlContext ctx, RoutedEventRecord record)
        {
            WriteText("Value=");
            WriteString(record.Value);

            WriteText(", AttributeId=");
            WriteAttributeId(ctx, record.AttributeId);

            WriteText(", Reserved1=");
            WriteHexNumber(record.Reserved1);
        }
Example #21
0
        void DisassembleRecord(BamlContext ctx, LiteralContentRecord record)
        {
            WriteText("Value=");
            WriteString(record.Value);

            WriteText(", Reserved0=");
            WriteHexNumber(record.Reserved0);

            WriteText(", Reserved1=");
            WriteHexNumber(record.Reserved1);
        }
Example #22
0
        void DisassembleRecord(BamlContext ctx, TypeInfoRecord record)
        {
            WriteText("TypeId=");
            WriteHexNumber(record.TypeId);

            WriteText(", AssemblyId=");
            WriteAssemblyId(ctx, record.AssemblyId);

            WriteText(", TypeFullName=");
            WriteDefinition(record.TypeFullName);
        }
Example #23
0
        void DisassembleRecord(BamlContext ctx, DefAttributeKeyTypeRecord record)
        {
            DisassembleRecord(ctx, (ElementStartRecord)record);

            WriteText(", Shared=");
            WriteBool(record.Shared);

            WriteText(", SharedSet=");
            WriteBool(record.SharedSet);

            WriteText(", Record=");
            WriteRecordRef(record.Record);
        }
Example #24
0
        public static XamlContext Construct(ModuleDef module, BamlDocument document, CancellationToken token)
        {
            var ctx = new XamlContext(module);

            ctx.CancellationToken = token;

            ctx.Baml     = BamlContext.ConstructContext(module, document, token);
            ctx.RootNode = BamlNode.Parse(document, token);

            ctx.BuildPIMappings(document);
            ctx.BuildNodeMap(ctx.RootNode as BamlBlockNode, new RecursionCounter());

            return(ctx);
        }
Example #25
0
        void DisassembleRecord(BamlContext ctx, DefAttributeKeyStringRecord record)
        {
            WriteText("ValueId=");
            WriteStringId(ctx, record.ValueId);

            WriteText(", Shared=");
            WriteBool(record.Shared);

            WriteText(", SharedSet=");
            WriteBool(record.SharedSet);

            WriteText(", Record=");
            WriteRecordRef(record.Record);
        }
Example #26
0
        void DisassembleRecord(BamlContext ctx, PropertyCustomRecord record)
        {
            WriteText("AttributeId=");
            WriteAttributeId(ctx, record.AttributeId);

            WriteText(", SerializerTypeId=");
            WriteTypeId(ctx, record.SerializerTypeId);

            WriteText(", Data=");
            for (int i = 0; i < record.Data.Length; i++)
            {
                output.Write(record.Data[i].ToString("x2"), BoxedTextColor.String);
            }
        }
Example #27
0
        public static XamlContext Construct(IDecompilerTypeSystem typeSystem, BamlDocument document, CancellationToken token, BamlDecompilerOptions bamlDecompilerOptions)
        {
            var ctx = new XamlContext(typeSystem);

            ctx.CancellationToken     = token;
            ctx.BamlDecompilerOptions = bamlDecompilerOptions ?? new BamlDecompilerOptions();

            ctx.Baml     = BamlContext.ConstructContext(typeSystem, document, token);
            ctx.RootNode = BamlNode.Parse(document, token);

            ctx.BuildPIMappings(document);
            ctx.BuildNodeMap(ctx.RootNode as BamlBlockNode);

            return(ctx);
        }
Example #28
0
        void WriteAssemblyId(BamlContext ctx, ushort id)
        {
            string reference;

            if (id == 0xffff)
            {
                reference = ctx.KnownThings.FrameworkAssembly.FullName;
            }
            else if (ctx.AssemblyIdMap.ContainsKey(id))
            {
                reference = ctx.AssemblyIdMap[id].AssemblyFullName;
            }
            else
            {
                reference = null;
            }
            output.WriteReference(string.Format("0x{0:x4}", id), BamlToolTipReference.Create(reference), TextTokenKind.Number, true);
        }
Example #29
0
        void WriteAssemblyId(BamlContext ctx, ushort id)
        {
            string reference;

            if (id == 0xffff)
            {
                reference = ctx.KnownThings.FrameworkAssembly.FullName;
            }
            else if (ctx.AssemblyIdMap.ContainsKey(id))
            {
                reference = ctx.AssemblyIdMap[id].AssemblyFullName;
            }
            else
            {
                reference = null;
            }
            output.Write($"0x{id:x4}", BamlToolTipReference.Create(reference), DecompilerReferenceFlags.Local, BoxedTextColor.Number);
        }
Example #30
0
        void DisassembleRecord(BamlContext ctx, OptimizedStaticResourceRecord record)
        {
            WriteText("Flags=");
            WriteHexNumber(record.Flags);

            WriteText(", ValueId=");
            if (record.IsType)
            {
                WriteTypeId(ctx, record.ValueId);
            }
            else if (record.IsStatic)
            {
                WriteAttributeId(ctx, record.ValueId);
            }
            else
            {
                WriteStringId(ctx, record.ValueId);
            }
        }