IDnSpyFile GetDocumentFile(IDnSpyFile file)
        {
            var dnFile = file as IDnSpyDotNetFile;

            if (dnFile != null)
            {
                // Assemblies and manifest modules don't share a IDnSpyFile instance, but we must
                // use the same IUndoObject instance since they're part of the same file.
                var module = file.ModuleDef;
                Debug.Assert(module != null);
                if (module == null)
                {
                    throw new InvalidOperationException();
                }
                var modFile = FindModule(module);
                Debug.Assert(modFile != null);
                if (modFile == null)
                {
                    throw new InvalidOperationException();
                }
                return(modFile);
            }

            return(file);
        }
        IUndoObject GetUndoObjectNoChecks(IDnSpyFile file)
        {
            var uo = file.Annotation <UndoObject>() ?? file.AddAnnotation(new UndoObject());

            uo.Value = file;
            return(uo);
        }
Exemple #3
0
		public static bool GoToIL(IFileTabManager fileTabManager, IDnSpyFile file, uint token, uint ilOffset, bool newTab) {
			if (file == null)
				return false;

			var method = file.ModuleDef.ResolveToken(token) as MethodDef;
			if (method == null)
				return false;

			var serMod = SerializedDnModuleCreator.Create(fileTabManager.FileTreeView,  method.Module);
			var key = new SerializedDnToken(serMod, method.MDToken);

			bool found = fileTabManager.FileTreeView.FindNode(method.Module) != null;
			if (found) {
				fileTabManager.FollowReference(method, newTab, true, e => {
					Debug.Assert(e.Tab.UIContext is ITextEditorUIContext);
					if (e.Success && !e.HasMovedCaret) {
						MoveCaretTo(e.Tab.UIContext as ITextEditorUIContext, key, ilOffset);
						e.HasMovedCaret = true;
					}
				});
				return true;
			}

			Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => {
				fileTabManager.FollowReference(method, newTab, true, e => {
					Debug.Assert(e.Tab.UIContext is ITextEditorUIContext);
					if (e.Success && !e.HasMovedCaret) {
						MoveCaretTo(e.Tab.UIContext as ITextEditorUIContext, key, ilOffset);
						e.HasMovedCaret = true;
					}
				});
			}));
			return true;
		}
Exemple #4
0
        void Search(IDnSpyFile ownerModule, string ns, List <TypeDef> types)
        {
            var res = options.Filter.GetResult(ns, ownerModule);

            if (res.FilterType == FilterType.Hide)
            {
                return;
            }

            if (res.IsMatch && IsMatch(ns, ns))
            {
                options.OnMatch(new SearchResult {
                    Context                = options.Context,
                    Object                 = ns,
                    NameObject             = new NamespaceSearchResult(ns),
                    ObjectImageReference   = options.DotNetImageManager.GetNamespaceImageReference(),
                    LocationObject         = ownerModule.ModuleDef,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(ownerModule.ModuleDef),
                    DnSpyFile              = ownerModule,
                });
            }

            foreach (var type in types)
            {
                options.CancellationToken.ThrowIfCancellationRequested();
                Search(ownerModule, ns, type);
            }
        }
Exemple #5
0
        void Search(IDnSpyFile ownerModule, TypeDef type)
        {
            var res = options.Filter.GetResult(type);

            if (res.FilterType == FilterType.Hide)
            {
                return;
            }
            CheckCustomAttributes(ownerModule, type, type.DeclaringType);

            if (res.IsMatch && (IsMatch(type.FullName, type) || IsMatch(type.Name, type)))
            {
                options.OnMatch(new SearchResult {
                    Context                = options.Context,
                    Object                 = type,
                    NameObject             = type,
                    ObjectImageReference   = options.DotNetImageManager.GetImageReference(type),
                    LocationObject         = type.DeclaringType,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(type.DeclaringType),
                    DnSpyFile              = ownerModule,
                });
            }

            SearchMembers(ownerModule, type);
        }
Exemple #6
0
        public void RefreshModifiedFile(IDnSpyFile file)
        {
            var fileHash = GetModifiedFiles(file);

            decompilationCache.Clear(fileHash);

            var tabs = new List <IFileTab>();

            foreach (var tab in VisibleFirstTabs)
            {
                if (MustRefresh(tab, fileHash))
                {
                    tabs.Add(tab);
                }
            }
            if (tabs.Count > 0)
            {
                Refresh(tabs);
            }

            if (FileModified != null)
            {
                FileModified(this, new FileModifiedEventArgs(fileHash.ToArray()));
            }
        }
        public override FileTreeNodeFilterResult GetResult(IDnSpyFile file)
        {
            var thisFlag     = VisibleMembersFlags.NonNetFile;
            var visibleFlags = thisFlag | VisibleMembersFlags.Other | VisibleMembersFlags.Attributes;

            return(FilterFile(thisFlag, visibleFlags));
        }
