private void AddEntry(IDiaSession session, IDiaEnumSymbolsByAddr symbolsByAddr, ulong eip, uint rva) { session.findSymbolByRVA(rva, SymTagEnum.SymTagPublicSymbol, out var symbol); if (symbol == null) { session.findSymbolByRVA(rva, SymTagEnum.SymTagFunction, out symbol); if (symbol == null) { symbol = symbolsByAddr.symbolByRVA(rva); } } string functionName; if (symbol != null) { symbol.get_undecoratedNameEx(0x1000, out var unmangled); if (!string.IsNullOrEmpty(unmangled)) { functionName = unmangled; } else { functionName = !string.IsNullOrEmpty(symbol.name) ? symbol.name : eip.ToString("x"); } } else { functionName = eip.ToString("x"); } this.rvaToFunctionNameMap.Add(rva, functionName); }
void IDiaSession.getSymbolsByAddr(out IDiaEnumSymbolsByAddr ppEnumbyAddr) { dynamic typ = null; if (!Dia3.StructCache.ContainsKey(loadAddress.ToString("x"))) { var json = SymAPI.FromAddress(loadAddress.ToString("x"), CV); typ = JsonConvert.DeserializeObject <SymNameInfo>(json.Result); Dia3.StructCache.TryAdd(loadAddress.ToString("x"), typ); } Dia3.StructCache.TryGetValue(loadAddress.ToString("x"), out typ); ppEnumbyAddr = new EnumSymbols(CV, EnumSymType.ByAddr, typ); return; }