Windows内核之作业
1 定义:
作业是一种内核对象,它相当于一个容器,里面可以加入很多进程,通过配置作业,可以让作业内的进程具有相同的配置,例如进程的最大执行时间,cpu片占用时间等。
2 作业的创建相关函数
HANDLE CreateJobObject(LPSECURITY_ATTRIBUTESlpJobAttributes,LPCTSTR lpName); HANDLE OpenJobObject(DWORD dwDesiredAccessBOOL bInheritHandles,LPCTSTR lpName);
3 对作业中进程中的限制
BOOL SetInformationObject(HANDLEhJob,JOBOBJECTINFOCLASS JobObjectInfoClass LPVOID lpJobInfo DWORDcbJobObjectInfoLength );
通过对作业设置限制条件,便可以做到对作业中进程的统一限制。作业中进程的限制有四种,如下所示:
3.1 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;
<1> 设置每个进程的用户模式的最大时间限制
<2>设定作业中可以使用多少用户模式的时间
<3>指定哪些限制标记是有效用的
<4>设定作业中所有进程的最小工作集的大小
<5>设定作业中所有进程的最大工作集的大小
<6>设定作业中可以运行的最大进程的数量
<7>设定能够运行进程的CPU子集
<8>设定所有进程的优先级
<9>设定分配给作业中的相对时间差,用来处理异常的进程情况。
3.2 JOBOBJECT_EXTENDED_LIMIT_INFORMATIO
typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION { JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; IO_COUNTERS IoInfo; SIZE_T ProcessMemoryLimit; SIZE_T JobMemoryLimit; SIZE_T PeakProcessMemoryUsed; SIZE_T PeakJobMemoryUsed; } JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
<1> 包含基本的限制信息
<2> 保留
<3> 设置每个内存的内存限制
<4> 设置每个工作的内存限制
<5> 指明所有进程中已经使用内存的最大的
<6> 指明所有进程已经是用的内存的最大值
3.3 JOBOBJECT_BASIC_UI_RESTRICTIONS
typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS { DWORD UIRestrictionsClass; } JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
这个结构体只有一个参数,目的就是制定UI的限制类别。主要是一写禁止复制黏贴,等的UI限制
3.4 JOBOBJECT_SECURITY_LIMIT_INFORMATION
typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION { DWORD SecurityLimitFlags ; HANDLE JobToken ; PTOKEN_GROUPS SidsToDisable ; PTOKEN_PRIVILEGES PrivilegesToDelete ; PTOKEN_GROUPS RestrictedSids ; } JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;<1> 指明是否不允许管理员访问、不允许无限制的标记访问、强制使用特定的访问标记,或者停用某些安全性标识符和优先权
<2>指向代表用户的主标记的句柄
<3>指明为访问检查停用哪些SID
<4>指明要从访问标记中删除哪些优先权
<5>指明应该添加给访问标记的一组仅为拒绝(deny only)的SID
4 查询限制条件
BOOL QueryInformationJobObject( HANDLE hJob, // handle to job JOBOBJECTINFOCLASS JobObjectInfoClass, // information class LPVOID lpJobObjectInfo,// limit information DWORD cbJobObjectInfoLength,// limit information size LPDWORD lpReturnLength / /data written);
通过这个函数可以查询作业的限制条件。
5 将进程放入作业
BOOL AssignProcessToJobObject( HANDLE hJob, // handle to job HANDLE hProcess // handle to process);当进程产生新的进程的时候,子进程会自动成为父进程作业的一部分
6 终止作业中所有进程的运行
BOOL TerminateJobObject( HANDLE hJob, // handle to job UINT uExitCode // exit code);
通过此函数来使作业中的所有进程停止运行。