Exemple #8
0
        void Search(IDnSpyFile ownerModule, string nsOwner, TypeDef type)
        {
            var res = options.Filter.GetResult(type);

            if (res.FilterType == FilterType.Hide)
            {
                return;
            }
            CheckCustomAttributes(ownerModule, type, nsOwner);

            if (res.IsMatch && (IsMatch(type.FullName, type) || IsMatch(type.Name, type)))
            {
                options.OnMatch(new SearchResult {
                    Context                = options.Context,
                    Object                 = type,
                    NameObject             = type,
                    ObjectImageReference   = options.DotNetImageManager.GetImageReference(type),
                    LocationObject         = new NamespaceSearchResult(nsOwner),
                    LocationImageReference = options.DotNetImageManager.GetNamespaceImageReference(),
                    DnSpyFile              = ownerModule,
                });
            }

            SearchMembers(ownerModule, type);

            foreach (var subType in type.GetTypes())
            {
                options.CancellationToken.ThrowIfCancellationRequested();
                Search(ownerModule, subType);
            }
        }
Exemple #9
0
        HashSet <IDnSpyFile> GetModifiedFiles(IDnSpyFile file)
        {
            var fileHash = new HashSet <IDnSpyFile>();

            fileHash.Add(file);
            var node = fileTreeView.FindNode(file);

            if (node is IModuleFileNode)
            {
                if (node.DnSpyFile.AssemblyDef != null && node.DnSpyFile.AssemblyDef.ManifestModule == node.DnSpyFile.ModuleDef)
                {
                    var asmNode = node.GetAssemblyNode();
                    Debug.Assert(asmNode != null);
                    if (asmNode != null)
                    {
                        fileHash.Add(asmNode.DnSpyFile);
                    }
                }
            }
            else if (node is IAssemblyFileNode)
            {
                node.TreeNode.EnsureChildrenLoaded();
                var manifestModNode = node.TreeNode.DataChildren.FirstOrDefault() as IModuleFileNode;
                Debug.Assert(manifestModNode != null);
                if (manifestModNode != null)
                {
                    fileHash.Add(manifestModNode.DnSpyFile);
                }
            }
            return(fileHash);
        }
Exemple #10
0
 /// <summary>
 /// Gets all its children and their children
 /// </summary>
 /// <param name="self">This</param>
 /// <returns></returns>
 public static IEnumerable <IDnSpyFile> GetAllChildren(this IDnSpyFile self)
 {
     foreach (var c in GetAllChildren(self.Children))
     {
         yield return(c);
     }
 }
Exemple #11
0
        void SearchNonNetFile(IDnSpyFile nonNetFile)
        {
            if (nonNetFile == null)
            {
                return;
            }
            var res = options.Filter.GetResult(nonNetFile);

            if (res.FilterType == FilterType.Hide)
            {
                return;
            }

            if (res.IsMatch && IsMatch(nonNetFile.GetShortName(), nonNetFile))
            {
                options.OnMatch(new SearchResult {
                    Context                = options.Context,
                    Object                 = nonNetFile,
                    NameObject             = nonNetFile,
                    ObjectImageReference   = options.DotNetImageManager.GetImageReference(nonNetFile.PEImage),
                    LocationObject         = null,
                    LocationImageReference = new ImageReference(),
                    DnSpyFile              = nonNetFile,
                });
            }
        }
Exemple #12
0
 public TabVM(TabsVM owner, IFileTab tab)
 {
     this.owner = owner;
     this.tab = tab;
     var node = tab.Content.Nodes.FirstOrDefault().GetTopNode();
     this.file = node == null ? null : node.DnSpyFile;
 }
Exemple #13
0
        void CheckCustomAttributes(IDnSpyFile file, IHasCustomAttribute hca, object parent)
        {
            var res = options.Filter.GetResultAttributes(hca);

            if (!res.IsMatch)
            {
                return;
            }
            foreach (var ca in hca.CustomAttributes)
            {
                foreach (var o in ca.ConstructorArguments)
                {
                    if (CheckCA(file, hca, parent, o))
                    {
                        return;
                    }
                }
                foreach (var o in ca.NamedArguments)
                {
                    if (CheckCA(file, hca, parent, o.Argument))
                    {
                        return;
                    }
                }
            }
        }
Exemple #14
0
        void Search(IDnSpyFile ownerModule, TypeDef type, FieldDef field)
        {
            var res = options.Filter.GetResult(field);

            if (res.FilterType == FilterType.Hide)
            {
                return;
            }
            CheckCustomAttributes(ownerModule, field, type);

            ImplMap im;

            if (res.IsMatch && (IsMatch(field.Name, field) || ((im = field.ImplMap) != null && (IsMatch(im.Name, im) || IsMatch(im.Module == null ? null : im.Module.Name, null)))))
            {
                options.OnMatch(new SearchResult {
                    Context                = options.Context,
                    Object                 = field,
                    NameObject             = field,
                    ObjectImageReference   = options.DotNetImageManager.GetImageReference(field),
                    LocationObject         = type,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                    DnSpyFile              = ownerModule,
                });
            }
        }
Exemple #15
0
        public TabVM(TabsVM owner, IFileTab tab)
        {
            this.owner = owner;
            this.tab   = tab;
            var node = tab.Content.Nodes.FirstOrDefault().GetTopNode();

            this.file = node == null ? null : node.DnSpyFile;
        }
