1. 内核对象
Windows中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进行访问,应用程序不能在内存中定位这些数据结构并直接更改其内容。这个内存块是一个数据结构,其成员维护着与对象相关的信息。少数成员(安全描述符和使用计数)是所有内核对象都有的,但大多数成员都是不同类型对象特有的。
2. 内核对象的使用计数与生命期
内核对象的所有者是操作系统内核,而非进程。换言之也就是说当进程退出,内核对象不一定会销毁。操作系统内核通过内核对象的使用计数,知道当前有多少个进程正在使用一个特定的内核对象。初次创建内核对象,使用计数为1。当另一个进程获得该内核对象的访问权之后,使用计数加1。如果内核对象的使用计数递减为0,操作系统内核就会销毁该内核对象。也就是说内核对象在当前进程中创建,但是当前进程退出时,内核对象有可能被另外一个进程访问。这时,进程退出只会减少当前进程对引用的所有内核对象的使用计数,而不会减少其他进程对内核对象的使用计数(即使该内核对象由当前进程创建)。那么内核对象的使用计数未递减为0,操作系统内核不会销毁该内核对象。示例如下:
(1)进程1退出,2不退出时。内核对象A,B的引用计数减为0,被操作系统内核销毁,而进程1只减少自身对C,D的引用计数,不会影响进程2对C,D的引用计数,此时C,D引用计数不为0,不会被销毁。
(2)进程2退出,1不退出时。进程2减少自身对C,D的引用计数,不会影响进程1,故A,B,C,D都不会被销毁
(3)进程1,2均退出时,内核对象A,B,C,D的引用计数均递减为0,被内核销毁
(4)进程1和2均为退出时,内核对象A,B,C,D的引用计数只要有一个递减为0,那么递减为0的内核对象便被内核销毁
3. 操作内核对象
Windows提供了一组函数进行操作内核对象。成功调用一个创建内核对象的函数后,会返回一个句柄,它表示了所创建的内核对象,可由进程中的任何线程使用。在32位进程中,句柄是一个32位值,在64位进程中句柄是一个64位值。我们可以使用唯一标识内核对象的句柄,调用内核操作函数对内核对象进行操作。
3. 内核对象与其他类型的对象
Windows进程中除了内核对象还有其他类型的对象,比如窗口,菜单,字体等,这些属于用户对象和GDI对象。要区分内核对象与非内核对象,最简单的方式就是查看创建这个对象的函数,几乎所有创建内核对象的函数都有一个允许我们指定安全属性的参数。