作业对象的基本方法
1、调用CreateJobObject创建一个作业
2、调用AssignProcessToObject方法可以将进程添加到作业对象中
3、调用TerminateJobObject方法可以将作业对象中所有的进程全部关闭
4、在需要时还可以通过OpenJobObject方法打开一个特定名称的作业对象的句柄
1、通过SetInformationJobObject向作业中施加限制
自己学习的参考视频: 点击打开链接
2、JOBOBJECT_BASIC_LIMIT_INFORMATION结构体
1、调用CreateJobObject创建一个作业
2、调用AssignProcessToObject方法可以将进程添加到作业对象中
3、调用TerminateJobObject方法可以将作业对象中所有的进程全部关闭
4、在需要时还可以通过OpenJobObject方法打开一个特定名称的作业对象的句柄
1、通过SetInformationJobObject向作业中施加限制
自己学习的参考视频: 点击打开链接
BOOL WINAPI SetInformationJobObject(
_In_ HANDLE hJob, //指定要限制的作业
_In_ JOBOBJECTINFOCLASS JobObjectInfoClass, //枚举类型,即要施加限制的类型
_In_ LPVOID lpJobObjectInfo, //数据结构的地址
_In_ DWORD cbJobObjectInfoLength //数据结构的大小
);
2、JOBOBJECT_BASIC_LIMIT_INFORMATION结构体
typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
LARGE_INTEGER PerProcessUserTimeLimit;
LARGE_INTEGER PerJobUserTimeLimit;
DWORD LimitFlags;
SIZE_T MinimumWorkingSetSize;
SIZE_T MaximumWorkingSetSize;
DWORD ActiveProcessLimit;
ULONG_PTR Affinity;
DWORD PriorityClass;
DWORD SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
#include<windows.h>
#include<tchar.h>
#include<Strsafe.h>
/*
这个函数实现,将进程放入作业(job)中,以限制此进程具体能够做哪些事情
*/
void StartRectrictedProcess()
{
BOOL bInJob = FALSE;
IsProcessInJob(GetCurrentProcess(),NULL,&bInJob); //验证当前进程是否在一个现有的作业控制下工作,第二个参数是hJob,NULL默认当前进程
if (bInJob)
{
MessageBox(NULL,L"Process is in Job!",TEXT(""),MB_ICONINFORMATION | MB_OK);
return;
}
HANDLE hJob = CreateJobObject(NULL,TEXT("Wintellect_RestrictedProcessInJob"));//创建一个job句柄,第一个参数为安全描述符
JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = {0};//First set some basic restrictions
jobli.PriorityClass = IDLE_PRIORITY_CLASS; //此优先级表示进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断
jobli.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS | JOB_OBJECT_LIMIT_JOB_TIME;
jobli.PerJobUserTimeLimit.QuadPart = 10000; //job不能运行超过1s的CPU时间
SetInformationJobObject(hJob,JobObjectBasicLimitInformation,&jobli,sizeof(jobli));
JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir; //Second set some ui restrictions
jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE; //初始0
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_EXITWINDOWS; //process can't log off the windows
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;//不允许其他用户访问
SetInformationJobObject(hJob,JobObjectBasicUIRestrictions,&jobuir,sizeof(jobuir));
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
TCHAR szCmdLine[8];
_tcscpy_s(szCmdLine,_countof(szCmdLine),TEXT("CMD"));
BOOL bResult = CreateProcess(NULL,szCmdLine,NULL,NULL,FALSE,CREATE_SUSPENDED | CREATE_NEW_CONSOLE,NULL,
NULL,&si,&pi);
//把进程装入Job中
AssignProcessToJobObject(hJob,pi.hProcess);
//让子进程执行代码
ResumeThread(pi.hThread);
CloseHandle(pi.hThread);
//等待进程结束或者所有JOB的CPU时间耗尽
HANDLE h[2];
h[0] = pi.hProcess;
h[1] = hJob;
DWORD dw = WaitForMultipleObjects(2,h,FALSE,INFINITE);
switch (dw - WAIT_OBJECT_0)
{
case 0:
//The Process has terminate
break;
case 1:
//All of the job's allotted CPU time was used
break;
}
FILETIME CreationTime;
FILETIME ExitTime;
FILETIME KernelTime;
FILETIME UserTime;
TCHAR szInfo[MAX_PATH];
GetProcessTimes(pi.hProcess,&CreationTime,&ExitTime,&KernelTime,&UserTime);
StringCchPrintf(szInfo,_countof(szInfo),
TEXT("Kernel=%u | User=%u\n"),KernelTime.dwLowDateTime/1000,UserTime.dwLowDateTime/1000);
MessageBox(GetActiveWindow(),szInfo,TEXT("Restricted Process times"),MB_ICONINFORMATION | MB_OK);
CloseHandle(pi.hProcess);
CloseHandle(hJob);
}
int _tmain()
{
StartRectrictedProcess();
_gettchar();
return 0;
}