| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| namespace NativeClientVSAddIn |
| { |
| using System; |
| using System.Collections.Generic; |
| using System.Linq; |
| using System.Management; |
| |
| /// <summary> |
| /// Queries the system for the list of running processes. |
| /// </summary> |
| public class ProcessSearcher |
| { |
| /// <summary> |
| /// Returns results of a process search subject to given constraints. |
| /// </summary> |
| /// <param name="constraints"> |
| /// A function taking a ProcessInfo object and returning true if the |
| /// ProcessInfo object satisfies the constraints. |
| /// </param> |
| /// <returns>List of matching processes.</returns> |
| public List<ProcessInfo> GetResults(Func<ProcessInfo, bool> constraints) |
| { |
| return GetSystemProcesses().Where(constraints).ToList(); |
| } |
| |
| /// <summary> |
| /// Searches the system for all processes of a given name. |
| /// </summary> |
| /// <param name="name">Name to search for.</param> |
| /// <returns>List of matching processes.</returns> |
| public List<ProcessInfo> GetResultsByName(string name) |
| { |
| return GetResults(p => name.Equals(p.Name, StringComparison.OrdinalIgnoreCase)); |
| } |
| |
| /// <summary> |
| /// Searches the system for all processes of a given process ID. |
| /// </summary> |
| /// <param name="procID">ID to search for.</param> |
| /// <returns>List of matching processes.</returns> |
| public List<ProcessInfo> GetResultsByID(uint procID) |
| { |
| return GetResults(p => procID == p.ID); |
| } |
| |
| /// <summary> |
| /// Returns a list of all descendant processes of a process. |
| /// </summary> |
| /// <param name="root">Process ID of the process to get all descendants from.</param> |
| /// <returns>All descendants of the given root process.</returns> |
| public List<ProcessInfo> GetDescendants(uint root) |
| { |
| List<ProcessInfo> processes = GetSystemProcesses(); |
| HashSet<ProcessInfo> descendants = new HashSet<ProcessInfo>(); |
| descendants.UnionWith(processes.Where(p => p.ID == root)); |
| int lastCount = 0; |
| while (descendants.Count > lastCount) |
| { |
| lastCount = descendants.Count; |
| |
| // Add any processes who have a parent that is in the descendant list already. |
| // Note we check the creation date to prevent cycles caused by recycled process IDs. |
| descendants.UnionWith(processes.Where(p => descendants.Any( |
| parent => parent.ID == p.ParentID && parent.CreationDate <= p.CreationDate))); |
| } |
| |
| return descendants.ToList(); |
| } |
| |
| /// <summary> |
| /// Queries the system for the full list of processes. |
| /// </summary> |
| /// <returns>List of processes on the system.</returns> |
| protected virtual List<ProcessInfo> GetSystemProcesses() |
| { |
| var processList = new List<ProcessInfo>(); |
| string query = "select * from Win32_Process"; |
| using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) |
| { |
| using (ManagementObjectCollection results = searcher.Get()) |
| { |
| foreach (ManagementObject process in results) |
| { |
| processList.Add((ProcessInfo)process); |
| } |
| } |
| } |
| |
| return processList; |
| } |
| } |
| } |