mirror of
https://github.com/2dust/v2rayN.git
synced 2025-10-14 04:19:12 +00:00
182 lines
4.5 KiB
C#
182 lines
4.5 KiB
C#
using System.Diagnostics;
|
|
|
|
namespace ServiceLib.Common;
|
|
|
|
public static class ProcUtils
|
|
{
|
|
private static readonly string _tag = "ProcUtils";
|
|
|
|
public static void ProcessStart(string? fileName, string arguments = "")
|
|
{
|
|
_ = ProcessStart(fileName, arguments, null);
|
|
}
|
|
|
|
public static int? ProcessStart(string? fileName, string arguments, string? dir)
|
|
{
|
|
if (fileName.IsNullOrEmpty())
|
|
{
|
|
return null;
|
|
}
|
|
try
|
|
{
|
|
if (fileName.Contains(' '))
|
|
{
|
|
fileName = fileName.AppendQuotes();
|
|
}
|
|
if (arguments.Contains(' '))
|
|
{
|
|
arguments = arguments.AppendQuotes();
|
|
}
|
|
|
|
Process proc = new()
|
|
{
|
|
StartInfo = new ProcessStartInfo
|
|
{
|
|
UseShellExecute = true,
|
|
FileName = fileName,
|
|
Arguments = arguments,
|
|
WorkingDirectory = dir ?? string.Empty
|
|
}
|
|
};
|
|
_ = proc.Start();
|
|
return dir is null ? null : proc.Id;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static void RebootAsAdmin(bool blAdmin = true)
|
|
{
|
|
try
|
|
{
|
|
ProcessStartInfo startInfo = new()
|
|
{
|
|
UseShellExecute = true,
|
|
Arguments = Global.RebootAs,
|
|
WorkingDirectory = Utils.StartupPath(),
|
|
FileName = Utils.GetExePath().AppendQuotes(),
|
|
Verb = blAdmin ? "runas" : null,
|
|
};
|
|
_ = Process.Start(startInfo);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
}
|
|
|
|
public static async Task ProcessKill(int pid)
|
|
{
|
|
try
|
|
{
|
|
await ProcessKill(Process.GetProcessById(pid), false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
}
|
|
|
|
public static async Task ProcessKill(Process? proc, bool review)
|
|
{
|
|
if (proc is null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
GetProcessKeyInfo(proc, review, out var procId, out var fileName, out var processName);
|
|
|
|
try
|
|
{
|
|
if (Utils.IsNonWindows())
|
|
{
|
|
proc?.Kill(true);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
|
|
try
|
|
{
|
|
proc?.Kill();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
|
|
try
|
|
{
|
|
proc?.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
|
|
try
|
|
{
|
|
proc?.Dispose();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
|
|
await Task.Delay(300);
|
|
await ProcessKillByKeyInfo(review, procId, fileName, processName);
|
|
}
|
|
|
|
private static void GetProcessKeyInfo(Process? proc, bool review, out int? procId, out string? fileName, out string? processName)
|
|
{
|
|
procId = null;
|
|
fileName = null;
|
|
processName = null;
|
|
if (!review)
|
|
{
|
|
return;
|
|
}
|
|
try
|
|
{
|
|
procId = proc?.Id;
|
|
fileName = proc?.MainModule?.FileName;
|
|
processName = proc?.ProcessName;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
}
|
|
|
|
private static async Task ProcessKillByKeyInfo(bool review, int? procId, string? fileName, string? processName)
|
|
{
|
|
if (review && procId != null && fileName != null)
|
|
{
|
|
try
|
|
{
|
|
var lstProc = Process.GetProcessesByName(processName);
|
|
foreach (var proc2 in lstProc)
|
|
{
|
|
if (proc2.Id == procId)
|
|
{
|
|
Logging.SaveLog($"{_tag}, KillProcess not completing the job, procId");
|
|
await ProcessKill(proc2, false);
|
|
}
|
|
if (proc2.MainModule != null && proc2.MainModule?.FileName == fileName)
|
|
{
|
|
Logging.SaveLog($"{_tag}, KillProcess not completing the job, fileName");
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog(_tag, ex);
|
|
}
|
|
}
|
|
}
|
|
}
|