public async Task FindPdbAsyncTest() { SymbolLocator _locator = GetLocator(); Task <string> first = _locator.FindPdbAsync(WellKnownNativePdb, WellKnownNativePdbGuid, WellKnownNativePdbAge); List <Task <string> > tasks = new List <Task <string> >(); for (int i = 0; i < 10; i++) { tasks.Add(_locator.FindPdbAsync(WellKnownNativePdb, WellKnownNativePdbGuid, WellKnownNativePdbAge)); } string pdb = await first; Assert.NotNull(pdb); Assert.True(File.Exists(pdb)); Assert.True(PdbMatches(pdb, WellKnownNativePdbGuid, WellKnownNativePdbAge)); // Ensure we got the same answer for everything. foreach (var task in tasks) { string taskPdb = await task; Assert.Equal(taskPdb, pdb); } }
/// <summary> /// Initializes a new instance of the <see cref="SymbolLocatorAdapter" /> class. /// </summary> /// <param name="locator">The locator.</param> /// <exception cref="ArgumentNullException">locator</exception> /// <inheritdoc /> public SymbolLocatorAdapter(IConverter converter, SymbolLocator locator) : base(converter) { Locator = locator ?? throw new ArgumentNullException(nameof(locator)); SymbolCache = Locator.SymbolCache; SymbolPath = Locator.SymbolPath; Timeout = Locator.Timeout; }
public async Task FindBinaryAsyncTest() { SymbolLocator _locator = GetLocator(); Task <string> first = _locator.FindBinaryAsync(WellKnownDac, WellKnownDacTimeStamp, WellKnownDacImageSize, false); List <Task <string> > tasks = new List <Task <string> >(); for (int i = 0; i < 10; i++) { tasks.Add(_locator.FindBinaryAsync(WellKnownDac, WellKnownDacTimeStamp, WellKnownDacImageSize, false)); } string dac = await first; Assert.NotNull(dac); Assert.True(File.Exists(dac)); new PEFile(dac).Dispose(); // This will throw if the image is invalid. // Ensure we got the same answer for everything. foreach (var task in tasks) { string taskDac = await task; Assert.Equal(dac, taskDac); } }
public async Task FindBinaryAsyncTest() { SymbolLocator _locator = GetLocator(); Task <string> first = _locator.FindBinaryAsync(WellKnownDac, WellKnownDacTimeStamp, WellKnownDacImageSize, false); List <Task <string> > tasks = new List <Task <string> >(); for (int i = 0; i < 10; i++) { tasks.Add(_locator.FindBinaryAsync(WellKnownDac, WellKnownDacTimeStamp, WellKnownDacImageSize, false)); } string dac = await first; Assert.NotNull(dac); Assert.True(File.Exists(dac)); using (Stream stream = File.OpenRead(dac)) { PEImage peimage = new PEImage(stream); Assert.True(peimage.IsValid); } // Ensure we got the same answer for everything. foreach (Task <string> task in tasks) { string taskDac = await task; Assert.Equal(dac, taskDac); } }
public void FindPdbNegativeTest() { SymbolLocator _locator = GetLocator(); string pdb = _locator.FindPdb(WellKnownNativePdb, WellKnownNativePdbGuid, WellKnownNativePdbAge + 1); Assert.Null(pdb); }
public void FindBinaryNegativeTest() { SymbolLocator _locator = GetLocator(); string dac = _locator.FindBinary(WellKnownDac, WellKnownDacTimeStamp + 1, WellKnownDacImageSize + 1, false); Assert.Null(dac); }
public void FindBinaryTest() { SymbolLocator _locator = GetLocator(); string dac = _locator.FindBinary(WellKnownDac, WellKnownDacTimeStamp, WellKnownDacImageSize, false); Assert.NotNull(dac); Assert.True(File.Exists(dac)); }
public void FindPdbTest() { SymbolLocator _locator = GetLocator(); string pdb = _locator.FindPdb(WellKnownNativePdb, WellKnownNativePdbGuid, WellKnownNativePdbAge); Assert.NotNull(pdb); Assert.True(File.Exists(pdb)); Assert.True(PdbMatches(pdb, WellKnownNativePdbGuid, WellKnownNativePdbAge)); }
/// <summary> /// Converts the specified locator. /// </summary> /// <param name="locator">The locator.</param> /// <returns>ISymbolLocator.</returns> public ISymbolLocator Convert(SymbolLocator locator) { if (locator == null) { return(null); } var item = new SymbolLocatorAdapter(this, locator); return(Cache.GetOrAdd <ISymbolLocator>(locator, () => item, () => item.Setup())); }
public void SymbolLocatorTimeoutTest() { SymbolLocator locator = GetLocator(); locator.Timeout = 10000; locator.SymbolCache += "\\TestTimeout"; string pdb = locator.FindPdb(WellKnownNativePdb, WellKnownNativePdbGuid, WellKnownNativePdbAge); Assert.NotNull(pdb); }
internal override string ResolveSymbol(ulong addr) { ModuleInfo module = FindModule(addr); if (module == null) { return(null); } SymbolModule sym = SymbolLocator.LoadPdb(module); if (sym == null) { return(null); } return(sym.FindNameForRva((uint)(addr - module.ImageBase))); }
public async Task FindPdbAsyncNegativeTest() { SymbolLocator _locator = GetLocator(); List <Task <string> > tasks = new List <Task <string> >(); for (int i = 0; i < 10; i++) { tasks.Add(_locator.FindPdbAsync(WellKnownNativePdb, WellKnownNativePdbGuid, WellKnownNativePdbAge + 1)); } // Ensure we got the same answer for everything. foreach (var task in tasks) { string pdb = await task; Assert.Null(pdb); } }
public async Task FindBinaryAsyncNegativeTest() { SymbolLocator _locator = GetLocator(); List <Task <string> > tasks = new List <Task <string> >(); for (int i = 0; i < 10; i++) { tasks.Add(_locator.FindBinaryAsync(WellKnownDac, WellKnownDacTimeStamp + 1, WellKnownDacImageSize + 1, false)); } // Ensure we got the same answer for everything. foreach (var task in tasks) { string dac = await task; Assert.Null(dac); } }
private static PdbReader GetReaderForFrame(ClrStackFrame frame) { ClrModule module = frame.Method?.Type?.Module; PdbInfo info = module?.Pdb; PdbReader reader = null; if (info != null) { if (!s_pdbReaders.TryGetValue(info, out reader)) { SymbolLocator locator = GetSymbolLocator(module); string pdbPath = locator.FindPdb(info); if (pdbPath != null) { reader = new PdbReader(pdbPath); } s_pdbReaders[info] = reader; } } return(reader); }
private static PdbReader GetReaderForMethod(ClrMethod method) { ClrModule module = method?.Type?.Module; PdbInfo info = module?.Pdb; PdbReader reader = null; if (info != null) { if (!s_pdbReaders.TryGetValue(info, out reader)) { SymbolLocator locator = GetSymbolLocator(module); string pdbPath = locator.FindPdb(info); if (pdbPath != null) { try { reader = new PdbReader(pdbPath); } catch (IOException) { // This will typically happen when trying to load information // from public symbols, or symbol files generated by some weird // compiler. We can ignore this, but there's no need to load // this PDB anymore, so we will put null in the dictionary and // be done with it. reader = null; } } s_pdbReaders[info] = reader; } } return(reader); }
internal static void Run() { var exe = Program.GetExeFile(); var data = File.ReadAllBytes(exe.FullName); var mem = new BufferMemoryReader(data); var version = FileVersionInfo.GetVersionInfo(exe.FullName).FileVersion; PE = new PEHeaderReader(data); var symbols = SymbolLocator.FindAll(data, mem); uint containerManager; var dir = new DirectoryInfo("enigma-d3-memory-" + new Version(version.Replace(", ", "."))); dir.Create(); var objPtrs = new Dictionary <string, uint>(); objPtrs.Add("SNOGroups", symbols.BestMatch("SnoGroups")); objPtrs.Add("SNOGroupsByCode", symbols.BestMatch("SnoGroupsByCode")); objPtrs.Add("AttributeDescriptors", symbols.BestMatch("AttributeDescriptors")); objPtrs.Add("MessageDescriptor", symbols.BestMatch("MessageDescriptor")); objPtrs.Add("LocalData", symbols.BestMatch("LocalData")); objPtrs.Add("ContainerManager", containerManager = symbols.BestMatch("ContainerManager")); objPtrs.Add("ApplicationLoopCount", symbols.BestMatch("ApplicationLoopCount")); objPtrs.Add("ObjectManager", symbols.BestMatch("ObjectManager")); objPtrs.Add("ObjectManagerPristine", symbols.BestMatch("ObjectManagerPristine")); objPtrs.Add("MapActId", symbols.BestMatch("MapActId")); objPtrs.Add("VideoPreferences", symbols.BestMatch("VideoPreferences")); objPtrs.Add("SoundPreferences", symbols.BestMatch("SoundPreferences")); objPtrs.Add("GameplayPreferences", symbols.BestMatch("GameplayPreferences")); objPtrs.Add("SocialPreferences", symbols.BestMatch("SocialPreferences")); objPtrs.Add("ChatPreferences", symbols.BestMatch("ChatPreferences")); objPtrs.Add("HotkeyPreferences", objPtrs["SoundPreferences"] == 0 ? 0 : objPtrs["SoundPreferences"] + 0x50); objPtrs.Add("LevelArea", GetStatic_LevelArea(data, symbols)); objPtrs.Add("LevelAreaName", GetStatic_LevelAreaName(data, symbols)); WriteObjectPtrFile(Path.Combine(dir.FullName, "ObjectPtr.cs"), objPtrs); var methodPtrs = new Dictionary <string, uint>(); methodPtrs.Add("SNOGroups_Initialize", TranslateToVA(symbols.BestMatch("CSnoGroups::Initialize"))); methodPtrs.Add("GameMessage_GetHandlerInfo", TranslateToVA(symbols.BestMatch("CGameMessage::GetHandlerInfo"))); WriteMethodPtrFile(Path.Combine(dir.FullName, "MethodPtr.cs"), methodPtrs); var globals = new Dictionary <string, string>(); globals.Add("static readonly Version SupportedVersion", $"new Version({version})"); globals.Add("const int SNOGroupsCount", "60"); // TODO: Don't hardcode. globals.Add("const int AttributeDescriptorsCount", GetAttributeDescriptorsCount(symbols).ToString()); var sizeof_playerdata = symbols.BestMatch("sizeof(PlayerData)"); // ((symbols.BestMatch("sizeof(PlayerDataManager)") - 0x038) / 8); globals.Add("const int SizeOf_PlayerData", sizeof_playerdata.ToHex()); if (Engine.Current?.ProcessVersion == Engine.SupportedVersion) { globals.Add("const int Offset_PlayerData_HeroName", GetOffset_PlayerData_HeroName(sizeof_playerdata).ToHex()); globals.Add("const int Offset_PlayerData_LifePercentage", GetOffset_PlayerData_LifePercentage(sizeof_playerdata).ToHex()); } else { globals.Add("const int Offset_PlayerData_HeroName", "0; // Run [CodeGen -memory -deploy] again"); globals.Add("const int Offset_PlayerData_LifePercentage", "0; // Run [CodeGen -memory -deploy] again"); } // TODO: globals.Add("const int SizeOf_LevelArea", symbols.BestMatch("sizeof(LevelArea)").ToHex()); WriteGlobalsFile(Path.Combine(dir.FullName, "Globals.cs"), globals); var project = new SharedProject("862a67ee-9ceb-42fe-9406-d7feafc55b00", "Enigma.D3.Memory"); project.AddCompileFile(Path.Combine(dir.FullName, "Globals.cs")); project.AddCompileFile(Path.Combine(dir.FullName, "MethodPtr.cs")); project.AddCompileFile(Path.Combine(dir.FullName, "ObjectPtr.cs")); project.Save(Path.Combine(dir.FullName, "Enigma.D3.Memory.Generated.*")); if (Program.DeployGeneratedCode) { project.Deploy( dir, Program.SolutionDirectory.CreateSubdirectory(project.RootNamespace + ".Generated")); } }
/// <summary> /// Initializes a new instance of the <see cref="ClrMdSymbolLocator"/> class. /// </summary> public ClrMdSymbolLocator(Process process, SymbolLocator symbolLocator) { Process = process; OriginalSymbolLocator = symbolLocator; }