对作业中的进程施加限制
代码示例
// 设置作业的一些基本限制
JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = { 0 };
jobli.PriorityClass = IDLE_PRIORITY_CLASS; // 作业的优先级数
jobli.PerJobUserTimeLimit.QuadPart = 10000; // 作业的用户态执行时间
// 这里的Flags将决定了结构体中的哪些成员生效
jobli.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS
| JOB_OBJECT_LIMIT_JOB_TIME;
// 真正的将限制实施在作业内核对象上
SetInformationJobObject(hjob, JobObjectBasicLimitInformation, &jobli,
sizeof(jobli));
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;
PerProcessUserTimeLimit
- 作业内核对象每个进程用户态的执行时间限制
PerJobUserTimeLimit
- 作业内核对象用户态的执行时间限制(作业内核对象中所有进程总共的时间)
LimitFlags
- 标记结构体
JOBOBJECT_BASIC_LIMIT_INFORMATION
中哪些成员生效
- 标记结构体
MinimumWorkingSetSize
- 作业内核对象中进程的工作集最小限制
- 如果
MaximumWorkingSetSize
非0,则MinimumWorkingSetSize
也必须非0
MaximumWorkingSetSize
- 作业内核对象中进程的工作集最大限制
- 如果进程的工作集超过了这个限制,则会发生页面转换
- 如果
MinimumWorkingSetSize
非0,则MaximumWorkingSetSize
也必须非0
PriorityClass
- 作业内核对象中进程的优先级数
- 进程和线程不允许改变他们的优先级数,所以调用进程必须拥
SE_INC_BASE_PRIORITY_NAME
的权限
代码示例
// 设置作业的UI限制
JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;
jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE;
// 作业中的进程不能注销系统(比如使用ExitWindows或ExitWindowsEx)
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_EXITWINDOWS;
// 作业中的进程不能访问被其它作业中进程使用的句柄
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;
// 真正的将限制实施在作业内核对象上
SetInformationJobObject(hjob, JobObjectBasicUIRestrictions, &jobuir,
sizeof(jobuir));
JOBOBJECT_BASIC_UI_RESTRICTIONS
typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
DWORD UIRestrictionsClass;
} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
UIRestrictionsClass
- 作业内核对象基本用户界面的限制
- 值得注意的是该参数的类型为
DWORD
,通过位运算来设置限制。
标志参数与作用如下
标志 | 描述 |
---|---|
JOB_OBJECT_UILIMIT_NONE | 什么也没用,只是大多数情况用于初始化的时候 |
JOB_OBJECT_UILIMIT_EXITWINDOWS | 阻止作业中的进程通过ExitWindowsEx 注销,关机,重启,断开系统电源 |
JOB_OBJECT_UILIMIT_HANDLES | 阻止作业中的进程使用其它作业中的进程所拥有的用户对象句柄 |
… | … |