1.Windows提供了一个作业内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么。创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制。

2.如果进程已与一个作业关联,就无法将当前进程或者它的任何子进程从作业中去除。

3.默认情况下,在Windows Vista中通过Windows资源管理器来启动一个应用程序时,进程会自动同一个专用的作业关联,此作业的名称使用了“PCA”字符串前缀。一旦通过Windows资源管理器启动一个老版本的应用程序出现问题,就会触发Program Compatibility Assistant(程序兼容性助手)。

4.如果我们为应用程序定义了一个清单(manifest),Windows资源管理器就不会将我们的进程同带“PCA”前缀的作业关联,它会假定我们已经解决了任何可能出现的兼容问题。

5.但是在需要调试应用程序的时候,如果调试器时从Windows资源管理器启动的,即使我们的应用程序有一个清单,它也会从调试器继承带“PCA”前缀的作业。可以从命令行启动调试器来避开这个问题。

6.CreateJobObject用来创建一个新的作业内核对象,如果确定在自己的代码中不再访问作业对象,就必须调用CloseHandle来关闭它的句柄。而且这个动作不会迫使作业中的所有进程都终止运行。在作业中的所有进程都已终止运行之后,会自动销毁。但是注意,关闭作业句柄会导致所有进程都不可访问此作业,即使这个作业仍然存在。

7.创建好一个作业以后,可以向作业应用以下几种类型的限制:

  • 基本限额和扩展基本限额,用于防止作业中的进程独占系统资源。
  • 基本的UI限制,用于防止作业内的进程更改用户界面
  • 安全限额,用于防止作业内的进程访问安全资源(文件、注册表子项等)

8.可以通过调用SetInformationJobObject()函数向作业施加限制

SetInformationJobObject(
_In_ HANDLE hJob,
_In_ JOBOBJECTINFOCLASS JobObjectInformationClass,
_In_reads_bytes_(cbJobObjectInformationLength) LPVOID lpJobObjectInformation,
_In_ DWORD cbJobObjectInformationLength
);

可以设置以下限制:

9.作业中的进程可以调用QueryInformationJobObject获得其所属作业的相关信息,这使得进程能看到自己被施加了哪些限制,不过如果调用SetInformationJobObject时为作业句柄参数传递NULL值,会导致调用失败,目的是为了防止进程删除施加于自己身上的限制。

10.我们可以调用AssignProcessToJobObject()函数将进程显示地放入作业中。而且它的子进程也将属于这个作业的一部分,但是也可以通过修改JOBOBJECT_BASIC_LIMIT_INFORMATION的成员来控制脱离这个作业。

11.调用TerminateJobObject()可以杀死作业内部的所有进程。

12.作业中的进程如果尚未用完已分配的CPU时间,作业对象就处于未触发的状态(即使作业中还没有任何进程在运行),一旦已分配的CPU时间被用完,Windows就会强行杀死作业中的所有进程并触发作业对象。调用WaitForSingleObject可以轻松捕捉到这个事件。

13.当作业收到通知,得知一个新进程是在它的限制下创建时,GetModuleFileNameEx的调用会失败,因为在这个时候,地址空间尚未完全初始化,模块尚未与它建立映射。GetProcessImageFileName在这种极端情况下也能获取完整路径名,但是格式近似于我们在内核模式中看到的模式(\device\Harddisk\Volume1\Windows\System32\notepad.exe),而不是C:\Windows\System32\notepad.exe。而QueryFullProcessImageName在任何情况下都会返回我们预期的完整路径名。

