内核对象概述
- Windows操作系统分为Ring3和Ring0层
- Ring3层是全开放的, 无监管的
- Ring0层是有监管的
- 是操作系统以及软件正在运行的地方
- 在软件运行的时候, 我们正真的操作都是在Ring0发生的
- 可通过WinAPI向Ring0层发送请求
- 当Ring0层检测到这是一个合理的请求时,内核对象会被Ring0层进行改变
- 通过句柄可以操作Ring0层指定的内核对象
- 但是句柄不代表Ring0层的某个具体的内核对象
- 句柄的值是不透明的, 无人知道它代表了什么意思
- 句柄是属于当前进程的
使用计数
- 每一个内核对象中, 都会有一个使用计数
- 内核对象是属于操作系统的
- 内核对象属于全局的,不同进程可以使用同一个内核对象
- 但是进程不能决定任何一个内核对象的生死
内核对象的生死却是由操作系统来决定
- 当内核对象没有意义的时候, 操作系统会清理内核对象以节约资源
- 但是Ring0和Ring3又无法交互
- 所以使用计数出现了
- 使用计数会在使用的时候+1, 在不使用的时候-1
- 当使用计数为0时, 操作系统会对内核对象进行回收
- 回收不是实时的, 是当系统空闲的时候, 优先来清理的
使用计数使得内核对象可以被多个进程所拥有, 并且能正确的释放
句柄表以及句柄的本质
- 先前也说过,我们可以通过句柄来操作内核对象,但句柄不代表内核对象本身,当一个句柄走出了一个进程,就毫无意义.
- 句柄是属于进程的,它存在于进程的句柄表中.通常创建一个内核对象的情景是,先在ring0中创建了一个内核对象,