Browse Source

Misc

Signed-off-by: Syrone Wong <wong.syrone@gmail.com>
tags/3.3.4
Syrone Wong 8 years ago
parent
commit
90ae73057e
1 changed files with 41 additions and 35 deletions
  1. +41
    -35
      shadowsocks-csharp/Util/ProcessManagement/Job.cs

+ 41
- 35
shadowsocks-csharp/Util/ProcessManagement/Job.cs View File

@@ -11,21 +11,7 @@ namespace Shadowsocks.Util.ProcessManagement
*/ */
public class Job : IDisposable 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 IntPtr handle = IntPtr.Zero;
private bool disposed;


public Job() 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() public void Dispose()
{ {
Dispose(true); Dispose(true);
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }


private void Dispose(bool disposing)
protected virtual void Dispose(bool disposing)
{ {
if (disposed) return; if (disposed) return;
disposed = true; disposed = true;


if (disposing) { }

Close();
}
if (disposing)
{
// no managed objects to free
}


private void Close()
{
if (handle != IntPtr.Zero) if (handle != IntPtr.Zero)
{ {
CloseHandle(handle); CloseHandle(handle);
@@ -87,28 +92,29 @@ namespace Shadowsocks.Util.ProcessManagement
} }
} }


~Job()
~Job()
{ {
Dispose(false); 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 #region Helper classes


Loading…
Cancel
Save