~Windows核心编程【5】小结

来源:互联网 发布:db2 v9.7 数据库导出 编辑:程序博客网 时间:2024/05/22 01:51

第五章 作业

1、Windows没有维护进程之间的父子关系。具体地说,即使父进程已经终止运行,子进程仍在继续运行。
2、Windows提供了一个作业内核对象,允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么。最好将作业对象想象成一个进程容器。这样就可以对一组进程进行管理了。
3、利用StartRestrictedProcess函数将一个进程放入一个作业中,以限制此进程具体能够做哪些事情。
4、利用IsProcessInJob可以来检验进程是否在一个现有的作业控制之下运行。如果已和一个作业关联,就无法将当前进程或者它的任何子进程从作业中去除。这个安全特性可以确保进程无法逃避作业对其施加的限制。
5、默认情况下,在Windows Vista中通过Windows资源管理器来启动的一个应用程序时,进程会自动同一个专用的作业关联,次作业的名称使用了“PCA”字符串前缀。Vista提供这个功能的目的是检测兼容性问题。所以,如果已经像进程章节描述的那样为应用程序定义了一个清单(manifest),Windows资源管理器就不会将进程同“PCA”前缀的作业关联,它会假设你已经解决了任何可能的兼容性问题。但是,如果调试器是从Windows资源管理器启动的,即使程序已有清单,也会从调试器继承带有“PCA”前缀的作业。一个简单的解决方案是从命令行而不是Windows资源管理器中启动调试器。
6、关闭一个作业对象,不会迫使作业中的所有进程都终止运行。作业对象实际只是加了个删除标记,只有在作业中的所有进程都已终止运行之后,才会自动销毁。


一、对作业中的进程施加限制

1、可以向作业应用如下几种类型的限制:
a、基本限制和扩展基本限制,防止作业中的进程独占系统资源。
b、基本的UI限制,防止作业内的进程更改用户界面。
c、安全限制,防止做业内的进程访问安全资源(文件、注册表子项等)。
2、可以通过调用SetInformationJobObject函数来向作业应用限制。


二、将进程放入作业中

1、在对作业施加了某些限制之后,通过调用CreateProcess来生成打算放到作业中的进程。但要注意,调用CreateProcess时,使用的是CREATE_SUSPENDED标志。由于StartRestrictedProcess函数是从不属于作业一部分的进程中执行的,所以子进程也不是作业的一部分。如果允许子进程立即开始执行代码,它将会“逃离”沙箱。所以,在创建此子进程之后且在允许它允许之前,必须调用以下函数,将进程显示地放入新建的作业中:AssignProcessToJobObject。
2、当作业中的一个进程生成了另一个进程的时候,新进程将自动成为父进程所属于的作业的一部分。但可以通过以下方式改变:打开JOBOBJECT_BASIC_LIMIT_INFORMATION的LimitFlags成员的JOB_OBJECT_LIMIT_BREAKAWAY_OK或者JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK标志,告诉系统新生成的进程可以在作业执行。但是两者有所不同。前者适用于希望由一个新生成的进程来控制作业,后者适用于在设计之初对作业对象一无所知。
3、在挂起子进程,并且调用了AssignProcessToJobObject之后,调用ResumeThread恢复子进程。


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

1、要杀死作业内部的所有进程,只需调用以下函数:TerminateJobObject。这类似于为作业内的每个进程调用TerminateProcess,将所有退出代码设为uExitCode。
2、QueryInformationJobObject函数可以用来查询作业当前的限制和统计信息。


四、作业通知
五、Job Lab实例程序

(第一遍浏览就让人纠结。。第二遍浏览待续···)

原创粉丝点击