Exemple #16
0
 /// <summary>
 /// Disable memory mapped I/O
 /// </summary>
 /// <param name="file">File</param>
 public static void DisableMemoryMappedIO(IDnSpyFile file)
 {
     if (file == null)
     {
         return;
     }
     DisableMemoryMappedIO(file.PEImage);
 }
Exemple #17
0
		public override bool HandleAssemblyListChanged(IDnSpyFile[] removedAssemblies, IDnSpyFile[] addedAssemblies) {
			foreach (IDnSpyFile asm in removedAssemblies) {
				if (this.Member.Module == asm.ModuleDef)
					return false; // remove this node
			}
			HandleAssemblyListChanged(this.TreeNode, removedAssemblies, addedAssemblies);
			return true;
		}
Exemple #18
0
 public IDnSpyFileNode FindNode(IDnSpyFile file)
 {
     if (file == null)
     {
         return(null);
     }
     return(Find(TopNodes, file));
 }
Exemple #19
0
 public override FileTreeNodeFilterResult GetResult(string ns, IDnSpyFile owner)
 {
     if (owner.ModuleDef != module)
     {
         return(new FileTreeNodeFilterResult(FilterType.Hide, false));
     }
     return(new FileTreeNodeFilterResult(FilterType.Visible, false));
 }
Exemple #20
0
 protected DnSpyFileNode(IDnSpyFile dnSpyFile)
 {
     if (dnSpyFile == null)
     {
         throw new ArgumentNullException();
     }
     this.dnSpyFile = dnSpyFile;
 }
 /// <summary>
 /// Creates a <see cref="NotifyFileCollectionType.Remove"/> instance
 /// </summary>
 /// <param name="file">Removed file</param>
 /// <param name="data">Data to send to listeners</param>
 /// <returns></returns>
 public static NotifyFileCollectionChangedEventArgs CreateRemove(IDnSpyFile file, object data)
 {
     if (file == null)
     {
         throw new ArgumentNullException();
     }
     return(CreateRemove(new[] { file }, data));
 }
Exemple #22
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="file">File</param>
 /// <param name="type">Type</param>
 public SearchTypeInfo(IDnSpyFile file, TypeDef type)
 {
     if (file == null || type == null)
     {
         throw new ArgumentNullException();
     }
     this.DnSpyFile = file;
     this.Type      = type;
 }
Exemple #23
0
        /// <summary>
        /// Gets self and all its children
        /// </summary>
        /// <param name="self">This</param>
        /// <returns></returns>
        public static IEnumerable <IDnSpyFile> GetAllChildrenAndSelf(this IDnSpyFile self)
        {
            yield return(self);

            foreach (var c in self.GetAllChildren())
            {
                yield return(c);
            }
        }
Exemple #24
0
        static void Dispose(IDnSpyFile file)
        {
            var id = file as IDisposable;

            if (id != null)
            {
                id.Dispose();
            }
        }
Exemple #25
0
 public void Write(ISyntaxHighlightOutput output, ILanguage language, IDnSpyFile file)
 {
     var filename = GetFilename(file);
     var peImage = file.PEImage;
     if (peImage != null)
         output.Write(NameUtils.CleanName(filename), IsExe(peImage) ? TextTokenKind.AssemblyExe : TextTokenKind.Assembly);
     else
         output.Write(NameUtils.CleanName(filename), TextTokenKind.Text);
 }
		/// <summary>
		/// Creates a <see cref="NotifyFileCollectionType.Clear"/> instance
		/// </summary>
		/// <param name="clearedFiles">All cleared files</param>
		/// <param name="data">Data to send to listeners</param>
		/// <returns></returns>
		public static NotifyFileCollectionChangedEventArgs CreateClear(IDnSpyFile[] clearedFiles, object data) {
			if (clearedFiles == null)
				throw new ArgumentNullException();
			var e = new NotifyFileCollectionChangedEventArgs();
			e.Type = NotifyFileCollectionType.Clear;
			e.Files = clearedFiles;
			e.Data = data;
			return e;
		}
