windows核心编程--作业相关

1、概述:

Windows提供了一个作业内核对象,就可以认为作业对象是一个进程容器,通过这个对象来对属于他的所有进程来进行控制。

从命令行启动的程序不会与作业相关联,但是要是从Windows资源管理器中启动一个应用程序时,进程会自动同一个专业的作业关联,这个作业的名称使用“PCA”字符串前缀。

2、简单关于实现:

第一:验证当前进程是否在一个现有的作业控制之下运行,使用函数IsProcessInJob,并给这个函数的第二个参数传入NULL。

第二:创建一个新的作业内核对象,使用函数CreateJobObject。

第三:进程通过OpenJobObject函数来对作业对象进程访问,接受作业对象的控制。

第四:最后确定自己的代码不再访问作业对象了,必须关闭作业句柄,通过函数CloseHandle。

最后需要注意:关闭作业对象句柄不会致使作业中的所有进程都立刻终止运行,但是一旦关闭作业对象句柄会导致立刻导致所有的进程都不可以访问此作业,当且只当作业中的所有进程都终止运行之后,作业就也必须立刻销毁。

3、对作业中的进程施加限制具体实现

创建好一个作业,紧接着要对作业中的进程创建一个所谓的“沙箱”来对进程进行限制,可以通过SetInfomationJobObject函数来实现。

下面是三种限制:

第一:基本限额和扩展基本限额

第二:基本的UI限制

第三:安全限制

同时,进程可以其所属作业的相关信息,也就是说可以看到这个进程被施加了那些个限制,通过函数QueryInfomationJobObject来实现。

4、将进程放入作业中

 注意:当想通过CreateProcess函数来创建一个新进程时,要注意把这个进程放入作业,

首先:就要判断使用函数IsProcessInJob来得到一个进程是否“有业”?

其次:为了让一个刚刚创建的进程“有业”,就要在这个进程运行之前,通过函数AssignProcessToJobObject来显式地放入一个作业之中。

最后:可以通过参数设置,来实现,*新生成的进程可以在作业外部实现,这样就可以通过新生成的进程来控制作业;*使新生成的进程强制脱离当前作业。

5、终止作业中的所有线程

 要“杀死”作业内部所有的进程,可以调用函数TerminateProcess。

6、查询作业统计信息

查询作业的相关信息:可以通过性能助手函数库(PDH.dll)中的函数来获得。

                                        可以通过管理工具中的性能监视器来查看。

                                        可以使用Process Explorer来查看。

                                        所有可以想到的信息还是调用函数QueryInfomationJobObject来实现,仅仅是传入的参数不同。

查询不属于作业的进程的相关信息:获得一个进程的CPU占用时间使用函数GetProcessTimes。

                                                         获得进程相关信息可以使用函数GetProcessIOCount。

7、作业通知

 就是通过函数获得,作业更“高级”的一些个问题,比如,作业中的进程更详细的信息。

通过创建I/O完成端口,并把这个端口和作业对象关联起来,就可以来监视来自作业的通知。

你可能感兴趣的:(windows核心编程--作业相关)