windows核心编程之作业

为了大家熟悉作业,我先介绍一下作业:
大家都知道,进程没有活性,只是线程的容器,那么我也可以类比一下,作业时什么,作业是进程的容器
由于windows的机制及其复杂,若一个进程生成了无数的子进程,我们能否在关闭父进程的同时关闭所有的子进程呢,答案是不能,子进程在生成的那一刻就已不受父进程的控制,所以无法控制这个过程,但是使用”作业”可以

HANDLE CreateJobObject(
LPSECURITY_ATTRIBUTES lpJobAttributes, // 安全属性
LPCTSTR lpName // 作业对象的名称
);
lpJobAttributes可以设置安全描述符,以及这个句柄是否可以被继承
lpName作业对象的名字,若给作业对象命了名则可以在另外一个进程中使用OpenJobObject打开这个作业对象的内核,获得其句柄

HANDLE OpenJobObject(
DWORD dwDesiredAccess, // 所需要的权限
BOOL bInheritHandles, // 该句柄是否可以被子进程继承
LPCTSTR lpName // 作业名称
);
dwDesiredAccess:一般可以写JOB_OBJECT_ALL_ACCESS就可以,若有特殊需求,需要查看msdn
bInheritHandles:是否可以被继承,若不想该句柄被继承就写false,否则写true
lpName:作业对象的名称
返回值,若成功返回作业对象的句柄,否则返回NULL
//但是,已经命名的作业对象不能使用CloseHandle关闭其句柄,一旦关闭,虽然作业对象还在,但是你命名的名字会与作业对象失去联系

BOOL AssignProcessToJobObject(
HANDLE hJob, // 作业对象的句柄
HANDLE hProcess // 进程的句柄
);
这个函数主要是把进程放到作业中,一看就懂,不用我说明了

BOOL SetInformationJobObject(
HANDLE hJob, // 作业对象的句柄
JOBOBJECTINFOCLASS JobObjectInfoClass, // 作业对象的信息类型
LPVOID lpJobObjectInfo, // 限制信息
DWORD cbJobObjectInfoLength // 限制信息的大小
);
JobObjectInfoClass:这里有一张msdn的表
这里写图片描述
lpJobObjectInfo:上表的右边结构的对象的对应指针
cbJobObjectInfoLength:上表的右边结构的对象的大小
总共有6中信息限制类型
先来看看基本信息限制的成员
这里写图片描述

这里写图片描述
表中详细描述了,设置相应的成员LimitFlags需要设置的的特殊标志,例如设置SchedulingClass成员的数值,需要在LimitFlags的标志中添加LIMIT_SCHEDULING_CLASS这个宏等等
JOB_OBJECT_LIMIT_ACTIVE_PROCESS:设置ActiveProcessLimit成员需要设置的标志
JOB_OBJECT_LIMIT_AFFINITY:让作业中的所有进程具有相同的亲缘性
JOB_OBJECT_LIMIT_BREAKAWAY_OK:可让新生成的子进程与JobObject脱离联系,但是需要在CreateProcess时设置相应的标志
JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION:相当于为每个进程调用SetErrorMode,并传递SEM_NOGPFAULTERRORBOX 参数
JOB_OBJECT_LIMIT_JOB_MEMORY:设置扩展限制的JobMemoryLimit属性时需要设置此标志
JOB_OBJECT_LIMIT_JOB_TIME:设置基本限制的PerJobUser属性时需要设置此标志
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE:设置此值时,当作业对象的最后一个句柄被关闭时,所有的进程都将结束
JOB_OBJECT_LIMIT_PRIORITY_CLASS:当设置PriorityClass的值时,需要设置此标志
JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME:这个标志与JOB_OBJECT_LIMIT_JOB_TIME是互斥的,使用这个标志,CPU的统计信息不会减去已经终止运行的进程CPU的统计信息
JOB_OBJECT_LIMIT_PROCESS_MEMORY:设置扩展限制信息的ProcessMemoryLimit成员时,需要设定此标志
JOB_OBJECT_LIMIT_PROCESS_TIME:设置PerProcessUserTimeLimit成员时需要设置此标志
JOB_OBJECT_LIMIT_SCHEDULING_CLASS :设置SchedulingClass成员时需要设置此标志
JOB_OBJECT_LIMIT_WORKINGSET:设置MinimumWorkingSetsize和MaximumWorkingSetsize需要设置此标志
JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK:可让新生成的子进程与JobObject脱离联系,但是不同的是CreateProcess时不需要做特殊设置

UI限制
这里写图片描述
利用这些信息,可以制作一个程序的沙箱
QueryInformationJobObject的使用方式和SetInformationJobObject基本一样
JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION结构可以查询基本统计信息和I/O统计信息
JOBOBJECT_BASIC_PROCESS_ID_LIST结构可以用来查询作业内核对象中的ID列表
利用JOBOBJECT_ASSOCIATE_COMPLETION_PORT结构可以用来将完成端口和作业对象联系起来
g_hIocp = CreateIoCompletionPort((HANDLE)(-1), 0, 0, 0);
JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp;
joacp.CompletionKey = (void*)1;
joacp.CompletionPort = g_hIocp;
suc=SetInformationJobObject(g_job, JobObjectAssociateCompletionPortInformation, &joacp, sizeof(joacp));
GetQueuedCompletionStatus(HANDLE hIocp,PDWORD pNumBytesTransferred,PULONG_PTR pCompletionKey,POVERLAPPED* pOverlapped,DWORD dwMillSeconds);
pCompletionKey:调用SetInformationJobObject时设置的关键字
pNumBytesTransferred:用于指明发生了什么关键字
*pOverlapped的值表示线程ID
这里写图片描述
附上例子
windows核心编程Joblab例子
等上传完成我再附上链接

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值