Exemple #27
0
		public override bool HandleModelUpdated(IDnSpyFile[] files) {
			if (this.Member.Module == null)
				return false; // remove this node
			if ((this.Member is IField || this.Member is IMethod || this.Member is PropertyDef || this.Member is EventDef) &&
				this.Member.DeclaringType == null)
				return false;
			HandleModelUpdated(this.TreeNode, files);
			return true;
		}
		/// <summary>
		/// Creates a <see cref="NotifyFileCollectionType.Add"/> instance
		/// </summary>
		/// <param name="file">Added file</param>
		/// <param name="data">Data to send to listeners</param>
		/// <returns></returns>
		public static NotifyFileCollectionChangedEventArgs CreateAdd(IDnSpyFile file, object data) {
			if (file == null)
				throw new ArgumentNullException();
			var e = new NotifyFileCollectionChangedEventArgs();
			e.Type = NotifyFileCollectionType.Add;
			e.Files = new IDnSpyFile[] { file };
			e.Data = data;
			return e;
		}
        void Search(IDnSpyFile ownerModule, TypeDef type, MethodDef method)
        {
            var res = options.Filter.GetResult(method);

            if (res.FilterType == FilterType.Hide)
            {
                return;
            }
            CheckCustomAttributes(ownerModule, method, type);

            ImplMap im;

            if (res.IsMatch && (IsMatch(method.Name, method) || ((im = method.ImplMap) != null && (IsMatch(im.Name, im) || IsMatch(im.Module?.Name, null)))))
            {
                options.OnMatch(new SearchResult {
                    Context                = options.Context,
                    Object                 = method,
                    NameObject             = method,
                    ObjectImageReference   = options.DotNetImageManager.GetImageReference(method),
                    LocationObject         = type,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                    DnSpyFile              = ownerModule,
                });
                return;
            }

            res = options.Filter.GetResultParamDefs(method);
            if (res.FilterType != FilterType.Hide)
            {
                foreach (var pd in method.ParamDefs)
                {
                    options.CancellationToken.ThrowIfCancellationRequested();
                    CheckCustomAttributes(ownerModule, pd, method);
                    res = options.Filter.GetResult(method, pd);
                    if (res.FilterType == FilterType.Hide)
                    {
                        continue;
                    }
                    if (res.IsMatch && IsMatch(pd.Name, pd))
                    {
                        options.OnMatch(new SearchResult {
                            Context                = options.Context,
                            Object                 = method,
                            NameObject             = method,
                            ObjectImageReference   = options.DotNetImageManager.GetImageReference(method),
                            LocationObject         = type,
                            LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                            DnSpyFile              = ownerModule,
                        });
                        return;
                    }
                }
            }

            SearchBody(ownerModule, type, method);
        }
Exemple #30
0
        // Should be called if we don't save it in the files list. It will eventually be GC'd but it's
        // better to disable mmap'd I/O as soon as possible. The file must've been created by us.
        static IDnSpyFile DisableMMapdIO(IDnSpyFile file)
        {
            var peImage = file.PEImage;

            if (peImage != null)
            {
                peImage.UnsafeDisableMemoryMappedIO();
            }
            return(file);
        }
Exemple #31
0
        public INamespaceNode FindNamespaceNode(IDnSpyFile module, string @namespace)
        {
            var modNode = FindNode(module) as IModuleFileNode;

            if (modNode != null)
            {
                return(modNode.FindNode(@namespace));
            }
            return(null);
        }
Exemple #32
0
        /// <summary>
        /// Gets the short name of <paramref name="file"/>, which is usually the filename without
        /// the extension.
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public static string GetShortName(this IDnSpyFile file)
        {
            var shortName = GetShortName(file.Filename);

            if (string.IsNullOrEmpty(shortName))
            {
                shortName = GetDefaultShortName(file) ?? string.Empty;
            }
            return(shortName);
        }
        void SearchModAsmReferences(IDnSpyFile module)
        {
            var res = options.Filter.GetResult((IReferencesFolderNode)null);

            if (res.FilterType == FilterType.Hide)
            {
                return;
            }

            foreach (var asmRef in module.ModuleDef.GetAssemblyRefs())
            {
                options.CancellationToken.ThrowIfCancellationRequested();
                res = options.Filter.GetResult(asmRef);
                if (res.FilterType == FilterType.Hide)
                {
                    continue;
                }

                if (res.IsMatch && (IsMatch(asmRef.FullName, asmRef) || IsMatch(asmRef.Name, null)))
                {
                    options.OnMatch(new SearchResult {
                        Context                = options.Context,
                        Object                 = asmRef,
                        NameObject             = asmRef,
                        ObjectImageReference   = options.DotNetImageManager.GetImageReferenceAssemblyRef(),
                        LocationObject         = module.ModuleDef,
                        LocationImageReference = options.DotNetImageManager.GetImageReference(module.ModuleDef),
                        DnSpyFile              = module,
                    });
                }
            }

            foreach (var modRef in module.ModuleDef.GetModuleRefs())
            {
                options.CancellationToken.ThrowIfCancellationRequested();
                res = options.Filter.GetResult(modRef);
                if (res.FilterType == FilterType.Hide)
                {
                    continue;
                }

                if (res.IsMatch && IsMatch(modRef.FullName, modRef))
                {
                    options.OnMatch(new SearchResult {
                        Context                = options.Context,
                        Object                 = modRef,
                        NameObject             = modRef,
                        ObjectImageReference   = options.DotNetImageManager.GetImageReferenceModuleRef(),
                        LocationObject         = module.ModuleDef,
                        LocationImageReference = options.DotNetImageManager.GetImageReference(module.ModuleDef),
                        DnSpyFile              = module,
                    });
                }
            }
        }
Exemple #34
0
        internal static void GoToFile(IFileTabManager fileTabManager, IDnSpyFile file, bool newTab)
        {
            if (file == null)
            {
                return;
            }
            var obj = (object)file.ModuleDef ?? file;

            // The file could've been added lazily to the list so add a short delay before we select it
            Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => fileTabManager.FollowReference(obj, newTab)));
        }