Windows Internals 笔记——作业的更多相关文章

  1. Windows Internals 笔记——关联性

    1.默认情况下,Windows Vista在给线程分配处理器时,使用软关联.意思是如果其他因素都一样,系统将使线程在上一次运行的处理器上运行.让线程始终在同一个处理器上运行有助于重用仍在处理器高速缓存 ...

  2. Windows Internals 笔记——线程优先级

    1.每个线程都被赋予0(最低)~31(最高)的优先级数.当系统确定给哪个线程分配CPU时,它会首先查看优先级为31的线程,并以循环的方式进行调度.如果有优先级为31的线程可供调度,那么系统就会将CPU ...

  3. Windows Internals 笔记——线程调度

    1.线程内核对象中的CONTEXT反应了线程上一次执行时CPU寄存器的状态.大约每隔20ms,Windows都会查看所有当前存在的线程内核对象.Windows在可调度的线程内核对象中选择一个,并将上次 ...

  4. Windows Internals 笔记——线程

    1.进程有两个组成部分,一个进程内核对象和一个地址空间.线程也有两个组成部分: 一个是线程的内核对象,操作系统用它管理线程.系统还用内核对象来存放线程统计信息的地方. 一个线程栈,用于维护线程执行时所 ...

  5. Windows Internals 笔记——进程的权限

    1.大多数用户都用一个管理员账户来登录Windows,在Vista之前,这样的登录会创建一个安全令牌.每当有代码试图使用一个受保护的安全资源时,操作系统就会出示这个令牌.从包括Windows资源管理器 ...

  6. Windows Internals 笔记——CreateProcess

    1.一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1.然后系统为新进程的主线程创建一个线程内核对象(使其计数为1). 2.CreateProcess在进程完全初 ...

  7. Windows Internals 笔记——进程

    1.一般将进程定义成一个正在运行的程序的一个实例,由以下两部分构成: 一个内核对象,操作系统用它来管理进程,内核对象也是系统保存进程统计信息的地方. 一个地址空间,其中包含所有可执行文件或DLL模块的 ...

  8. Windows Internals 笔记——内核对象

    1.每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问.这个内存块是一个数据结构,其成员维护着与对象相关的信息. 2.调用一个会创建内核对象的函数后,函数会返回一个句柄,它标 ...

  9. Windows Internals 笔记——字符和字符串处理

    1.自Windows NT起,Windows的所有版本都完全用Unicode来构建,调用Windows函数时,如果向它传入一个ANSI字符串,那么函数首先会把字符串转换为Unicode,再把结果传给操 ...

随机推荐

  1. idea的一些好用的第三方插件

    用了Idea真的回不去Eclipse了,安利一波. 这里记录一些好用的插件. GenerateAllSetter 这个插件是用在写代码的时候调用Setter的时候能一次性把实体类中的所有Setter方 ...

  2. ABP拦截器之UnitOfWorkRegistrar(一)

    ABP中UnitOfWorkRegistrar拦截器是整个ABP中非常关键的一个部分,这个部分在整个业务系统中也是用的最多的一个部分,这篇文章的主要思路并不是写如何使用ABP中的UnitOfWork, ...

  3. mysql的时区错误问题: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one

    问题:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.. ...

  4. react性能优化

    前面的话 本文将详细介绍react性能优化 避免重复渲染 当一个组件的props或者state改变时,React通过比较新返回的元素和之前渲染的元素来决定是否有必要更新实际的DOM.当他们不相等时,R ...

  5. BM算法学习笔记

    一种nb算法,可以求出数列的递推式. 具体过程是这样的. 我们先假设它有一个递推式,然后按位去算他的值. ;j<now.size();++j)(delta[i]+=1ll*now[j]*f[i- ...

  6. 关于JavaScript(脚本语言)

    1.typeof运算符:判断一个对象是否是什么类型,返回“” 一.数字类型(Number) 1.javascript不擅长计算,不能用于浮点数的计算.如:var a = 0.2; var b = 0. ...

  7. 2019南昌邀请赛网络预选赛 M. Subsequence

    传送门 题意: 给出一个只包含小写字母的串 s 和n 个串t,判断t[i]是否为串 s 的子序列: 如果是,输出"YES",反之,输出"NO": 坑点: 二分一 ...

  8. Pandas系列(二)- DataFrame数据框

    一.初识DataFrame dataFrame 是一个带有索引的二维数据结构,每列可以有自己的名字,并且可以有不同的数据类型.你可以把它想象成一个 excel 表格或者数据库中的一张表DataFram ...

  9. Slow ReadProcessor&amp;Error Slow BlockReceiver错误日志分析(转)

    1.总结 "Slow ReadProcessor" 和"Slow BlockReceiver"往往是因为集群负载比较高或者某些节点不健康导致的,本文主要是帮助你 ...

  10. Entity Framework入门教程(18)---EF6中基于代码进行配置方式

    EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...