private void AbortProcess(ClientRequestInfo requestInfo)
{
if (requestInfo.Request.Arguments.ContainsHelpRequest || requestInfo.Request.Arguments.OrderedArgCount < 1)
{
bool showAdvancedHelp = requestInfo.Request.Arguments.Exists("advanced");
StringBuilder helpMessage = new StringBuilder();
helpMessage.Append("Aborts the specified service or system process if executing.");
helpMessage.AppendLine();
helpMessage.AppendLine();
helpMessage.Append(" Usage:");
helpMessage.AppendLine();
helpMessage.Append(" Abort \"Process Name\" -options");
helpMessage.AppendLine();
helpMessage.AppendLine();
helpMessage.Append(" Options:");
helpMessage.AppendLine();
helpMessage.Append(" -?".PadRight(20));
helpMessage.Append("Displays this help message");
helpMessage.AppendLine();
helpMessage.Append(" -list".PadRight(20));
helpMessage.Append("Displays list of all service or system processes");
if (m_supportSystemCommands && showAdvancedHelp)
{
helpMessage.AppendLine();
helpMessage.Append(" -system".PadRight(20));
helpMessage.Append("Treats the specified process as a system process");
helpMessage.AppendLine();
helpMessage.AppendLine();
helpMessage.Append("NOTE: Specify process name of \"Me\" to kill current service process. ");
}
helpMessage.AppendLine();
helpMessage.AppendLine();
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, helpMessage.ToString());
}
else
{
string processName = requestInfo.Request.Arguments["orderedarg1"];
bool systemProcess = requestInfo.Request.Arguments.Exists("system");
bool listProcesses = requestInfo.Request.Arguments.Exists("list");
if (systemProcess && m_supportSystemCommands)
{
// Abort system process.
Process processToAbort = null;
if (string.Compare(processName, "Me", StringComparison.OrdinalIgnoreCase) == 0)
processName = Process.GetCurrentProcess().ProcessName;
foreach (Process process in Process.GetProcessesByName(processName))
{
// Lookup for the system process by name.
processToAbort = process;
break;
}
if ((object)processToAbort == null)
{
int processID;
if (int.TryParse(processName, out processID) && processID > 0)
{
processToAbort = Process.GetProcessById(processID);
processName = processToAbort.ProcessName;
}
}
if ((object)processToAbort != null)
{
try
{
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "Attempting to abort system process \"{0}\"...\r\n\r\n", processName);
processToAbort.Kill();
if (processToAbort.WaitForExit(10000))
{
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "Successfully aborted system process \"{0}\".\r\n\r\n", processName);
}
else
{
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Alarm, "Failed to abort system process \"{0}\". Process not responding.\r\n\r\n", processName);
}
}
catch (Exception ex)
{
LogException(ex);
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Alarm, "Failed to abort system process \"{0}\". {1}.\r\n\r\n", processName, ex.Message);
}
}
else
{
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Alarm, "Failed to abort system process \"{0}\". Process is not running.\r\n\r\n", processName);
}
}
else
{
// Abort service process.
ServiceProcess processToAbort = FindProcess(processName);
if ((object)processToAbort != null)
{
if (processToAbort.CurrentState == ServiceProcessState.Processing)
{
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "Attempting to abort service process \"{0}\"...\r\n\r\n", processName);
processToAbort.Abort();
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "Successfully aborted service process \"{0}\".\r\n\r\n", processName);
}
else
{
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Alarm, "Failed to abort service process \"{0}\". Process is not executing.\r\n\r\n", processName);
}
}
else
{
UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Alarm, "Failed to abort service process \"{0}\". Process is not defined.\r\n\r\n", processName);
}
}
if (!listProcesses)
return;
requestInfo.Request = ClientRequest.Parse($"Processes {(systemProcess ? "-system" : "")}");
ShowProcesses(requestInfo);
}
}