Exemple #35
0
		public override bool HandleAssemblyListChanged(IDnSpyFile[] removedAssemblies, IDnSpyFile[] addedAssemblies) {
			// only cancel a running analysis if user has manually added/removed assemblies
			bool manualAdd = false;
			foreach (var asm in addedAssemblies) {
				if (!asm.IsAutoLoaded)
					manualAdd = true;
			}
			if (removedAssemblies.Length > 0 || manualAdd) {
				CancelAndClearChildren();
			}
			return true;
		}
Exemple #36
0
        IDnSpyFile GetOrAdd_NoLock(IDnSpyFile file)
        {
            var existing = Find_NoLock(file.Key);

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

            files.Add(file);
            return(file);
        }
Exemple #37
0
        public IDnSpyFileNode CreateNode(IDnSpyFileNode owner, IDnSpyFile file)
        {
            foreach (var provider in dnSpyFileNodeProviders)
            {
                var result = provider.Value.Create(this, owner, file);
                if (result != null)
                {
                    return(result);
                }
            }

            return(new UnknownFileNode(file));
        }
Exemple #38
0
        public IDnSpyFile ForceAdd(IDnSpyFile file, bool delayLoad, object data)
        {
            if (file == null)
            {
                throw new ArgumentNullException();
            }

            lock (lockObj)
                files.Add(file);

            CallCollectionChanged(NotifyFileCollectionChangedEventArgs.CreateAdd(file, data), delayLoad);
            return(file);
        }
        public IDnSpyFileNode Create(IFileTreeView fileTreeView, IDnSpyFileNode owner, IDnSpyFile file)
        {
            var dnFile = file as IDnSpyDotNetFile;
            if (dnFile != null) {
                Debug.Assert(file.ModuleDef != null);
                if (file.AssemblyDef == null || owner != null)
                    return new ModuleFileNode(dnFile);
                return new AssemblyFileNode(dnFile);
            }
            Debug.Assert(file.AssemblyDef == null && file.ModuleDef == null);
            if (file.PEImage != null)
                return new PEFileNode(file);

            return null;
        }
Exemple #40
0
 bool CheckCA(IDnSpyFile file, IHasCustomAttribute hca, object parent, CAArgument o)
 {
     var value = o.Value;
     var u = value as UTF8String;
     if (!ReferenceEquals(u, null))
         value = u.String;
     if (!IsMatch(null, value))
         return false;
     options.OnMatch(new SearchResult {
         Context = options.Context,
         Object = hca,
         NameObject = hca,
         ObjectImageReference = GetImageReference(hca),
         LocationObject = parent is string ? new NamespaceSearchResult((string)parent) : parent,
         LocationImageReference = GetImageReference(parent),
         DnSpyFile = file,
     });
     return true;
 }
Exemple #41
0
        void SearchModAsmReferences(IDnSpyFile module)
        {
            var res = options.Filter.GetResult((IReferencesFolderNode)null);
            if (res.FilterType == FilterType.Hide)
                return;

            foreach (var asmRef in module.ModuleDef.GetAssemblyRefs()) {
                res = options.Filter.GetResult(asmRef);
                if (res.FilterType == FilterType.Hide)
                    continue;

                if (res.IsMatch && IsMatch(asmRef.FullName, asmRef)) {
                    options.OnMatch(new SearchResult {
                        Context = options.Context,
                        Object = asmRef,
                        NameObject = asmRef,
                        ObjectImageReference = options.DotNetImageManager.GetImageReferenceAssemblyRef(),
                        LocationObject = module.ModuleDef,
                        LocationImageReference = options.DotNetImageManager.GetImageReference(module.ModuleDef),
                        DnSpyFile = module,
                    });
                }
            }

            foreach (var modRef in module.ModuleDef.GetModuleRefs()) {
                res = options.Filter.GetResult(modRef);
                if (res.FilterType == FilterType.Hide)
                    continue;

                if (res.IsMatch && IsMatch(modRef.FullName, modRef)) {
                    options.OnMatch(new SearchResult {
                        Context = options.Context,
                        Object = modRef,
                        NameObject = modRef,
                        ObjectImageReference = options.DotNetImageManager.GetImageReferenceModuleRef(),
                        LocationObject = module.ModuleDef,
                        LocationImageReference = options.DotNetImageManager.GetImageReference(module.ModuleDef),
                        DnSpyFile = module,
                    });
                }
            }
        }
Exemple #42
0
 void SearchMembers(IDnSpyFile ownerModule, TypeDef type)
 {
     foreach (var method in type.Methods)
         Search(ownerModule, type, method);
     options.CancellationToken.ThrowIfCancellationRequested();
     foreach (var field in type.Fields)
         Search(ownerModule, type, field);
     options.CancellationToken.ThrowIfCancellationRequested();
     foreach (var prop in type.Properties)
         Search(ownerModule, type, prop);
     options.CancellationToken.ThrowIfCancellationRequested();
     foreach (var evt in type.Events)
         Search(ownerModule, type, evt);
 }
