Пример #1
0
        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);
            }
        }
Пример #2
0
 /// <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;
 }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        public void FindPdbNegativeTest()
        {
            SymbolLocator _locator = GetLocator();
            string        pdb      = _locator.FindPdb(WellKnownNativePdb, WellKnownNativePdbGuid, WellKnownNativePdbAge + 1);

            Assert.Null(pdb);
        }
Пример #6
0
        public void FindBinaryNegativeTest()
        {
            SymbolLocator _locator = GetLocator();
            string        dac      = _locator.FindBinary(WellKnownDac, WellKnownDacTimeStamp + 1, WellKnownDacImageSize + 1, false);

            Assert.Null(dac);
        }
Пример #7
0
        public void FindBinaryTest()
        {
            SymbolLocator _locator = GetLocator();
            string        dac      = _locator.FindBinary(WellKnownDac, WellKnownDacTimeStamp, WellKnownDacImageSize, false);

            Assert.NotNull(dac);
            Assert.True(File.Exists(dac));
        }
Пример #8
0
        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));
        }
Пример #9
0
        /// <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()));
        }
Пример #10
0
        public void SymbolLocatorTimeoutTest()
        {
            SymbolLocator locator = GetLocator();

            locator.Timeout      = 10000;
            locator.SymbolCache += "\\TestTimeout";

            string pdb = locator.FindPdb(WellKnownNativePdb, WellKnownNativePdbGuid, WellKnownNativePdbAge);

            Assert.NotNull(pdb);
        }
Пример #11
0
        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)));
        }
Пример #12
0
        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);
            }
        }
Пример #13
0
        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);
            }
        }
Пример #14
0
        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);
        }
Пример #15
0
        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);
        }
Пример #16
0
        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"));
            }
        }
Пример #17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ClrMdSymbolLocator"/> class.
 /// </summary>
 public ClrMdSymbolLocator(Process process, SymbolLocator symbolLocator)
 {
     Process = process;
     OriginalSymbolLocator = symbolLocator;
 }