示例#1
0
		CorModuleDefFile FindDynamic(DnModule dnModule) {
			if (dnModule == null)
				return null;
			var mod = dnModule.GetOrCreateCorModuleDef();
			return AllCorModuleDefFiles.FirstOrDefault(a => a.ModuleDef == mod);
		}
示例#2
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 manifestFile = FindAssemblyByKey(manifestKey);
				var manifestNode = DnSpyFileListTreeNode.FindAssemblyNode(manifestFile);
				if (manifestNode != null) {
					var cmdf = (CorModuleDefFile)manifestFile;
					var moduleKey = CorModuleDefFile.CreateKey(module);
					manifestNode.EnsureChildrenFiltered();
					Debug.Assert(manifestNode.Children.Count >= 1);
					var moduleNode = manifestNode.Children.OfType<AssemblyTreeNode>().FirstOrDefault(a => moduleKey.Equals(a.DnSpyFile.Key));
					Debug.Assert(moduleNode == null);
					if (moduleNode == null) {
						var newFile = new CorModuleDefFile(cmdf.Dictionary, module, UseDebugSymbols);
						UpdateResolver(module.GetOrCreateCorModuleDef());
						cmdf.Dictionary.Add(newFile.ModuleDef, newFile);
						Initialize(new[] { newFile.DnModule.CorModuleDef });
						manifestNode.Children.Add(new AssemblyTreeNode(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 manifestFile = FindAssemblyByKey(manifestKey);
				var manifestNode = DnSpyFileListTreeNode.FindAssemblyNode(manifestFile);
				if (manifestNode != null) {
					var mmdf = (MemoryModuleDefFile)manifestFile;
					var moduleKey = MemoryModuleDefFile.CreateKey(module.Process, module.Address);
					manifestNode.EnsureChildrenFiltered();
					Debug.Assert(manifestNode.Children.Count >= 1);
					var moduleNode = manifestNode.Children.OfType<AssemblyTreeNode>().FirstOrDefault(a => moduleKey.Equals(a.DnSpyFile.Key));
					Debug.Assert(moduleNode == null);
					if (moduleNode == null) {
						MemoryModuleDefFile newFile = null;
						try {
							newFile = MemoryModuleDefFile.Create(mmdf.Dictionary, module, UseDebugSymbols);
						}
						catch {
						}

						Debug.Assert(newFile != null);
						if (newFile != null) {
							UpdateResolver(newFile.ModuleDef);
							mmdf.Dictionary.Add(newFile.ModuleDef, newFile);
							manifestNode.DnSpyFile.ModuleDef.Assembly.Modules.Add(newFile.ModuleDef);
							manifestNode.Children.Add(new AssemblyTreeNode(newFile));
						}
					}
				}
			}
		}
示例#3
0
		public CorModuleDefFile(Dictionary<ModuleDef, CorModuleDefFile> dict, DnModule dnModule, bool loadSyms)
			: base(dnModule.GetOrCreateCorModuleDef(), loadSyms) {
			this.dict = dict;
			this.dnModule = dnModule;
			this.lastValidRids = new LastValidRids();
		}
示例#4
0
		public CorModuleDefFile(DnModule dnModule, bool loadSyms)
			: base(dnModule.GetOrCreateCorModuleDef(), loadSyms) {
			this.dnModule = dnModule;
			this.lastValidRids = new LastValidRids();
		}
		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 = documentTreeView.FindNode(asmFile) as AssemblyDocumentNode;
				if (asmNode != null) {
					var cmdf = (CorModuleDefFile)asmNode.Document;
					var moduleKey = CorModuleDefFile.CreateKey(module);
					asmNode.TreeNode.EnsureChildrenLoaded();
					Debug.Assert(asmNode.TreeNode.Children.Count >= 1);
					var moduleNode = asmNode.TreeNode.DataChildren.OfType<ModuleDocumentNode>().FirstOrDefault(a => moduleKey.Equals(a.Document.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(documentTreeView.TreeView.Create(documentTreeView.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 = documentTreeView.FindNode(asmFile) as AssemblyDocumentNode;
				if (asmNode != null) {
					var mmdf = (MemoryModuleDefFile)asmNode.Document;
					var moduleKey = MemoryModuleDefFile.CreateKey(module.Process, module.Address);
					asmNode.TreeNode.EnsureChildrenLoaded();
					Debug.Assert(asmNode.TreeNode.Children.Count >= 1);
					var moduleNode = asmNode.TreeNode.DataChildren.OfType<ModuleDocumentNode>().FirstOrDefault(a => moduleKey.Equals(a.Document.Key));
					Debug.Assert(moduleNode == null);
					if (moduleNode == null) {
						MemoryModuleDefFile newFile = null;
						try {
							newFile = MemoryModuleDefFile.Create(simpleProcessReader, module, UseDebugSymbols);
						}
						catch {
						}

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