Exemple #43
0
        void SearchBody(IDnSpyFile ownerModule, TypeDef type, MethodDef method)
        {
            CilBody body;

            var res = options.Filter.GetResultLocals(method);
            if (res.FilterType != FilterType.Hide) {
                body = method.Body;
                if (body == null)
                    return; // Return immediately. All code here depends on a non-null body

                foreach (var local in body.Variables) {
                    res = options.Filter.GetResult(method, local);
                    if (res.FilterType == FilterType.Hide)
                        continue;
                    if (res.IsMatch && IsMatch(local.Name, local)) {
                        options.OnMatch(new SearchResult {
                            Context = options.Context,
                            Object = method,
                            NameObject = method,
                            ObjectImageReference = options.DotNetImageManager.GetImageReference(method),
                            LocationObject = type,
                            LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                            DnSpyFile = ownerModule,
                        });
                        return;
                    }
                }
            }

            res = options.Filter.GetResultBody(method);
            if (res.FilterType == FilterType.Hide)
                return;
            if (!res.IsMatch)
                return;

            body = method.Body;
            if (body == null)
                return;
            foreach (var instr in body.Instructions) {
                object operand;
                // Only check numbers and strings. Don't pass in any type of operand to IsMatch()
                switch (instr.OpCode.Code) {
                case Code.Ldc_I4_M1: operand = -1; break;
                case Code.Ldc_I4_0: operand = 0; break;
                case Code.Ldc_I4_1: operand = 1; break;
                case Code.Ldc_I4_2: operand = 2; break;
                case Code.Ldc_I4_3: operand = 3; break;
                case Code.Ldc_I4_4: operand = 4; break;
                case Code.Ldc_I4_5: operand = 5; break;
                case Code.Ldc_I4_6: operand = 6; break;
                case Code.Ldc_I4_7: operand = 7; break;
                case Code.Ldc_I4_8: operand = 8; break;
                case Code.Ldc_I4:
                case Code.Ldc_I4_S:
                case Code.Ldc_R4:
                case Code.Ldc_R8:
                case Code.Ldstr: operand = instr.Operand; break;
                default: operand = null; break;
                }
                if (operand != null && IsMatch(null, operand)) {
                    options.OnMatch(new SearchResult {
                        Context = options.Context,
                        Object = method,
                        NameObject = method,
                        ObjectImageReference = options.DotNetImageManager.GetImageReference(method),
                        LocationObject = type,
                        LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                        DnSpyFile = ownerModule,
                        ObjectInfo = new BodyResult(instr.Offset),
                    });
                    break;
                }
            }
        }
Exemple #44
0
        void Search(IDnSpyFile ownerModule, TypeDef type, EventDef evt)
        {
            var res = options.Filter.GetResult(evt);
            if (res.FilterType == FilterType.Hide)
                return;
            CheckCustomAttributes(ownerModule, evt, type);

            if (res.IsMatch && IsMatch(evt.Name, evt)) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = evt,
                    NameObject = evt,
                    ObjectImageReference = options.DotNetImageManager.GetImageReference(evt),
                    LocationObject = type,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                    DnSpyFile = ownerModule,
                });
            }
        }
		/// <summary>
		/// Creates a <see cref="NotifyFileCollectionType.Remove"/> instance
		/// </summary>
		/// <param name="files">Removed files</param>
		/// <param name="data">Data to send to listeners</param>
		/// <returns></returns>
		public static NotifyFileCollectionChangedEventArgs CreateRemove(IDnSpyFile[] files, object data) {
			if (files == null)
				throw new ArgumentNullException();
			var e = new NotifyFileCollectionChangedEventArgs();
			e.Type = NotifyFileCollectionType.Remove;
			e.Files = files;
			e.Data = data;
			return e;
		}
Exemple #46
0
        void SearchResourceTreeNodes(IDnSpyFile module, IResourceNode resTreeNode)
        {
            var res = options.Filter.GetResult(resTreeNode);
            if (res.FilterType == FilterType.Hide)
                return;

            if (res.IsMatch && (IsMatch(resTreeNode.Name, resTreeNode) || IsMatch(ToString(resTreeNode), null))) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = resTreeNode,
                    NameObject = resTreeNode,
                    ObjectImageReference = resTreeNode.Icon,
                    LocationObject = module.ModuleDef,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(module.ModuleDef),
                    DnSpyFile = module,
                });
            }

            res = options.Filter.GetResult((IResourceElementNode)null);
            if (res.FilterType == FilterType.Hide)
                return;

            var resNodes = new List<IResourceElementNode>();
            options.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => {
                resTreeNode.TreeNode.EnsureChildrenLoaded();
                resNodes.AddRange(resTreeNode.TreeNode.DataChildren.OfType<IResourceElementNode>());
            }));

            foreach (var resElNode in resNodes)
                SearchResourceElementTreeNode(module, resTreeNode, resElNode);
        }
