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); }
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; }
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); } }
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); }
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)); }
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); } }
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); }
/// <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); } }
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, }); } }
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; }
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; } } } }
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, }); } }
/// <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); }
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; }
public IDnSpyFileNode FindNode(IDnSpyFile file) { if (file == null) { return(null); } return(Find(TopNodes, file)); }
public override FileTreeNodeFilterResult GetResult(string ns, IDnSpyFile owner) { if (owner.ModuleDef != module) { return(new FileTreeNodeFilterResult(FilterType.Hide, false)); } return(new FileTreeNodeFilterResult(FilterType.Visible, false)); }
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)); }
/// <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; }
/// <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); } }
static void Dispose(IDnSpyFile file) { var id = file as IDisposable; if (id != null) { id.Dispose(); } }
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; }
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); }
// 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); }
public INamespaceNode FindNamespaceNode(IDnSpyFile module, string @namespace) { var modNode = FindNode(module) as IModuleFileNode; if (modNode != null) { return(modNode.FindNode(@namespace)); } return(null); }
/// <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, }); } } }
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))); }
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; }
IDnSpyFile GetOrAdd_NoLock(IDnSpyFile file) { var existing = Find_NoLock(file.Key); if (existing != null) { return(existing); } files.Add(file); return(file); }
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)); }
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; }
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; }
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, }); } } }
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); }
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; } } }
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; }
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); }
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, }); } } }
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); }
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); } }
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); } }
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; } } }
public PEFileNode(IDnSpyFile dnSpyFile) : base(dnSpyFile) { Debug.Assert(dnSpyFile.PEImage != null && dnSpyFile.ModuleDef == null); }
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); } }
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); }
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, }); } }
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, }); } }
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); }
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, }); } }
public IDnSpyFileNode Create(IFileTreeView fileTreeView, IDnSpyFileNode owner, IDnSpyFile file) { var myFile = file as MyDnSpyFile; if (myFile != null) return new MyDnSpyFileNode(myFile); return null; }
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; }