IDnSpyFile LoadFromMemory(DnModule dnModule, bool canLoadDynFile) { Debug.Assert(!dnModule.IsDynamic); if (dnModule.Address == 0) { return(null); } var file = FindMemory(dnModule); if (file != null) { return(file); } var manifestDnModule = dnModule.Assembly.Modules[0]; var manifestKey = MemoryModuleDefFile.CreateKey(manifestDnModule.Process, manifestDnModule.Address); var manMod = FindAssemblyByKey(manifestKey); Debug.Assert(manMod == null); if (manMod != null) { return(null); } manMod = FindMemory(manifestDnModule); Debug.Assert(manMod == null); if (manMod != null) { return(null); } var modules = manifestDnModule.Assembly.Modules; var dict = new Dictionary <ModuleDef, MemoryModuleDefFile>(modules.Length); var files = new List <MemoryModuleDefFile>(modules.Length); MemoryModuleDefFile result = null; foreach (var module in modules) { MemoryModuleDefFile mfile; try { mfile = MemoryModuleDefFile.Create(module, UseDebugSymbols); UpdateResolver(mfile.ModuleDef); if (module == dnModule) { result = mfile; } } catch { // The PE headers and/or .NET headers are probably corrupt return(LoadDynamic(dnModule, canLoadDynFile)); } files.Add(mfile); dict.Add(mfile.ModuleDef, mfile); } Debug.Assert(result != null); if (files.Count == 0) { return(null); } var asmFile = MemoryModuleDefFile.CreateAssembly(files); var asm = files[0].AssemblyDef; if (asm == null) { if (files.Count > 1) { asm = files[0].ModuleDef.UpdateRowId(new AssemblyDefUser("???")); asm.Modules.Add(files[0].ModuleDef); } } asm.Modules.Clear(); for (int i = 0; i < files.Count; i++) { asm.Modules.Add(files[i].ModuleDef); } var addedFile = fileManager.GetOrAdd(asmFile); Debug.Assert(addedFile == asmFile); return(result); }
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))); } } } } }