Exemple #47
0
        void SearchResourceElementTreeNode(IDnSpyFile module, IResourceNode resTreeNode, IResourceElementNode resElNode)
        {
            var res = options.Filter.GetResult(resElNode);
            if (res.FilterType == FilterType.Hide)
                return;

            if (res.IsMatch) {
                bool m = IsMatch(resElNode.Name, resElNode);
                if (!m) {
                    var builtin = resElNode.ResourceElement.ResourceData as BuiltInResourceData;
                    if (builtin != null) {
                        var val = builtin.Data;
                        if (builtin.Code == ResourceTypeCode.TimeSpan)
                            val = ((TimeSpan)val).Ticks;
                        m = IsMatch(val as string, val);
                    }
                }
                if (!m)
                    m = IsMatch(ToString(resElNode), null);
                if (m) {
                    options.OnMatch(new SearchResult {
                        Context = options.Context,
                        Object = resElNode,
                        NameObject = resElNode,
                        ObjectImageReference = resElNode.Icon,
                        LocationObject = resTreeNode,
                        LocationImageReference = resTreeNode.Icon,
                        DnSpyFile = module,
                    });
                }
            }
        }
Exemple #48
0
        void Search(IDnSpyFile ownerModule, TypeDef type)
        {
            var res = options.Filter.GetResult(type);
            if (res.FilterType == FilterType.Hide)
                return;
            CheckCustomAttributes(ownerModule, type, type.DeclaringType);

            if (res.IsMatch && (IsMatch(type.FullName, type) || IsMatch(type.Name, type))) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = type,
                    NameObject = type,
                    ObjectImageReference = options.DotNetImageManager.GetImageReference(type),
                    LocationObject = type.DeclaringType,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(type.DeclaringType),
                    DnSpyFile = ownerModule,
                });
            }

            SearchMembers(ownerModule, type);
        }
Exemple #49
0
        void Search(IDnSpyFile ownerModule, string nsOwner, TypeDef type)
        {
            var res = options.Filter.GetResult(type);
            if (res.FilterType == FilterType.Hide)
                return;
            CheckCustomAttributes(ownerModule, type, nsOwner);

            if (res.IsMatch && (IsMatch(type.FullName, type) || IsMatch(type.Name, type))) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = type,
                    NameObject = type,
                    ObjectImageReference = options.DotNetImageManager.GetImageReference(type),
                    LocationObject = new NamespaceSearchResult(nsOwner),
                    LocationImageReference = options.DotNetImageManager.GetNamespaceImageReference(),
                    DnSpyFile = ownerModule,
                });
            }

            SearchMembers(ownerModule, type);

            foreach (var subType in type.GetTypes()) {
                options.CancellationToken.ThrowIfCancellationRequested();
                Search(ownerModule, subType);
            }
        }
Exemple #50
0
        void Search(IDnSpyFile ownerModule, string ns, List<TypeDef> types)
        {
            var res = options.Filter.GetResult(ns, ownerModule);
            if (res.FilterType == FilterType.Hide)
                return;

            if (res.IsMatch && IsMatch(ns, ns)) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = ns,
                    NameObject = new NamespaceSearchResult(ns),
                    ObjectImageReference = options.DotNetImageManager.GetNamespaceImageReference(),
                    LocationObject = ownerModule.ModuleDef,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(ownerModule.ModuleDef),
                    DnSpyFile = ownerModule,
                });
            }

            foreach (var type in types) {
                options.CancellationToken.ThrowIfCancellationRequested();
                Search(ownerModule, ns, type);
            }
        }
Exemple #51
0
 void CheckCustomAttributes(IDnSpyFile file, IHasCustomAttribute hca, object parent)
 {
     var res = options.Filter.GetResultAttributes(hca);
     if (!res.IsMatch)
         return;
     foreach (var ca in hca.CustomAttributes) {
         foreach (var o in ca.ConstructorArguments) {
             if (CheckCA(file, hca, parent, o))
                 return;
         }
         foreach (var o in ca.NamedArguments) {
             if (CheckCA(file, hca, parent, o.Argument))
                 return;
         }
     }
 }
Exemple #52
0
		public PEFileNode(IDnSpyFile dnSpyFile)
			: base(dnSpyFile) {
			Debug.Assert(dnSpyFile.PEImage != null && dnSpyFile.ModuleDef == null);
		}
Exemple #53
0
        void SearchModule(IDnSpyFile module)
        {
            if (module == null)
                return;
            var mod = module.ModuleDef;
            if (mod == null) {
                SearchNonNetFile(module);
                return;
            }

            var res = options.Filter.GetResult(mod);
            if (res.FilterType == FilterType.Hide)
                return;
            CheckCustomAttributes(module, mod, mod.Assembly);

            if (res.IsMatch && IsMatch(mod.FullName, module)) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = mod,
                    NameObject = mod,
                    ObjectImageReference = options.DotNetImageManager.GetImageReference(mod),
                    LocationObject = mod.Assembly != null ? mod.Assembly : null,
                    LocationImageReference = mod.Assembly != null ? options.DotNetImageManager.GetImageReference(mod.Assembly.ManifestModule) : new ImageReference(),
                    DnSpyFile = module,
                });
            }

            SearchModAsmReferences(module);
            SearchResources(module);

            foreach (var kv in GetNamespaces(mod)) {
                options.CancellationToken.ThrowIfCancellationRequested();
                Search(module, kv.Key, kv.Value);
            }
        }
