Example #1
0
        IDnSpyFile LoadDynamic(DnModule dnModule, bool canLoadDynFile)
        {
            var file = FindDynamic(dnModule);

            if (file != null)
            {
                return(file);
            }

            if (dnModule.Debugger.ProcessState != DebuggerProcessState.Stopped)
            {
                return(null);
            }
            if (!canLoadDynFile)
            {
                return(null);
            }

            var manifestDnModule = dnModule.Assembly.Modules[0];
            var manifestKey      = CorModuleDefFile.CreateKey(manifestDnModule);
            var manMod           = FindAssemblyByKey(manifestKey);

            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            manMod = FindDynamic(manifestDnModule);
            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            var modules = manifestDnModule.Assembly.Modules;
            var dict    = new Dictionary <ModuleDef, CorModuleDefFile>(modules.Length);
            var files   = new List <CorModuleDefFile>(modules.Length);

            foreach (var module in modules)
            {
                UpdateResolver(module.GetOrCreateCorModuleDef());
                var newFile = new CorModuleDefFile(module, UseDebugSymbols);
                dict.Add(module.GetOrCreateCorModuleDef(), newFile);
                files.Add(newFile);
            }
            Debug.Assert(files.Count != 0);
            Initialize(dnModule.Debugger, dict.Select(a => a.Value.DnModule.CorModuleDef));

            var asmFile   = CorModuleDefFile.CreateAssembly(files);
            var addedFile = fileManager.GetOrAdd(asmFile);

            Debug.Assert(addedFile == asmFile);

            return(dict[dnModule.CorModuleDef]);
        }
Example #2
0
        DnSpyFile LoadDynamic(DnModule dnModule, bool canLoadDynFile)
        {
            var file = FindDynamic(dnModule);

            if (file != null)
            {
                return(file);
            }

            if (DebugManager.Instance.ProcessState != DebuggerProcessState.Stopped)
            {
                return(null);
            }
            if (!canLoadDynFile)
            {
                return(null);
            }

            var manifestDnModule = dnModule.Assembly.Modules[0];
            var manifestKey      = CorModuleDefFile.CreateKey(manifestDnModule);
            var manMod           = FindAssemblyByKey(manifestKey);

            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            manMod = FindDynamic(manifestDnModule);
            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            var modules = manifestDnModule.Assembly.Modules;
            var dict    = new Dictionary <ModuleDef, CorModuleDefFile>(modules.Length);

            foreach (var module in modules)
            {
                UpdateResolver(module.GetOrCreateCorModuleDef());
                dict.Add(module.GetOrCreateCorModuleDef(), new CorModuleDefFile(dict, module, UseDebugSymbols));
            }
            Initialize(dict.Select(a => a.Value.DnModule.CorModuleDef));

            manMod = dict[manifestDnModule.CorModuleDef];
            DnSpyFileList.AddFile(manMod, true, true, false);

            return(dict[dnModule.CorModuleDef]);
        }
Example #3
0
        void OnModuleAdded(DnModule module)
        {
            // If an assembly is visible in the treeview, and a new netmodule gets added, add a
            // new netmodule node to the assembly in the treeview.

            var manifestModule = module.Assembly.Modules[0];

            // If it's the manifest module, it can't possibly have been inserted in the treeview already
            if (manifestModule == module)
            {
                return;
            }

            // Update a dynamic assembly, if one exists
            {
                var manifestKey = CorModuleDefFile.CreateKey(manifestModule);
                var asmFile     = FindAssemblyByKey(manifestKey);
                var asmNode     = fileTreeView.FindNode(asmFile) as IAssemblyFileNode;
                if (asmNode != null)
                {
                    var cmdf      = (CorModuleDefFile)asmNode.DnSpyFile;
                    var moduleKey = CorModuleDefFile.CreateKey(module);
                    asmNode.TreeNode.EnsureChildrenLoaded();
                    Debug.Assert(asmNode.TreeNode.Children.Count >= 1);
                    var moduleNode = asmNode.TreeNode.DataChildren.OfType <IModuleFileNode>().FirstOrDefault(a => moduleKey.Equals(a.DnSpyFile.Key));
                    Debug.Assert(moduleNode == null);
                    if (moduleNode == null)
                    {
                        var newFile = new CorModuleDefFile(module, UseDebugSymbols);
                        UpdateResolver(module.GetOrCreateCorModuleDef());
                        cmdf.Children.Add(newFile);
                        Initialize(module.Debugger, new[] { newFile.DnModule.CorModuleDef });
                        asmNode.TreeNode.Children.Add(fileTreeView.TreeView.Create(fileTreeView.CreateNode(asmNode, newFile)));
                    }
                }
            }

            // Update an in-memory assembly, if one exists
            if (manifestModule.Address != 0 && module.Address != 0)
            {
                var manifestKey = MemoryModuleDefFile.CreateKey(manifestModule.Process, manifestModule.Address);
                var asmFile     = FindAssemblyByKey(manifestKey);
                var asmNode     = fileTreeView.FindNode(asmFile) as IAssemblyFileNode;
                if (asmNode != null)
                {
                    var mmdf      = (MemoryModuleDefFile)asmNode.DnSpyFile;
                    var moduleKey = MemoryModuleDefFile.CreateKey(module.Process, module.Address);
                    asmNode.TreeNode.EnsureChildrenLoaded();
                    Debug.Assert(asmNode.TreeNode.Children.Count >= 1);
                    var moduleNode = asmNode.TreeNode.DataChildren.OfType <IModuleFileNode>().FirstOrDefault(a => moduleKey.Equals(a.DnSpyFile.Key));
                    Debug.Assert(moduleNode == null);
                    if (moduleNode == null)
                    {
                        MemoryModuleDefFile newFile = null;
                        try {
                            newFile = MemoryModuleDefFile.Create(module, UseDebugSymbols);
                        }
                        catch {
                        }

                        Debug.Assert(newFile != null);
                        if (newFile != null)
                        {
                            UpdateResolver(newFile.ModuleDef);
                            mmdf.Children.Add(newFile);
                            asmNode.DnSpyFile.ModuleDef.Assembly.Modules.Add(newFile.ModuleDef);
                            asmNode.TreeNode.Children.Add(fileTreeView.TreeView.Create(fileTreeView.CreateNode(asmNode, newFile)));
                        }
                    }
                }
            }
        }