|
|
@@ -11,21 +11,7 @@ namespace Shadowsocks.Util.ProcessManagement |
|
|
|
*/ |
|
|
|
public class Job : IDisposable |
|
|
|
{ |
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] |
|
|
|
private static extern IntPtr CreateJobObject(IntPtr a, string lpName); |
|
|
|
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
|
|
private static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); |
|
|
|
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
|
|
private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); |
|
|
|
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
|
|
[return: MarshalAs(UnmanagedType.Bool)] |
|
|
|
private static extern bool CloseHandle(IntPtr hObject); |
|
|
|
|
|
|
|
private IntPtr handle = IntPtr.Zero; |
|
|
|
private bool disposed; |
|
|
|
|
|
|
|
public Job() |
|
|
|
{ |
|
|
@@ -62,24 +48,43 @@ namespace Shadowsocks.Util.ProcessManagement |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public bool AddProcess(IntPtr processHandle) |
|
|
|
{ |
|
|
|
var succ = AssignProcessToJobObject(handle, processHandle); |
|
|
|
|
|
|
|
if (!succ) |
|
|
|
{ |
|
|
|
Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); |
|
|
|
} |
|
|
|
|
|
|
|
return succ; |
|
|
|
} |
|
|
|
|
|
|
|
public bool AddProcess(int processId) |
|
|
|
{ |
|
|
|
return AddProcess(Process.GetProcessById(processId).Handle); |
|
|
|
} |
|
|
|
|
|
|
|
#region IDisposable |
|
|
|
|
|
|
|
private bool disposed; |
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
Dispose(true); |
|
|
|
GC.SuppressFinalize(this); |
|
|
|
} |
|
|
|
|
|
|
|
private void Dispose(bool disposing) |
|
|
|
protected virtual void Dispose(bool disposing) |
|
|
|
{ |
|
|
|
if (disposed) return; |
|
|
|
disposed = true; |
|
|
|
|
|
|
|
if (disposing) { } |
|
|
|
|
|
|
|
Close(); |
|
|
|
} |
|
|
|
if (disposing)
|
|
|
|
{ |
|
|
|
// no managed objects to free |
|
|
|
} |
|
|
|
|
|
|
|
private void Close() |
|
|
|
{ |
|
|
|
if (handle != IntPtr.Zero) |
|
|
|
{ |
|
|
|
CloseHandle(handle); |
|
|
@@ -87,28 +92,29 @@ namespace Shadowsocks.Util.ProcessManagement |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
~Job()
|
|
|
|
~Job() |
|
|
|
{ |
|
|
|
Dispose(false); |
|
|
|
} |
|
|
|
|
|
|
|
public bool AddProcess(IntPtr processHandle) |
|
|
|
{ |
|
|
|
var succ = AssignProcessToJobObject(handle, processHandle); |
|
|
|
#endregion |
|
|
|
|
|
|
|
if (!succ) |
|
|
|
{ |
|
|
|
Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); |
|
|
|
} |
|
|
|
#region Interop |
|
|
|
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] |
|
|
|
private static extern IntPtr CreateJobObject(IntPtr a, string lpName); |
|
|
|
|
|
|
|
return succ; |
|
|
|
} |
|
|
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
|
|
private static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); |
|
|
|
|
|
|
|
public bool AddProcess(int processId) |
|
|
|
{ |
|
|
|
return AddProcess(Process.GetProcessById(processId).Handle); |
|
|
|
} |
|
|
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
|
|
private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); |
|
|
|
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
|
|
[return: MarshalAs(UnmanagedType.Bool)] |
|
|
|
private static extern bool CloseHandle(IntPtr hObject); |
|
|
|
|
|
|
|
#endregion |
|
|
|
} |
|
|
|
|
|
|
|
#region Helper classes |
|
|
|