Exemple #54
0
        void Search(IDnSpyFile ownerModule, TypeDef type, MethodDef method)
        {
            var res = options.Filter.GetResult(method);
            if (res.FilterType == FilterType.Hide)
                return;
            CheckCustomAttributes(ownerModule, method, type);

            ImplMap im;
            if (res.IsMatch && (IsMatch(method.Name, method) || ((im = method.ImplMap) != null && (IsMatch(im.Name, im) || IsMatch(im.Module == null ? null : im.Module.Name, null))))) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = method,
                    NameObject = method,
                    ObjectImageReference = options.DotNetImageManager.GetImageReference(method),
                    LocationObject = type,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                    DnSpyFile = ownerModule,
                });
                return;
            }

            res = options.Filter.GetResultParamDefs(method);
            if (res.FilterType != FilterType.Hide) {
                foreach (var pd in method.ParamDefs) {
                    CheckCustomAttributes(ownerModule, pd, method);
                    res = options.Filter.GetResult(method, pd);
                    if (res.FilterType == FilterType.Hide)
                        continue;
                    if (res.IsMatch && IsMatch(pd.Name, pd)) {
                        options.OnMatch(new SearchResult {
                            Context = options.Context,
                            Object = method,
                            NameObject = method,
                            ObjectImageReference = options.DotNetImageManager.GetImageReference(method),
                            LocationObject = type,
                            LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                            DnSpyFile = ownerModule,
                        });
                        return;
                    }
                }
            }

            SearchBody(ownerModule, type, method);
        }
Exemple #55
0
        void SearchNonNetFile(IDnSpyFile nonNetFile)
        {
            if (nonNetFile == null)
                return;
            var res = options.Filter.GetResult(nonNetFile);
            if (res.FilterType == FilterType.Hide)
                return;

            if (res.IsMatch && IsMatch(nonNetFile.GetShortName(), nonNetFile)) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = nonNetFile,
                    NameObject = nonNetFile,
                    ObjectImageReference = options.DotNetImageManager.GetImageReference(nonNetFile.PEImage),
                    LocationObject = null,
                    LocationImageReference = new ImageReference(),
                    DnSpyFile = nonNetFile,
                });
            }
        }
Exemple #56
0
        void Search(IDnSpyFile ownerModule, TypeDef type, FieldDef field)
        {
            var res = options.Filter.GetResult(field);
            if (res.FilterType == FilterType.Hide)
                return;
            CheckCustomAttributes(ownerModule, field, type);

            ImplMap im;
            if (res.IsMatch && (IsMatch(field.Name, field) || ((im = field.ImplMap) != null && (IsMatch(im.Name, im) || IsMatch(im.Module == null ? null : im.Module.Name, null))))) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = field,
                    NameObject = field,
                    ObjectImageReference = options.DotNetImageManager.GetImageReference(field),
                    LocationObject = type,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                    DnSpyFile = ownerModule,
                });
            }
        }
Exemple #57
0
        void SearchResources(IDnSpyFile module)
        {
            var res = options.Filter.GetResult((IResourcesFolderNode)null);
            if (res.FilterType == FilterType.Hide)
                return;

            res = options.Filter.GetResult((IResourceNode)null);
            if (res.FilterType == FilterType.Hide)
                return;

            var resNodes = new List<IResourceNode>();
            options.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => {
                var modNode = options.FileTreeView.FindNode(module.ModuleDef);
                if (modNode == null)
                    return;
                modNode.TreeNode.EnsureChildrenLoaded();
                var resFolder = modNode.TreeNode.Children.FirstOrDefault(a => a.Data is IResourcesFolderNode);
                if (resFolder != null) {
                    resFolder.EnsureChildrenLoaded();
                    resNodes.AddRange(resFolder.DataChildren.OfType<IResourceNode>());
                }
            }));

            foreach (var node in resNodes)
                SearchResourceTreeNodes(module, node);
        }
Exemple #58
0
        void Search(IDnSpyFile ownerModule, TypeDef type, PropertyDef prop)
        {
            var res = options.Filter.GetResult(prop);
            if (res.FilterType == FilterType.Hide)
                return;
            CheckCustomAttributes(ownerModule, prop, type);

            if (res.IsMatch && IsMatch(prop.Name, prop)) {
                options.OnMatch(new SearchResult {
                    Context = options.Context,
                    Object = prop,
                    NameObject = prop,
                    ObjectImageReference = options.DotNetImageManager.GetImageReference(prop),
                    LocationObject = type,
                    LocationImageReference = options.DotNetImageManager.GetImageReference(type),
                    DnSpyFile = ownerModule,
                });
            }
        }
Exemple #59
0
		public IDnSpyFileNode Create(IFileTreeView fileTreeView, IDnSpyFileNode owner, IDnSpyFile file) {
			var myFile = file as MyDnSpyFile;
			if (myFile != null)
				return new MyDnSpyFileNode(myFile);
			return null;
		}
Exemple #60
0
 static string GetFilename(IDnSpyFile dnSpyFile)
 {
     string filename = null;
     try {
         filename = Path.GetFileName(dnSpyFile.Filename);
     }
     catch (ArgumentException) {
     }
     if (string.IsNullOrEmpty(filename))
         filename = dnSpyFile.GetShortName();
     return filename;
 }