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
{
[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


Loading…
Cancel
Save