Beispiel #1
0
        public DisassemblyContentProvider Create()
        {
            var blocks            = BlockFactory.Create(bitness, this.blocks);
            var cachedSymResolver = new CachedSymbolResolver();

            if (symbolResolver is not null)
            {
                var addresses = GetPossibleSymbolAddresses(blocks);
                if (addresses.Length != 0)
                {
                    var symbolResolverResults = new SymbolResolverResult[addresses.Length];
                    symbolResolver.Resolve(addresses, symbolResolverResults);
                    cachedSymResolver.AddSymbols(addresses, symbolResolverResults, fakeSymbol: false);
                }
            }
            foreach (var block in blocks)
            {
                if (!string2.IsNullOrEmpty(block.Label))
                {
                    cachedSymResolver.AddSymbol(block.Address, new SymbolResolverResult(SymbolKindUtils.ToSymbolKind(block.LabelKind), block.Label, block.Address), fakeSymbol: true);
                }
            }
            return(new DisassemblyContentProviderImpl(bitness, cachedSymResolver, deps.DisasmSettings, deps.MasmSettings, deps.NasmSettings, deps.GasSettings, formatterOptions, header, optimization, blocks, codeInfo, variableInfo, methodName, shortMethodName, moduleName));
        }
Beispiel #2
0
 public bool TryGetSymbol(int operand, int instructionOperand, ref Instruction instruction, ulong address, int addressSize, out SymbolResult symbol)
 {
     if (owner.cachedSymbolResolver.TryResolve(address, out var symResult, out bool fakeSymbol))
     {
         if (!fakeSymbol || owner.AddLabels)
         {
             symbol = new SymbolResult(symResult.Address, symResult.Symbol, SymbolKindUtils.ToFormatterOutputTextKind(symResult.Kind), SymbolFlags.None);
             if (instruction.OpCount == 1 && (instruction.Op0Kind == OpKind.Memory || instruction.Op0Kind == OpKind.Memory64))
             {
                 var code = instruction.Code;
                 if (code == Code.Call_rm32 || code == Code.Jmp_rm32)
                 {
                     symbol = new SymbolResult(symbol.Address, symbol.Text, symbol.Flags, MemorySize.DwordOffset);
                 }
                 else if (code == Code.Call_rm64 || code == Code.Jmp_rm64)
                 {
                     symbol = new SymbolResult(symbol.Address, symbol.Text, symbol.Flags, MemorySize.QwordOffset);
                 }
             }
             return(true);
         }
     }
     symbol = default;
     return(false);
 }