Windows2003-3790/sdktools/trace/csharptracepack/examples-nonbuildenv/processcontroller/processcontrollermanager.cs
2020-09-30 16:53:55 +02:00

331 lines
9.6 KiB
C#

namespace WindowsApplication1
{
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ServiceProcess;
using System.Diagnostics;
using System.DirectoryServices;
using Microsoft.Win32.Diagnostics; /* Instrumentation */
// Summary description for ProcessControllerManager.
// This class is used to handle all the processes on a machine
public class ProcessControllerManager
{
private string strMachineName;
private ListBox lstPcsRun, lstPcs,lstCurrent=null;
private string strSelectedProcess="";
private Process pcsSelectedProcess;
private System.Collections.Hashtable colProcesses=new System.Collections.Hashtable();
private System.Windows.Forms.Timer tmrWatchDog = new System.Windows.Forms.Timer();
private TraceProvider MyTraceProvider = new TraceProvider("ProcessController",new Guid("{C5EBCA17-E93F-4733-865B-DEC4039ADB6D}"));
public ProcessControllerManager()
{
//Default constructor. Don't need any code
}
//Clear all the collections
public void Clear()
{
strMachineName="";
if(lstPcsRun!=null)
{
lstPcsRun.Items.Clear();
lstPcsRun.SelectedIndexChanged -=new System.EventHandler(this.SelectedProcess);
lstPcsRun.MouseDown -= new System.Windows.Forms.MouseEventHandler(this.ListOptions);
}
if(lstPcs!=null)
{
lstPcs.Items.Clear();
lstPcs.SelectedIndexChanged -= new System.EventHandler(this.SelectedProcess);
lstPcs.MouseDown -= new System.Windows.Forms.MouseEventHandler(this.ListOptions);
}
colProcesses.Clear();
}
//Class explicit constructor
public ProcessControllerManager(ListBox tmpPcsRun, ListBox tmpPcs, string tmpMachineName )
{
strMachineName=tmpMachineName;
colProcesses.Clear();
//Adding the events handlers to the controls
lstPcs=tmpPcs;
lstPcs.SelectedIndexChanged += new System.EventHandler(this.SelectedProcess);
lstPcs.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ListOptions);
lstPcsRun=tmpPcsRun;
lstPcsRun.SelectedIndexChanged += new System.EventHandler(this.SelectedProcess);
lstPcsRun.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ListOptions);
LoadProcesses();
}
//Launch the selected process
public void StartProcess(string strProcName)
{
Process tmpProcess = new Process();
tmpProcess.Exited += new EventHandler(this.ProcessExited);
tmpProcess.EnableRaisingEvents=true;
tmpProcess.StartInfo.FileName=strProcName;
try
{
tmpProcess.Start();
while(! tmpProcess.Responding)System.Windows.Forms.Application.DoEvents();
LoadProcesses();
}
catch
{
MessageBox.Show("The Process: " + strSelectedProcess + " cannot start !");
}
}
//Add/remove options from the popup menu
private void ListOptions( object sender, System.Windows.Forms.MouseEventArgs e)
{
lstCurrent=(ListBox)sender;
if(e.Button==System.Windows.Forms.MouseButtons.Right && lstCurrent.Equals(lstPcsRun))
{
lstCurrent = (ListBox)sender;
lstCurrent.ContextMenu=new System.Windows.Forms.ContextMenu();
if(lstCurrent.Equals(lstPcs))
{
strSelectedProcess=lstCurrent.SelectedItem.ToString();
}
else
{
lstCurrent.ContextMenu.MenuItems.Add(new System.Windows.Forms.MenuItem("&Terminate Process", new EventHandler(this.KillProcess)));
}
lstCurrent.ContextMenu.Show(lstCurrent ,new Point(e.X,e.Y));
}
}
//Try to stop a process
private void KillProcess( object sender, EventArgs e)
{
try
{
string strProcName = lstCurrent.SelectedItem.ToString();
if(pcsSelectedProcess!=null)
{
try
{
//Try to terminate the process
pcsSelectedProcess.Kill();
if(colProcesses.Contains(pcsSelectedProcess.Id.ToString()))
{
colProcesses.Remove(pcsSelectedProcess.Id.ToString());
lstPcsRun.Items.Remove (pcsSelectedProcess.ProcessName + " ID: " + pcsSelectedProcess.Id.ToString());
}
}
catch
{
MessageBox.Show(pcsSelectedProcess.ProcessName + " can not be killed");
}
}
lstPcs.Items.Clear();
}
catch
{
MessageBox.Show("Select a process first!") ;//no listItem was selected
}
}
//Fills up the Process Info list
private void ShowProcessInfo( object sender, EventArgs e)
{
string strItem = lstCurrent.SelectedItem.ToString();
string strKey = strItem.Substring(strItem.IndexOf("ID:")+3).Trim();
Process tmpProcess=null;
if(strKey !="" )
{
try
{
tmpProcess= Process.GetProcessById(Int32.Parse (strKey),strMachineName);
}
catch
{
Process[] arrProcess=Process.GetProcesses(strMachineName);
foreach(Process tmpP in arrProcess)
{
if(tmpP.Id==Int32.Parse(strKey))
{
tmpProcess=tmpP;
break;
}
}
}
lstPcs.Items.Clear();
//Adding the Process info to the list
try
{
lstPcs.Items.Add("Process Name: " + tmpProcess.ProcessName );
lstPcs.Items.Add("Arguments: " + tmpProcess.StartInfo.Arguments);
lstPcs.Items.Add("Running on: " + tmpProcess.MachineName);
try
{
lstPcs.Items.Add("Main Window title: " + tmpProcess.MainWindowTitle);
}
catch
{
lstPcs.Items.Add("Main Window title: Not Available");
}
lstPcs.Items.Add("Start Time: " + tmpProcess.StartTime.ToString());
lstPcs.Items.Add("NonpagedSystemMemorySize: " + tmpProcess.NonpagedSystemMemorySize.ToString());
lstPcs.Items.Add("PagedMemorySize: " + tmpProcess.PagedMemorySize.ToString());
lstPcs.Items.Add("PrivateMemorySize: " + tmpProcess.PrivateMemorySize.ToString());
lstPcs.Items.Add("PrivilegedProcessorTime: " + tmpProcess.PrivilegedProcessorTime.ToString());
lstPcs.Items.Add("PeakPagedMemorySize: " + tmpProcess.PeakPagedMemorySize.ToString());
lstPcs.Items.Add("PeakVirtualMemorySize: " + tmpProcess.PeakVirtualMemorySize.ToString());
lstPcs.Items.Add("PeakPagedMemorySize: " + tmpProcess.PeakPagedMemorySize.ToString());
lstPcs.Items.Add("PeakWorkingSet: " + tmpProcess.PeakWorkingSet.ToString());
try
{
lstPcs.Items.Add("PriorityClass: " + tmpProcess.PriorityClass.ToString());
}
catch
{
lstPcs.Items.Add("PriorityClass: Not available" );
}
try
{
lstPcs.Items.Add("BasePriority: "+ tmpProcess.BasePriority.ToString());
}
catch
{
lstPcs.Items.Add("BasePriority: Not available" );
}
try
{
lstPcs.Items.Add("ProcessorAffinity: " + tmpProcess.ProcessorAffinity.ToString());
}
catch
{
lstPcs.Items.Add("ProcessorAffinity: Not available");
}
lstPcs.Items.Add("ID: " + tmpProcess.Id);
lstPcs.Items.Add("WorkingDirectory: " + tmpProcess.StartInfo.WorkingDirectory);
lstPcs.Items.Add("");
lstPcs.Items.Add("********************* Modules in use by this process ***************** ");
lstPcs.Items.Add("");
foreach(System.Diagnostics.ProcessModule tmpPM in tmpProcess.Modules)
{
try
{
lstPcs.Items.Add("Module Name: " + tmpPM.FileName );
}
catch
{
lstPcs.Items.Add("Modules Reading Not Allowed");
}
}
}
catch
{
MessageBox.Show("Some process properties couldn't be loaded!");//Some did not work
}
}
}
//Remove the process from the processes list
private void ProcessExited(object sender, EventArgs e)
{
Process tmpProcess = (Process)sender;
colProcesses.Remove(tmpProcess.Id.ToString());
lstPcsRun.Items.Remove(tmpProcess.ProcessName + " ID: " + tmpProcess.Id.ToString());
}
//Check the selected process
private void SelectedProcess(object sender, EventArgs e)
{
lstCurrent=(ListBox)sender;
strSelectedProcess=lstCurrent.SelectedItem.ToString();
if(lstCurrent.Equals(lstPcsRun))
{
string pcsID = lstCurrent.SelectedItem.ToString();
pcsID= pcsID.Substring(pcsID.IndexOf("ID: ")+4).Trim();
pcsSelectedProcess=(Process)colProcesses[pcsID];
ShowProcessInfo(sender,e);
}
}
//Load all the processes on the given machine
private void LoadProcesses()
{
tmrWatchDog.Enabled=false;
lstPcsRun.Items.Clear();
colProcesses.Clear();
colProcesses=new System.Collections.Hashtable();
try
{
//Use the Static: GetProcesses to have the array of currently running processes.
Process[]arrProcess=Process.GetProcesses(strMachineName);
foreach(Process tmpPcs in arrProcess)
{
//Assign ProcessExited event to each process in the list
tmpPcs.Exited += new EventHandler(ProcessExited);
if(!colProcesses.Contains(tmpPcs.Id.ToString()) )
{
MyTraceProvider.TraceMessage((uint)TraceFlags.Info, "[{0}]Loading process {1} ID: {2}", strMachineName, tmpPcs.ProcessName, tmpPcs.Id.ToString()); /* Instrumentation */
lstPcsRun.Items.Add(tmpPcs.ProcessName + " ID: " + tmpPcs.Id.ToString());
colProcesses.Add(tmpPcs.Id.ToString(),tmpPcs);
}
}
}
catch
{
MessageBox.Show("Cannot read processes on: " + strMachineName );
}
//Enable the RaisingEvents for each process
foreach(Process tmpPcs in colProcesses.Values)
{
try
{
tmpPcs.EnableRaisingEvents=true;
}
catch
{
Console.WriteLine("Couldn't Set Option");
}
}
tmrWatchDog.Enabled=true;
}
}
}