-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGameManager.cs
More file actions
72 lines (57 loc) · 2.1 KB
/
GameManager.cs
File metadata and controls
72 lines (57 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Management;
using System.Text.RegularExpressions;
namespace Fallout76Proxy
{
class GameManager
{
readonly string processName;
public GameManager(string processName)
{
this.processName = processName;
}
public void WaitFor()
{
Process[] processes;
do
{
processes = Process.GetProcessesByName(processName);
}
while (processes.Count() == 0);
}
public void RestartAsChild()
{
Process[] processes = Process.GetProcessesByName(processName);
if (processes.Count() == 0)
throw new NotStartedException($"For some reason {processName} not started.");
if (processes.Count() > 1)
throw new TooManyStartedException($"Too many {processName} launched. Stop others!");
Regex regex = new Regex("\"(.+?)\"\\s(.+)");
Match match = regex.Match(GetCommandLine($"{processName}.exe"));
processes.First().Kill();
if (match.Groups.Count == 0)
throw new StrangeArguments($"For some reason {processName} have no token!");
string TargetPath = match.Groups[1].Value;
string TargetArguments = match.Groups[2].Value;
Directory.SetCurrentDirectory(Path.GetDirectoryName(TargetPath));
Process process = new Process();
process.StartInfo.FileName = TargetPath;
process.StartInfo.Arguments = TargetArguments;
process.Start();
}
string GetCommandLine(string processName)
{
ManagementClass mngmtClass = new ManagementClass("Win32_Process");
foreach (ManagementObject o in mngmtClass.GetInstances())
{
if (o["Name"].Equals(processName))
{
return (string)o["CommandLine"];
}
}
throw new NotStartedException($"Can't get {processName} arguments");
}
}
}