public static JobHandle CreateJob(Kernel32.SecurityAttributes jobAttributes, string name) { JobHandle jobHandle = Kernel32.CreateJobObject(jobAttributes, name); if (jobHandle.IsInvalid) { throw new Win32Exception(Marshal.GetLastWin32Error()); } return(jobHandle); }
public KillChildProcessJob() { //Return if the windows version is lower or equal to win7 if (!IsSupportedWindowsVersion) { throw new NotSupportedException("KillChildProcessJob is not supported in your windows version."); } //Create default security attributes var securityAttributes = new Kernel32.SecurityAttributes { length = (uint)Marshal.SizeOf <Kernel32.SecurityAttributes>() }; //Create a job handle _jobHandle = JobHandle.CreateJob(securityAttributes, "DM_KCP_" + Guid.NewGuid()); //Create basic limit infos var jobBasicLimitInformation = new Kernel32.JobObjectBasicLimitInformation() { LimitFlags = Kernel32.JobObjectlimit.KillOnJobClose }; //Create extended limit infos var jobExtendedLimitInformation = new Kernel32.JobObjectExtendedLimitInformation() { BasicLimitInformation = jobBasicLimitInformation }; //Set the information for the job handle int length = Marshal.SizeOf <Kernel32.JobObjectExtendedLimitInformation>(); IntPtr jobExtendedLimitInformationHandle = Marshal.AllocHGlobal(length); try { Marshal.StructureToPtr(jobExtendedLimitInformation, jobExtendedLimitInformationHandle, false); _jobHandle.SetInformation(Kernel32.JobObjectInfoType.ExtendedLimitInformation, jobExtendedLimitInformationHandle, (uint)length); } finally { Marshal.FreeHGlobal(jobExtendedLimitInformationHandle); } }